diff --git a/Content.Client/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs b/Content.Client/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs new file mode 100644 index 00000000000..f9427362a66 --- /dev/null +++ b/Content.Client/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs @@ -0,0 +1,7 @@ +using Content.Shared.Nyanotrasen.Item.PseudoItem; + +namespace Content.Client.Nyanotrasen.Item.PseudoItem; + +public sealed class PseudoItemSystem : SharedPseudoItemSystem +{ +} diff --git a/Content.Client/StationRecords/GeneralStationRecordConsoleWindow.xaml.cs b/Content.Client/StationRecords/GeneralStationRecordConsoleWindow.xaml.cs index 0f793238d59..76db55937ee 100644 --- a/Content.Client/StationRecords/GeneralStationRecordConsoleWindow.xaml.cs +++ b/Content.Client/StationRecords/GeneralStationRecordConsoleWindow.xaml.cs @@ -24,10 +24,12 @@ public sealed partial class GeneralStationRecordConsoleWindow : DefaultWindow private bool _isPopulating; private StationRecordFilterType _currentFilterType; + [Dependency] private readonly IPrototypeManager _prototype = default!; // Frontier public GeneralStationRecordConsoleWindow() { RobustXamlLoader.Load(this); + IoCManager.InjectDependencies(this); // Frontier _currentFilterType = StationRecordFilterType.Name; @@ -178,10 +180,21 @@ private void PopulateJobsContainer(IReadOnlyDictionary, in JobListing.RemoveAllChildren(); foreach (var (job, amount) in jobList) { + // Skip overflow jobs. + if (amount < 0 || amount is null) + continue; + + // Get proper job names when possible + string jobName; + if (_prototype.TryIndex(job, out var jobProto)) + jobName = jobProto.LocalizedName; + else + jobName = job; + var jobEntry = new JobRow { Job = job, - JobName = { Text = job }, + JobName = { Text = jobName }, JobAmount = { Text = amount.ToString() }, }; jobEntry.DecreaseJobSlot.OnPressed += (args) => { OnJobSubtract?.Invoke(args); }; diff --git a/Content.Client/_EstacaoPirata/Cards/Card/CardSystem.cs b/Content.Client/_EstacaoPirata/Cards/Card/CardSystem.cs new file mode 100644 index 00000000000..edabed31bca --- /dev/null +++ b/Content.Client/_EstacaoPirata/Cards/Card/CardSystem.cs @@ -0,0 +1,86 @@ +using System.Linq; +using Content.Shared._EstacaoPirata.Cards.Card; +using Robust.Client.GameObjects; +using Robust.Shared.Utility; + +namespace Content.Client._EstacaoPirata.Cards.Card; + +/// +/// This handles... +/// +public sealed class CardSystem : EntitySystem +{ + [Dependency] private readonly SpriteSystem _spriteSystem = default!; + /// + public override void Initialize() + { + SubscribeLocalEvent(OnComponentStartupEvent); + SubscribeNetworkEvent(OnFlip); + } + + private void OnComponentStartupEvent(EntityUid uid, CardComponent comp, ComponentStartup args) + { + if (!TryComp(uid, out SpriteComponent? spriteComponent)) + return; + + for (var i = 0; i < spriteComponent.AllLayers.Count(); i++) + { + //Log.Debug($"Layer {i}"); + if (!spriteComponent.TryGetLayer(i, out var layer) || layer.State.Name == null) + continue; + + var rsi = layer.RSI ?? spriteComponent.BaseRSI; + if (rsi == null) + continue; + + //Log.Debug("FOI"); + comp.FrontSprite.Add(new SpriteSpecifier.Rsi(rsi.Path, layer.State.Name)); + } + + comp.BackSprite ??= comp.FrontSprite; + Dirty(uid, comp); + UpdateSprite(uid, comp); + } + + private void OnFlip(CardFlipUpdatedEvent args) + { + if (!TryComp(GetEntity(args.Card), out CardComponent? comp)) + return; + UpdateSprite(GetEntity(args.Card), comp); + } + + private void UpdateSprite(EntityUid uid, CardComponent comp) + { + var newSprite = comp.Flipped ? comp.BackSprite : comp.FrontSprite; + if (newSprite == null) + return; + + if (!TryComp(uid, out SpriteComponent? spriteComponent)) + return; + + var layerCount = newSprite.Count(); + + //inserts Missing Layers + if (spriteComponent.AllLayers.Count() < layerCount) + { + for (var i = spriteComponent.AllLayers.Count(); i < layerCount; i++) + { + spriteComponent.AddBlankLayer(i); + } + } + //Removes extra layers + else if (spriteComponent.AllLayers.Count() > layerCount) + { + for (var i = spriteComponent.AllLayers.Count() - 1; i >= layerCount; i--) + { + spriteComponent.RemoveLayer(i); + } + } + + for (var i = 0; i < newSprite.Count(); i++) + { + var layer = newSprite[i]; + spriteComponent.LayerSetSprite(i, layer); + } + } +} diff --git a/Content.Client/_EstacaoPirata/Cards/CardSpriteSystem.cs b/Content.Client/_EstacaoPirata/Cards/CardSpriteSystem.cs new file mode 100644 index 00000000000..f0372aaa3b3 --- /dev/null +++ b/Content.Client/_EstacaoPirata/Cards/CardSpriteSystem.cs @@ -0,0 +1,84 @@ +using System.Linq; +using Content.Shared._EstacaoPirata.Cards.Stack; +using Robust.Client.GameObjects; + +namespace Content.Client._EstacaoPirata.Cards; + +/// +/// This handles... +/// +public sealed class CardSpriteSystem : EntitySystem +{ + /// + public override void Initialize() + { + + } + + public bool TryAdjustLayerQuantity(Entity uid, int? cardLimit = null) + { + var sprite = uid.Comp1; + var stack = uid.Comp2; + var cardCount = cardLimit == null ? stack.Cards.Count : Math.Min(stack.Cards.Count, cardLimit.Value); + + var layerCount = 0; + //Gets the quantity of layers + foreach (var card in stack.Cards.TakeLast(cardCount)) + { + if (!TryComp(card, out SpriteComponent? cardSprite)) + return false; + + layerCount += cardSprite.AllLayers.Count(); + } + //inserts Missing Layers + if (sprite.AllLayers.Count() < layerCount) + { + for (var i = sprite.AllLayers.Count(); i < layerCount; i++) + { + sprite.AddBlankLayer(i); + } + } + //Removes extra layers + else if (sprite.AllLayers.Count() > layerCount) + { + for (var i = sprite.AllLayers.Count() - 1; i >= layerCount; i--) + { + sprite.RemoveLayer(i); + } + } + + + return true; + } + + public bool TryHandleLayerConfiguration(Entity uid, int cardCount, Func, int, int, bool> layerFunc) + { + var sprite = uid.Comp1; + var stack = uid.Comp2; + + // int = index of what card it is from + List<(int, ISpriteLayer)> layers = []; + + var i = 0; + foreach (var card in stack.Cards.TakeLast(cardCount)) + { + if (!TryComp(card, out SpriteComponent? cardSprite)) + return false; + layers.AddRange(cardSprite.AllLayers.Select(layer => (i, layer))); + i++; + } + + var j = 0; + foreach (var obj in layers) + { + var (cardIndex, layer) = obj; + sprite.LayerSetVisible(j, true); + sprite.LayerSetTexture(j, layer.Texture); + sprite.LayerSetState(j, layer.RsiState.Name); + layerFunc.Invoke((uid, sprite), cardIndex, j); + j++; + } + + return true; + } +} diff --git a/Content.Client/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs b/Content.Client/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs new file mode 100644 index 00000000000..0559a3c3f54 --- /dev/null +++ b/Content.Client/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs @@ -0,0 +1,149 @@ +using System.Linq; +using System.Numerics; +using Content.Shared._EstacaoPirata.Cards.Deck; +using Content.Shared._EstacaoPirata.Cards.Stack; +using Robust.Client.GameObjects; + +namespace Content.Client._EstacaoPirata.Cards.Deck; + +/// +/// This handles... +/// +public sealed class CardDeckSystem : EntitySystem +{ + private readonly Dictionary, int> _notInitialized = []; + [Dependency] private readonly CardSpriteSystem _cardSpriteSystem = default!; + + + /// + public override void Initialize() + { + UpdatesOutsidePrediction = false; + SubscribeLocalEvent(OnComponentStartupEvent); + SubscribeNetworkEvent(OnStackStart); + SubscribeNetworkEvent(OnStackUpdate); + SubscribeNetworkEvent(OnReorder); + SubscribeNetworkEvent(OnStackFlip); + SubscribeLocalEvent(OnAppearanceChanged); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + // Lazy way to make sure the sprite starts correctly + foreach (var kv in _notInitialized) + { + var ent = kv.Key; + + if (kv.Value >= 5) + { + _notInitialized.Remove(ent); + continue; + } + + _notInitialized[ent] = kv.Value + 1; + + if (!TryComp(ent.Owner, out CardStackComponent? stack) || stack.Cards.Count <= 0) + continue; + + + // If the card was STILL not initialized, we skip it + if (!TryGetCardLayer(stack.Cards.Last(), out var _)) + continue; + + // If cards were correctly initialized, we update the sprite + UpdateSprite(ent.Owner, ent.Comp); + _notInitialized.Remove(ent); + } + + } + + + private bool TryGetCardLayer(EntityUid card, out SpriteComponent.Layer? layer) + { + layer = null; + if (!TryComp(card, out SpriteComponent? cardSprite)) + return false; + + if (!cardSprite.TryGetLayer(0, out var l)) + return false; + + layer = l; + return true; + } + + private void UpdateSprite(EntityUid uid, CardDeckComponent comp) + { + if (!TryComp(uid, out SpriteComponent? sprite)) + return; + + if (!TryComp(uid, out CardStackComponent? cardStack)) + return; + + + // Prevents error appearing at spawnMenu + if (cardStack.Cards.Count <= 0 || !TryGetCardLayer(cardStack.Cards.Last(), out var cardlayer) || + cardlayer == null) + { + _notInitialized[(uid, comp)] = 0; + return; + } + + _cardSpriteSystem.TryAdjustLayerQuantity((uid, sprite, cardStack), comp.CardLimit); + + _cardSpriteSystem.TryHandleLayerConfiguration( + (uid, sprite, cardStack), + comp.CardLimit, + (_, cardIndex, layerIndex) => + { + sprite.LayerSetRotation(layerIndex, Angle.FromDegrees(90)); + sprite.LayerSetOffset(layerIndex, new Vector2(0, (comp.YOffset * cardIndex))); + sprite.LayerSetScale(layerIndex, new Vector2(comp.Scale, comp.Scale)); + return true; + } + ); + } + + private void OnStackUpdate(CardStackQuantityChangeEvent args) + { + if (!TryComp(GetEntity(args.Stack), out CardDeckComponent? comp)) + return; + UpdateSprite(GetEntity(args.Stack), comp); + } + + private void OnStackFlip(CardStackFlippedEvent args) + { + if (!TryComp(GetEntity(args.CardStack), out CardDeckComponent? comp)) + return; + UpdateSprite(GetEntity(args.CardStack), comp); + } + + private void OnReorder(CardStackReorderedEvent args) + { + if (!TryComp(GetEntity(args.Stack), out CardDeckComponent? comp)) + return; + UpdateSprite(GetEntity(args.Stack), comp); + } + + private void OnAppearanceChanged(EntityUid uid, CardDeckComponent comp, AppearanceChangeEvent args) + { + UpdateSprite(uid, comp); + } + private void OnComponentStartupEvent(EntityUid uid, CardDeckComponent comp, ComponentStartup args) + { + + UpdateSprite(uid, comp); + } + + + private void OnStackStart(CardStackInitiatedEvent args) + { + var entity = GetEntity(args.CardStack); + if (!TryComp(entity, out CardDeckComponent? comp)) + return; + + UpdateSprite(entity, comp); + } + +} diff --git a/Content.Client/_EstacaoPirata/Cards/Hand/CardHandSystem.cs b/Content.Client/_EstacaoPirata/Cards/Hand/CardHandSystem.cs new file mode 100644 index 00000000000..97f7ea45681 --- /dev/null +++ b/Content.Client/_EstacaoPirata/Cards/Hand/CardHandSystem.cs @@ -0,0 +1,114 @@ +using System.Numerics; +using Content.Shared._EstacaoPirata.Cards.Hand; +using Content.Shared._EstacaoPirata.Cards.Stack; +using Robust.Client.GameObjects; + +namespace Content.Client._EstacaoPirata.Cards.Hand; + +/// +/// This handles... +/// +public sealed class CardHandSystem : EntitySystem +{ + [Dependency] private readonly CardSpriteSystem _cardSpriteSystem = default!; + + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnComponentStartupEvent); + SubscribeNetworkEvent(OnStackStart); + SubscribeNetworkEvent(OnStackUpdate); + SubscribeNetworkEvent(OnStackReorder); + SubscribeNetworkEvent(OnStackFlip); + } + + private void UpdateSprite(EntityUid uid, CardHandComponent comp) + { + if (!TryComp(uid, out SpriteComponent? sprite)) + return; + + if (!TryComp(uid, out CardStackComponent? cardStack)) + return; + + _cardSpriteSystem.TryAdjustLayerQuantity((uid, sprite, cardStack), comp.CardLimit); + + var cardCount = Math.Min(cardStack.Cards.Count, comp.CardLimit); + + // Frontier: one card case. + if (cardCount <= 1) + { + _cardSpriteSystem.TryHandleLayerConfiguration( + (uid, sprite, cardStack), + cardCount, + (sprt, cardIndex, layerIndex) => + { + sprt.Comp.LayerSetRotation(layerIndex, Angle.FromDegrees(0)); + sprt.Comp.LayerSetOffset(layerIndex, new Vector2(0, 0.10f)); + sprt.Comp.LayerSetScale(layerIndex, new Vector2(comp.Scale, comp.Scale)); + return true; + } + ); + } + else + { + var intervalAngle = comp.Angle / (cardCount-1); + var intervalSize = comp.XOffset / (cardCount - 1); + + _cardSpriteSystem.TryHandleLayerConfiguration( + (uid, sprite, cardStack), + cardCount, + (sprt, cardIndex, layerIndex) => + { + var angle = (-(comp.Angle/2)) + cardIndex * intervalAngle; + var x = (-(comp.XOffset / 2)) + cardIndex * intervalSize; + var y = -(x * x) + 0.10f; + + sprt.Comp.LayerSetRotation(layerIndex, Angle.FromDegrees(-angle)); + sprt.Comp.LayerSetOffset(layerIndex, new Vector2(x, y)); + sprt.Comp.LayerSetScale(layerIndex, new Vector2(comp.Scale, comp.Scale)); + return true; + } + ); + } + } + + + private void OnStackUpdate(CardStackQuantityChangeEvent args) + { + if (!TryComp(GetEntity(args.Stack), out CardHandComponent? comp)) + return; + UpdateSprite(GetEntity(args.Stack), comp); + } + + private void OnStackStart(CardStackInitiatedEvent args) + { + var entity = GetEntity(args.CardStack); + if (!TryComp(entity, out CardHandComponent? comp)) + return; + + UpdateSprite(entity, comp); + } + private void OnComponentStartupEvent(EntityUid uid, CardHandComponent comp, ComponentStartup args) + { + + UpdateSprite(uid, comp); + } + + // Frontier + private void OnStackReorder(CardStackReorderedEvent args) + { + if (!TryComp(GetEntity(args.Stack), out CardHandComponent? comp)) + return; + UpdateSprite(GetEntity(args.Stack), comp); + } + + private void OnStackFlip(CardStackFlippedEvent args) + { + var entity = GetEntity(args.CardStack); + if (!TryComp(entity, out CardHandComponent? comp)) + return; + + UpdateSprite(entity, comp); + } +} diff --git a/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenu.xaml b/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenu.xaml new file mode 100644 index 00000000000..76cd4247309 --- /dev/null +++ b/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenu.xaml @@ -0,0 +1,12 @@ + + + + + diff --git a/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenu.xaml.cs b/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenu.xaml.cs new file mode 100644 index 00000000000..863799147da --- /dev/null +++ b/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenu.xaml.cs @@ -0,0 +1,101 @@ +using Content.Client.UserInterface.Controls; +using Content.Shared.Popups; +using Robust.Client.AutoGenerated; +using Robust.Client.GameObjects; +using Robust.Client.Player; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; +using System.Numerics; +using Content.Shared._EstacaoPirata.Cards.Card; +using Content.Shared._EstacaoPirata.Cards.Stack; + +namespace Content.Client._EstacaoPirata.Cards.Hand.UI; + +[GenerateTypedNameReferences] +public sealed partial class CardHandMenu : RadialMenu +{ + [Dependency] private readonly EntityManager _entManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + + private readonly SpriteSystem _spriteSystem; + private readonly SharedPopupSystem _popup; + + public event Action? CardHandDrawMessageAction; + + private EntityUid _owner; + + public CardHandMenu(EntityUid owner, CardHandMenuBoundUserInterface bui) + { + IoCManager.InjectDependencies(this); + RobustXamlLoader.Load(this); + + _spriteSystem = _entManager.System(); + _popup = _entManager.System(); + + _owner = owner; + + // Find the main radial container + var main = FindControl("Main"); + + if (!_entManager.TryGetComponent(owner, out var stack)) + return; + + foreach (var card in stack.Cards) + { + if (_playerManager.LocalSession == null) + return; + if (!_entManager.TryGetComponent(card, out var cardComp)) + return; + string cardName; + if (cardComp.Flipped && _entManager.TryGetComponent(card, out var metadata)) + { + cardName = metadata.EntityName; + } + else + { + cardName = Loc.GetString(cardComp.Name); + } + + var button = new CardMenuButton() + { + StyleClasses = { "RadialMenuButton" }, + SetSize = new Vector2(64f, 64f), + ToolTip = cardName, + }; + + if (_entManager.TryGetComponent(card, out var sprite)) + { + if (sprite.Icon == null) + continue; + + var tex = new TextureRect() + { + VerticalAlignment = VAlignment.Center, + HorizontalAlignment = HAlignment.Center, + Texture = sprite.Icon?.Default, + TextureScale = new Vector2(2f, 2f), + }; + + button.AddChild(tex); + } + + main.AddChild(button); + + button.OnButtonUp += _ => + { + CardHandDrawMessageAction?.Invoke(_entManager.GetNetEntity(card)); + Close(); + }; + } + + CardHandDrawMessageAction += bui.SendCardHandDrawMessage; + } +} + +public sealed class CardMenuButton : RadialMenuTextureButton +{ + public CardMenuButton() + { + + } +} diff --git a/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenuBoundUserInterface.cs b/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenuBoundUserInterface.cs new file mode 100644 index 00000000000..2477ab2b031 --- /dev/null +++ b/Content.Client/_EstacaoPirata/Cards/Hand/UI/CardHandMenuBoundUserInterface.cs @@ -0,0 +1,47 @@ +using Content.Shared._EstacaoPirata.Cards.Hand; +using Content.Shared.RCD; +using JetBrains.Annotations; +using Robust.Client.Graphics; +using Robust.Client.Input; +using Robust.Shared.Prototypes; + +namespace Content.Client._EstacaoPirata.Cards.Hand.UI; + +[UsedImplicitly] +public sealed class CardHandMenuBoundUserInterface : BoundUserInterface +{ + [Dependency] private readonly IClyde _displayManager = default!; + [Dependency] private readonly IInputManager _inputManager = default!; + + private CardHandMenu? _menu; + + public CardHandMenuBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + IoCManager.InjectDependencies(this); + } + + protected override void Open() + { + base.Open(); + + _menu = new(Owner, this); + _menu.OnClose += Close; + + // Open the menu, centered on the mouse + var vpSize = _displayManager.ScreenSize; + _menu.OpenCenteredAt(_inputManager.MouseScreenPosition.Position / vpSize); + } + + public void SendCardHandDrawMessage(NetEntity e) + { + SendMessage(new CardHandDrawMessage(e)); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) return; + + _menu?.Dispose(); + } +} diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index dfba7558769..266008225bb 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -3,14 +3,6 @@ using Content.Server.Bank; using Content.Server.Cargo.Components; using Content.Server.Labels.Components; -// FRONTIER MERGE: BEGIN CRUFT -using Content.Server.Paper; -using Content.Server.DeviceLinking.Systems; -using Content.Server.Popups; -using Content.Server.Station.Systems; -using Content.Shared.Access.Systems; -using Content.Shared.Administration.Logs; -// FRONTIER MERGE: END CRUFT using Content.Shared.Bank.Components; // Frontier using Content.Server.Station.Components; using Content.Shared.Cargo; diff --git a/Content.Server/Emp/EmpSystem.cs b/Content.Server/Emp/EmpSystem.cs index 5fc777bdd43..ff6fe45b14c 100644 --- a/Content.Server/Emp/EmpSystem.cs +++ b/Content.Server/Emp/EmpSystem.cs @@ -39,15 +39,18 @@ public override void Initialize() /// The range of the EMP pulse. /// The amount of energy consumed by the EMP pulse. /// The duration of the EMP effects. - public void EmpPulse(MapCoordinates coordinates, float range, float energyConsumption, float duration) + /// Frontier: a list of the grids that should not be affected by the + public void EmpPulse(MapCoordinates coordinates, float range, float energyConsumption, float duration, List? immuneGrids = null) { foreach (var uid in _lookup.GetEntitiesInRange(coordinates, range)) { - // Block EMP on grid + // Frontier: Block EMP on grid var gridUid = Transform(uid).GridUid; - var attemptEv = new EmpAttemptEvent(); - if (TryComp(gridUid, out var prot) && prot.PreventEmpEvents) + if (gridUid != null && + (immuneGrids != null && immuneGrids.Contains(gridUid.Value) || + TryComp(gridUid, out var prot) && prot.PreventEmpEvents)) continue; + // End Frontier: block EMP on grid TryEmpEffects(uid, energyConsumption, duration); } diff --git a/Content.Server/Ghost/Roles/GhostRoleSystem.cs b/Content.Server/Ghost/Roles/GhostRoleSystem.cs index d7842ecc467..5bc69e2c03a 100644 --- a/Content.Server/Ghost/Roles/GhostRoleSystem.cs +++ b/Content.Server/Ghost/Roles/GhostRoleSystem.cs @@ -33,7 +33,6 @@ using Content.Shared.Verbs; using Robust.Shared.Collections; using Content.Shared.Ghost.Roles.Components; -using Content.Server.Players.JobWhitelist; // Frontier using Content.Server._NF.Players.GhostRole.Events; // Frontier namespace Content.Server.Ghost.Roles; @@ -385,7 +384,17 @@ private void JoinRaffle(ICommonSession player, uint identifier) if (!_ghostRoles.TryGetValue(identifier, out var roleEnt)) return; - // FRONTIER MERGE: TODO: check ghost role requirements + // Frontier: check for ghost role whitelist if we don't have one. + if (TryComp(roleEnt, out var ghostRoleComponent) && + _prototype.TryIndex(ghostRoleComponent.Prototype, out var ghostRolePrototype) && + ghostRolePrototype.Whitelisted) + { + var ev = new IsGhostRoleAllowedEvent(player, ghostRolePrototype); + RaiseLocalEvent(ref ev); + if (ev.Cancelled) + return; + } + // End Frontier // get raffle or create a new one if it doesn't exist var raffle = _ghostRoleRaffles.TryGetValue(identifier, out var raffleEnt) @@ -479,7 +488,17 @@ public bool Takeover(ICommonSession player, uint identifier) if (!_ghostRoles.TryGetValue(identifier, out var role)) return false; - // FRONTIER MERGE: TODO: check ghost role requirements + // Frontier: check for ghost role whitelist if we don't have one. + if (TryComp(role, out var ghostRoleComponent) && + _prototype.TryIndex(ghostRoleComponent.Prototype, out var ghostRolePrototype) && + ghostRolePrototype.Whitelisted) + { + var allowEv = new IsGhostRoleAllowedEvent(player, ghostRolePrototype); + RaiseLocalEvent(ref allowEv); + if (allowEv.Cancelled) + return false; + } + // End Frontier var ev = new TakeGhostRoleEvent(player); RaiseLocalEvent(role, ref ev); @@ -576,6 +595,7 @@ public GhostRoleInfo[] GetGhostRolesInfo(ICommonSession? player) Rules = role.RoleRules, Requirements = role.Requirements, Kind = kind, + Prototype = role.Prototype, // Frontier RafflePlayerCount = rafflePlayerCount, RaffleEndTime = raffleEndTime }); diff --git a/Content.Server/Mech/Equipment/Components/MechGrabberComponent.cs b/Content.Server/Mech/Equipment/Components/MechGrabberComponent.cs index f4b3a985bfc..c4e84f2c739 100644 --- a/Content.Server/Mech/Equipment/Components/MechGrabberComponent.cs +++ b/Content.Server/Mech/Equipment/Components/MechGrabberComponent.cs @@ -1,8 +1,9 @@ -using System.Numerics; +using System.Numerics; using System.Threading; using Content.Shared.DoAfter; using Robust.Shared.Audio; using Robust.Shared.Containers; +using Content.Shared.Whitelist; // Frontier namespace Content.Server.Mech.Equipment.Components; @@ -51,4 +52,10 @@ public sealed partial class MechGrabberComponent : Component [DataField, ViewVariables(VVAccess.ReadOnly)] public DoAfterId? DoAfter; + + /// + /// Frontier - If any entities on the blacklist then UnanchorOnHit won't work on anything else. + /// + [DataField] + public EntityWhitelist? Blacklist; } diff --git a/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs b/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs index aa28a8063c0..428fc10353d 100644 --- a/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs +++ b/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs @@ -16,6 +16,9 @@ using Robust.Shared.Map; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; +using Content.Shared.Whitelist; // Frontier +using Content.Shared.Buckle.Components; // Frontier +using Content.Shared.Buckle; // Frontier namespace Content.Server.Mech.Equipment.EntitySystems; @@ -30,6 +33,8 @@ public sealed class MechGrabberSystem : EntitySystem [Dependency] private readonly InteractionSystem _interaction = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly TransformSystem _transform = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; // Frontier + [Dependency] private readonly SharedBuckleSystem _buckle = default!; // Frontier /// public override void Initialize() @@ -139,6 +144,9 @@ private void OnInteract(EntityUid uid, MechGrabberComponent component, UserActiv return; } + if (_whitelist.IsBlacklistPass(component.Blacklist, target)) // Frontier: Blacklist + return; + if (Transform(target).Anchored) return; @@ -182,6 +190,16 @@ private void OnMechGrab(EntityUid uid, MechGrabberComponent component, DoAfterEv if (!_mech.TryChangeEnergy(equipmentComponent.EquipmentOwner.Value, component.GrabEnergyDelta)) return; + // Frontier: Remove people from chairs + if (TryComp(args.Args.Target, out var strapComp) && strapComp.BuckledEntities != null) + { + foreach (var buckleUid in strapComp.BuckledEntities) + { + _buckle.Unbuckle(buckleUid, args.Args.User); + } + } + // End Frontier + _container.Insert(args.Args.Target.Value, component.ItemContainer); _mech.UpdateUserInterface(equipmentComponent.EquipmentOwner.Value); diff --git a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs index d14c13a3a75..ad92098cc66 100644 --- a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs @@ -90,9 +90,6 @@ private bool TrySliceFood(EntityUid uid, var lostSolution = _solutionContainer.SplitSolution(soln.Value, sliceVolume); - // FRONTIER MERGE: commented this out - //_solutionContainerSystem.SetCapacity(soln.Value, soln.Value.Comp.Solution.MaxVolume - solution.MaxVolume / FixedPoint2.New(component.Count)); // Frontier: remove food capacity after taking a slice. - // Fill new slice FillSlice(sliceUid, lostSolution); } diff --git a/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs b/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs index bcec38a4cc9..967a19d90e1 100644 --- a/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs +++ b/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs @@ -1,10 +1,12 @@ using System.Numerics; using System.Threading; using Content.Server.DoAfter; -using Content.Server.Inventory; +using Content.Server.Body.Systems; +using Content.Server.Hands.Systems; using Content.Server.Resist; using Content.Server.Popups; -using Content.Server.Item.PseudoItem; +using Content.Server.Inventory; +using Content.Server.Nyanotrasen.Item.PseudoItem; using Content.Shared.Climbing; // Shared instead of Server using Content.Shared.Mobs; using Content.Shared.DoAfter; @@ -18,23 +20,26 @@ using Content.Shared.Carrying; using Content.Shared.Movement.Events; using Content.Shared.Movement.Systems; +using Content.Shared.Pulling; using Content.Shared.Standing; using Content.Shared.ActionBlocker; using Content.Shared.Inventory.VirtualItem; using Content.Shared.Item; -using Content.Shared.Item.PseudoItem; using Content.Shared.Throwing; using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Pulling.Events; using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Nyanotrasen.Item.PseudoItem; using Content.Shared.Storage; using Robust.Shared.Map.Components; +using Robust.Shared.Physics.Components; namespace Content.Server.Carrying { public sealed class CarryingSystem : EntitySystem { + [Dependency] private readonly VirtualItemSystem _virtualItemSystem = default!; [Dependency] private readonly CarryingSlowdownSystem _slowdown = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; [Dependency] private readonly StandingStateSystem _standingState = default!; @@ -44,13 +49,14 @@ public sealed class CarryingSystem : EntitySystem [Dependency] private readonly EscapeInventorySystem _escapeInventorySystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly MovementSpeedModifierSystem _movementSpeed = default!; - [Dependency] private readonly PseudoItemSystem _pseudoItem = default!; - [Dependency] private readonly VirtualItemSystem _virtualItemSystem = default!; + [Dependency] private readonly RespiratorSystem _respirator = default!; + [Dependency] private readonly PseudoItemSystem _pseudoItem = default!; // Needed for fitting check public override void Initialize() { base.Initialize(); SubscribeLocalEvent>(AddCarryVerb); + SubscribeLocalEvent>(AddInsertCarriedVerb); SubscribeLocalEvent(OnVirtualItemDeleted); SubscribeLocalEvent(OnThrow); SubscribeLocalEvent(OnParentChanged); @@ -62,12 +68,13 @@ public override void Initialize() SubscribeLocalEvent(OnInteractedWith); SubscribeLocalEvent(OnPullAttempt); SubscribeLocalEvent(OnStartClimb); - SubscribeLocalEvent(OnStrapped); + SubscribeLocalEvent(OnBuckleChange); + SubscribeLocalEvent(OnBuckleChange); + SubscribeLocalEvent(OnBuckleChange); + SubscribeLocalEvent(OnBuckleChange); SubscribeLocalEvent(OnDoAfter); - SubscribeLocalEvent>(AddInsertCarriedVerb); // Frontier } - private void AddCarryVerb(EntityUid uid, CarriableComponent component, GetVerbsEvent args) { if (!args.CanInteract || !args.CanAccess) @@ -100,6 +107,33 @@ private void AddCarryVerb(EntityUid uid, CarriableComponent component, GetVerbsE args.Verbs.Add(verb); } + private void AddInsertCarriedVerb(EntityUid uid, CarryingComponent component, GetVerbsEvent args) + { + // If the person is carrying someone, and the carried person is a pseudo-item, and the target entity is a storage, + // then add an action to insert the carried entity into the target + var toInsert = args.Using; + if (toInsert is not { Valid: true } || !args.CanAccess || !TryComp(toInsert, out var pseudoItem)) + return; + + if (!TryComp(args.Target, out var storageComp)) + return; + + if (!_pseudoItem.CheckItemFits((toInsert.Value, pseudoItem), (args.Target, storageComp))) + return; + + InnateVerb verb = new() + { + Act = () => + { + DropCarried(uid, toInsert.Value); + _pseudoItem.TryInsert(args.Target, toInsert.Value, pseudoItem, storageComp); + }, + Text = Loc.GetString("action-name-insert-other", ("target", toInsert)), + Priority = 2 + }; + args.Verbs.Add(verb); + } + /// /// Since the carried entity is stored as 2 virtual items, when deleted we want to drop them. /// @@ -122,8 +156,8 @@ private void OnThrow(EntityUid uid, CarryingComponent component, BeforeThrowEven args.ItemUid = virtItem.BlockingEntity; - // var multiplier = _contests.MassContest(uid, virtItem.BlockingEntity); - // args.ThrowStrength = 5f * multiplier; + var multiplier = MassContest(uid, virtItem.BlockingEntity); + args.ThrowSpeed = 5f * multiplier; } private void OnParentChanged(EntityUid uid, CarryingComponent component, ref EntParentChangedMessage args) @@ -155,7 +189,7 @@ private void OnInteractionAttempt(EntityUid uid, BeingCarriedComponent component var targetParent = Transform(args.Target.Value).ParentUid; if (args.Target.Value != component.Carrier && targetParent != component.Carrier && targetParent != uid) - args.Cancelled = true; // Frontier: Cancel() @@ -166,12 +200,13 @@ private void OnMoveInput(EntityUid uid, BeingCarriedComponent component, ref Mov if (!TryComp(uid, out var escape)) return; - if (args.OldMovement == MoveButtons.None || args.OldMovement == MoveButtons.Walk) - return; // Don't try to escape if not moving *cries* + if (!args.HasDirectionalMovement) + return; if (_actionBlockerSystem.CanInteract(uid, component.Carrier)) { - _escapeInventorySystem.AttemptEscape(uid, component.Carrier, escape); + // Note: the mass contest is inverted because weaker entities are supposed to take longer to escape + _escapeInventorySystem.AttemptEscape(uid, component.Carrier, escape, MassContest(component.Carrier, uid)); } } @@ -188,7 +223,7 @@ private void OnStandAttempt(EntityUid uid, BeingCarriedComponent component, Stan private void OnInteractedWith(EntityUid uid, BeingCarriedComponent component, GettingInteractedWithAttemptEvent args) { if (args.Uid != component.Carrier) - args.Cancelled = true; // Frontier: Cancel()(EntityUid uid, BeingCarriedComponent component, TEvent args) // Augh { DropCarried(component.Carrier, uid); } - // End Frontier private void OnDoAfter(EntityUid uid, CarriableComponent component, CarryDoAfterEvent args) { @@ -220,10 +253,10 @@ private void OnDoAfter(EntityUid uid, CarriableComponent component, CarryDoAfter Carry(args.Args.User, uid); args.Handled = true; } - private void StartCarryDoAfter(EntityUid carrier, EntityUid carried, CarriableComponent component) { - var length = GetPickupDuration(carrier, carried); // Frontier: instead of in-line calculation, use a separate function + TimeSpan length = GetPickupDuration(carrier, carried); + if (length >= TimeSpan.FromSeconds(9)) { _popupSystem.PopupEntity(Loc.GetString("carry-too-heavy"), carried, carrier, Shared.Popups.PopupType.SmallCaution); @@ -241,38 +274,55 @@ private void StartCarryDoAfter(EntityUid carrier, EntityUid carried, CarriableCo BreakOnMove = true, NeedHand = true }; + _doAfterSystem.TryStartDoAfter(args); + // Show a popup to the person getting picked up _popupSystem.PopupEntity(Loc.GetString("carry-started", ("carrier", carrier)), carried, carried); } private void Carry(EntityUid carrier, EntityUid carried) { if (TryComp(carried, out var pullable)) - _pullingSystem.TryStopPull(carrier, pullable); - - // Don't allow people to stack upon each other. They're too weak for that! - if (TryComp(carried, out var carryComp)) - DropCarried(carried, carryComp.Carried); + _pullingSystem.TryStopPull(carried, pullable); Transform(carrier).AttachToGridOrMap(); Transform(carried).AttachToGridOrMap(); Transform(carried).Coordinates = Transform(carrier).Coordinates; Transform(carried).AttachParent(Transform(carrier)); + _virtualItemSystem.TrySpawnVirtualItemInHand(carried, carrier); + _virtualItemSystem.TrySpawnVirtualItemInHand(carried, carrier); var carryingComp = EnsureComp(carrier); ApplyCarrySlowdown(carrier, carried); var carriedComp = EnsureComp(carried); EnsureComp(carried); - _virtualItemSystem.TrySpawnVirtualItemInHand(carried, carrier); - _virtualItemSystem.TrySpawnVirtualItemInHand(carried, carrier); - carryingComp.Carried = carried; carriedComp.Carrier = carrier; _actionBlockerSystem.UpdateCanMove(carried); } + public bool TryCarry(EntityUid carrier, EntityUid toCarry, CarriableComponent? carriedComp = null) + { + if (!Resolve(toCarry, ref carriedComp, false)) + return false; + + if (!CanCarry(carrier, toCarry, carriedComp)) + return false; + + // The second one means that carrier is a pseudo-item and is inside a bag. + if (HasComp(carrier) || HasComp(carrier)) + return false; + + if (GetPickupDuration(carrier, toCarry) > TimeSpan.FromSeconds(9)) + return false; + + Carry(carrier, toCarry); + + return true; + } + public void DropCarried(EntityUid carrier, EntityUid carried) { RemComp(carrier); // get rid of this first so we don't recusrively fire that event @@ -280,22 +330,22 @@ public void DropCarried(EntityUid carrier, EntityUid carried) RemComp(carried); RemComp(carried); _actionBlockerSystem.UpdateCanMove(carried); + _virtualItemSystem.DeleteInHandsMatching(carrier, carried); Transform(carried).AttachToGridOrMap(); _standingState.Stand(carried); _movementSpeed.RefreshMovementSpeedModifiers(carrier); - _virtualItemSystem.DeleteInHandsMatching(carrier, carried); } private void ApplyCarrySlowdown(EntityUid carrier, EntityUid carried) { - // Carrying slowdown made static as a part of removing mass contests - // var massRatio = _contests.MassContest(carrier, carried); - // if (massRatio == 0) - // massRatio = 1; - // var massRatioSq = Math.Pow(massRatio, 2); - // var modifier = (1 - (0.15 / massRatioSq)); - // modifier = Math.Max(0.1, modifier); - var modifier = 0.7f; // 30% slowdown while carrying + var massRatio = MassContest(carrier, carried); + + if (massRatio == 0) + massRatio = 1; + + var massRatioSq = Math.Pow(massRatio, 2); + var modifier = (1 - (0.15 / massRatioSq)); + modifier = Math.Max(0.1, modifier); var slowdownComp = EnsureComp(carrier); _slowdown.SetModifier(carrier, (float) modifier, (float) modifier, slowdownComp); } @@ -326,6 +376,28 @@ public bool CanCarry(EntityUid carrier, EntityUid carried, CarriableComponent? c return true; } + private float MassContest(EntityUid roller, EntityUid target, PhysicsComponent? rollerPhysics = null, PhysicsComponent? targetPhysics = null) + { + if (!Resolve(roller, ref rollerPhysics, false) || !Resolve(target, ref targetPhysics, false)) + return 1f; + + if (targetPhysics.FixturesMass == 0) + return 1f; + + return rollerPhysics.FixturesMass / targetPhysics.FixturesMass; + } + + private TimeSpan GetPickupDuration(EntityUid carrier, EntityUid carried) + { + var length = TimeSpan.FromSeconds(3); + + var mod = MassContest(carrier, carried); + if (mod != 0) + length /= mod; + + return length; + } + public override void Update(float frameTime) { var query = EntityQueryEnumerator(); @@ -352,58 +424,5 @@ public override void Update(float frameTime) } query.Dispose(); } - - public TimeSpan GetPickupDuration(EntityUid carrier, EntityUid carried) - { - TimeSpan length = TimeSpan.FromSeconds(6); // The default was 3 seconds; with the removal of mass contests was increased to 6 to make it less abusable - - // var mod = _contests.MassContest(carrier, carried); - // if (mod != 0) - // length /= mod; - - return length; - } - - public bool TryCarry(EntityUid carrier, EntityUid toCarry, CarriableComponent? carriedComp = null) - { - if (!Resolve(toCarry, ref carriedComp, false)) - return false; - - if (!CanCarry(carrier, toCarry, carriedComp)) - return false; - - // The second one means that carrier *is also* inside a bag. - if (HasComp(carrier) || HasComp(carrier)) - return false; - - if (GetPickupDuration(carrier, toCarry) > TimeSpan.FromSeconds(9)) - return false; - - Carry(carrier, toCarry); - - return true; - } - - private void AddInsertCarriedVerb(EntityUid uid, CarryingComponent component, GetVerbsEvent args) - { - var toInsert = args.Using; - if (toInsert is not { Valid: true } || !args.CanAccess || !TryComp(toInsert, out var pseudoItem)) - return; - - if (!HasComp(args.Target)) - return; // Can't check if the person would actually fit here - - InnateVerb verb = new() - { - Act = () => - { - DropCarried(uid, toInsert.Value); - _pseudoItem.TryInsert(args.Target, toInsert.Value, args.User, pseudoItem); - }, - Text = Loc.GetString("action-name-insert-other", ("target", toInsert)), - Priority = 2 - }; - args.Verbs.Add(verb); - } } } diff --git a/Content.Server/Nyanotrasen/Item/PseudoItem/AllowsSleepInsideComponent.cs b/Content.Server/Nyanotrasen/Item/PseudoItem/AllowsSleepInsideComponent.cs deleted file mode 100644 index 3f023d6cdce..00000000000 --- a/Content.Server/Nyanotrasen/Item/PseudoItem/AllowsSleepInsideComponent.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Content.Server.Item.PseudoItem; - -/// -/// Signifies that pseudo-item creatures can sleep inside the container to which this component was added. -/// -[RegisterComponent] -public sealed partial class AllowsSleepInsideComponent : Component -{ -} diff --git a/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs b/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs index f0a247aa03b..6df387e6ba8 100644 --- a/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs +++ b/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs @@ -1,71 +1,33 @@ -using Content.Server.Actions; -using Content.Server.Carrying; +using Content.Server.Carrying; using Content.Server.DoAfter; +using Content.Server.Item; using Content.Server.Popups; using Content.Server.Storage.EntitySystems; using Content.Shared.Bed.Sleep; using Content.Shared.DoAfter; -using Content.Shared.Hands; using Content.Shared.IdentityManagement; using Content.Shared.Item; using Content.Shared.Item.PseudoItem; +using Content.Shared.Nyanotrasen.Item.PseudoItem; using Content.Shared.Storage; using Content.Shared.Tag; using Content.Shared.Verbs; -using Robust.Shared.Containers; -namespace Content.Server.Item.PseudoItem; +namespace Content.Server.Nyanotrasen.Item.PseudoItem; -public sealed class PseudoItemSystem : EntitySystem +public sealed class PseudoItemSystem : SharedPseudoItemSystem { - [Dependency] private readonly StorageSystem _storageSystem = default!; - [Dependency] private readonly ItemSystem _itemSystem = default!; + [Dependency] private readonly StorageSystem _storage = default!; + [Dependency] private readonly ItemSystem _item = default!; [Dependency] private readonly DoAfterSystem _doAfter = default!; - [Dependency] private readonly TagSystem _tagSystem = default!; - [Dependency] private readonly CarryingSystem _carrying = default!; // Frontier - [Dependency] private readonly ActionsSystem _actions = default!; // Frontier - [Dependency] private readonly PopupSystem _popup = default!; // Frontier - - [ValidatePrototypeId] - private const string PreventTag = "PreventLabel"; + [Dependency] private readonly CarryingSystem _carrying = default!; + [Dependency] private readonly PopupSystem _popup = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent>(AddInsertVerb); SubscribeLocalEvent>(AddInsertAltVerb); - SubscribeLocalEvent(OnEntRemoved); - SubscribeLocalEvent(OnGettingPickedUpAttempt); - SubscribeLocalEvent(OnDropAttempt); - SubscribeLocalEvent(OnDoAfter); - SubscribeLocalEvent(OnInsertAttempt); - SubscribeLocalEvent(OnTrySleeping); // Frontier - } - - private void AddInsertVerb(EntityUid uid, PseudoItemComponent component, GetVerbsEvent args) - { - if (!args.CanInteract || !args.CanAccess) - return; - - if (component.Active) - return; - - if (!TryComp(args.Target, out var targetStorage)) - return; - - if (Transform(args.Target).ParentUid == uid) - return; - - InnateVerb verb = new() - { - Act = () => - { - TryInsert(args.Target, uid, args.User, component, targetStorage); - }, - Text = Loc.GetString("action-name-insert-self"), - Priority = 2 - }; - args.Verbs.Add(verb); + SubscribeLocalEvent(OnTrySleeping); } private void AddInsertAltVerb(EntityUid uid, PseudoItemComponent component, GetVerbsEvent args) @@ -73,16 +35,16 @@ private void AddInsertAltVerb(EntityUid uid, PseudoItemComponent component, GetV if (!args.CanInteract || !args.CanAccess) return; - if (args.User == args.Target) + if (component.Active) return; - if (component.Active) + if (!TryComp(args.Using, out var targetStorage)) return; - if (args.Hands == null) + if (!CheckItemFits((uid, component), (args.Using.Value, targetStorage))) return; - if (!TryComp(args.Hands.ActiveHandEntity, out var targetStorage)) + if (args.Hands?.ActiveHandEntity == null) return; AlternativeVerb verb = new() @@ -97,112 +59,20 @@ private void AddInsertAltVerb(EntityUid uid, PseudoItemComponent component, GetV args.Verbs.Add(verb); } - private void OnEntRemoved(EntityUid uid, PseudoItemComponent component, EntGotRemovedFromContainerMessage args) + protected override void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component, GettingPickedUpAttemptEvent args) { - if (!component.Active) - return; - - RemComp(uid); - component.Active = false; - - // Frontier - if (component.SleepAction is { Valid: true }) - _actions.RemoveAction(uid, component.SleepAction); - } - - private void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component, - GettingPickedUpAttemptEvent args) - { - if (args.User == args.Item) - return; - - // Frontier: prevent people from pushing each other from a bag - if (HasComp(args.User)) + // Try to pick the entity up instead first + if (args.User != args.Item && _carrying.TryCarry(args.User, uid)) { args.Cancel(); return; } - // Frontier: try to carry the person when taking them out of a bag. - if (_carrying.TryCarry(args.User, uid)) - { - args.Cancel(); - return; - } - - Transform(uid).AttachToGridOrMap(); - args.Cancel(); - } - - private void OnDropAttempt(EntityUid uid, PseudoItemComponent component, DropAttemptEvent args) - { - if (component.Active) - args.Cancel(); - } - - private void OnDoAfter(EntityUid uid, PseudoItemComponent component, DoAfterEvent args) - { - if (args.Handled || args.Cancelled || args.Args.Used == null) - return; - - args.Handled = TryInsert(args.Args.Used.Value, uid, args.User, component); - } - - public bool TryInsert(EntityUid storageUid, EntityUid toInsert, EntityUid userUid, PseudoItemComponent component, - StorageComponent? storage = null) - { - if (!Resolve(storageUid, ref storage)) - return false; - - var item = EnsureComp(toInsert); - _tagSystem.TryAddTag(toInsert, PreventTag); - _itemSystem.SetSize(toInsert, component.Size, item); - _itemSystem.VisualsChanged(toInsert); - - if (!_storageSystem.CanInsert(storageUid, toInsert, out _) || - !_storageSystem.PlayerInsertEntityInWorld(storageUid, userUid, toInsert)) - { - component.Active = false; - RemComp(toInsert); - return false; - } - _storageSystem.UpdateUI(storageUid); - _storageSystem.UpdateAppearance(storageUid); - - // Frontier - if (HasComp(storageUid)) - _actions.AddAction(toInsert, ref component.SleepAction, SleepingSystem.SleepActionId, toInsert); - - component.Active = true; - return true; - } - - private void StartInsertDoAfter(EntityUid inserter, EntityUid toInsert, EntityUid storageEntity, - PseudoItemComponent? pseudoItem = null) - { - if (!Resolve(toInsert, ref pseudoItem)) - return; - - var ev = new PseudoItemInsertDoAfterEvent(); - var args = new DoAfterArgs(EntityManager, inserter, 5f, ev, toInsert, toInsert, storageEntity) - { - BreakOnMove = true, - NeedHand = true - }; - - _doAfter.TryStartDoAfter(args); - } - - private void OnInsertAttempt(EntityUid uid, PseudoItemComponent component, - ContainerGettingInsertedAttemptEvent args) - { - if (!component.Active) - return; - // This hopefully shouldn't trigger, but this is a failsafe just in case so we dont bluespace them cats - args.Cancel(); + // If could not pick up, just take it out onto the ground as per default + base.OnGettingPickedUpAttempt(uid, component, args); } - // Frontier - show a popup when a pseudo-item falls asleep inside a bag. + // Show a popup when a pseudo-item falls asleep inside a bag. private void OnTrySleeping(EntityUid uid, PseudoItemComponent component, TryingToSleepEvent args) { var parent = Transform(uid).ParentUid; diff --git a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs index 1f67ed5b830..b2b3bb918c4 100644 --- a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs @@ -15,6 +15,7 @@ using Content.Shared._NC.Radio; // Nuclear-14 using Robust.Server.GameObjects; // Nuclear-14 using Robust.Shared.Prototypes; +using Content.Shared.Access.Systems; // Frontier namespace Content.Server.Radio.EntitySystems; @@ -30,6 +31,7 @@ public sealed class RadioDeviceSystem : EntitySystem [Dependency] private readonly InteractionSystem _interaction = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; + [Dependency] private readonly AccessReaderSystem _access = default!; // Frontier: access // Used to prevent a shitter from using a bunch of radios to spam chat. private HashSet<(string, EntityUid)> _recentlySent = new(); @@ -250,6 +252,8 @@ private void OnToggleIntercomMic(Entity ent, ref ToggleInterc { if (ent.Comp.RequiresPower && !this.IsPowered(ent, EntityManager)) return; + if (!_access.IsAllowed(args.Actor, ent.Owner)) // Frontier + return; // Frontier SetMicrophoneEnabled(ent, args.Actor, args.Enabled, true); ent.Comp.MicrophoneEnabled = args.Enabled; @@ -260,6 +264,8 @@ private void OnToggleIntercomSpeaker(Entity ent, ref ToggleIn { if (ent.Comp.RequiresPower && !this.IsPowered(ent, EntityManager)) return; + if (!_access.IsAllowed(args.Actor, ent.Owner)) // Frontier + return; // Frontier SetSpeakerEnabled(ent, args.Actor, args.Enabled, true); ent.Comp.SpeakerEnabled = args.Enabled; @@ -270,6 +276,8 @@ private void OnSelectIntercomChannel(Entity ent, ref SelectIn { if (ent.Comp.RequiresPower && !this.IsPowered(ent, EntityManager)) return; + if (!_access.IsAllowed(args.Actor, ent.Owner)) // Frontier + return; // Frontier if (!_protoMan.TryIndex(args.Channel, out var channel) || !ent.Comp.SupportedChannels.Contains(args.Channel)) // Nuclear-14: add channel return; diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs index e3790d6954f..753a834cf7e 100644 --- a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs +++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs @@ -21,6 +21,7 @@ using Robust.Shared.Map; using Robust.Shared.Utility; using Content.Shared.UserInterface; +using Content.Shared.Access.Systems; // Frontier namespace Content.Server.Shuttles.Systems; @@ -37,6 +38,7 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem [Dependency] private readonly TagSystem _tags = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; [Dependency] private readonly SharedContentEyeSystem _eyeSystem = default!; + [Dependency] private readonly AccessReaderSystem _access = default!; private EntityQuery _metaQuery; private EntityQuery _xformQuery; @@ -78,6 +80,8 @@ public override void Initialize() SubscribeLocalEvent(OnFtlDestShutdown); InitializeFTL(); + + InitializeNFDrone(); // Frontier: add our drone subscriptions } private void OnFtlDestStartup(EntityUid uid, FTLDestinationComponent component, ComponentStartup args) @@ -178,6 +182,9 @@ private bool TryPilot(EntityUid user, EntityUid uid) return false; } + if (!_access.IsAllowed(user, uid)) // Frontier: check access + return false; // Frontier + var pilotComponent = EnsureComp(user); var console = pilotComponent.Console; diff --git a/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs b/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs index 801d41c5670..90521228c72 100644 --- a/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs +++ b/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs @@ -5,6 +5,7 @@ using Robust.Server.GameObjects; using System.Linq; using Content.Shared.Roles; +using Robust.Shared.Prototypes; // Frontier namespace Content.Server.StationRecords.Systems; @@ -82,20 +83,23 @@ private void UpdateUserInterface(Entity en var (uid, console) = ent; var owningStation = _station.GetOwningStation(uid); + IReadOnlyDictionary, int?>? jobList = null; // Frontier + if (owningStation != null) // Frontier + jobList = _stationJobsSystem.GetJobs(owningStation.Value); // Frontier: moved this up - populate whenever possible. + if (!TryComp(owningStation, out var stationRecords)) { - _ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState()); + _ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState(null, null, null, jobList, console.Filter, ent.Comp.CanDeleteEntries)); // Frontier: add as many args as we can return; } - var jobList = _stationJobsSystem.GetJobs(owningStation.Value); - var listing = _stationRecords.BuildListing((owningStation.Value, stationRecords), console.Filter); switch (listing.Count) { case 0: - _ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState()); + var consoleState = new GeneralStationRecordConsoleState(null, null, null, jobList, console.Filter, ent.Comp.CanDeleteEntries); // Frontier: add as many args as we can + _ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, consoleState); return; default: if (console.ActiveKey == null) @@ -104,7 +108,10 @@ private void UpdateUserInterface(Entity en } if (console.ActiveKey is not { } id) + { + _ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState(null, null, listing, jobList, console.Filter, ent.Comp.CanDeleteEntries)); // Frontier: add as many args as we can return; + } var key = new StationRecordKey(id, owningStation.Value); _stationRecords.TryGetRecord(key, out var record, stationRecords); diff --git a/Content.Server/_EstacaoPirata/OpenTriggeredStorageFill/OpenTriggeredStorageFillComponent.cs b/Content.Server/_EstacaoPirata/OpenTriggeredStorageFill/OpenTriggeredStorageFillComponent.cs new file mode 100644 index 00000000000..f6e24f5ca62 --- /dev/null +++ b/Content.Server/_EstacaoPirata/OpenTriggeredStorageFill/OpenTriggeredStorageFillComponent.cs @@ -0,0 +1,13 @@ +using Content.Shared.Storage; +using Robust.Shared.Prototypes; + +namespace Content.Server._EstacaoPirata.OpenTriggeredStorageFill; + +/// +/// This is used for storing an item prototype to be inserted into a container when the trigger is activated. This is deleted from the entity after the item is inserted. +/// +[RegisterComponent] +public sealed partial class OpenTriggeredStorageFillComponent : Component +{ + [DataField("contents")] public List Contents = new(); +} diff --git a/Content.Server/_EstacaoPirata/OpenTriggeredStorageFill/OpenTriggeredStorageFillSystem.cs b/Content.Server/_EstacaoPirata/OpenTriggeredStorageFill/OpenTriggeredStorageFillSystem.cs new file mode 100644 index 00000000000..d5a73319f69 --- /dev/null +++ b/Content.Server/_EstacaoPirata/OpenTriggeredStorageFill/OpenTriggeredStorageFillSystem.cs @@ -0,0 +1,53 @@ +using Content.Server.Spawners.Components; +using Content.Shared.Interaction; +using Content.Shared.Item; +using Content.Shared.Prototypes; +using Content.Shared.Storage; +using Content.Shared.Storage.EntitySystems; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Server._EstacaoPirata.OpenTriggeredStorageFill; + +/// +/// This handles... +/// +public sealed class OpenTriggeredStorageFillSystem : EntitySystem +{ + + [Dependency] private readonly SharedStorageSystem _storage = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnOpenEvent); + } + + //Yes, that's a copy of StorageSystem StorageFill method + private void OnOpenEvent(EntityUid uid, OpenTriggeredStorageFillComponent comp, ActivateInWorldEvent args) + { + Log.Debug("aaa"); + var coordinates = Transform(uid).Coordinates; + + var spawnItems = EntitySpawnCollection.GetSpawns(comp.Contents); + foreach (var item in spawnItems) + { + DebugTools.Assert(!_prototype.Index(item) + .HasComponent(typeof(RandomSpawnerComponent))); + var ent = Spawn(item, coordinates); + + if (!TryComp(ent, out var itemComp)) + { + Log.Error($"Tried to fill {ToPrettyString(uid)} with non-item {item}."); + Del(ent); + continue; + } + if (!_storage.Insert(uid, ent, out _, out var _, playSound: false)) + Log.Error($"Failed attemp while trying to fill {ToPrettyString(uid)}"); + } + + RemComp(uid, comp); + } + +} diff --git a/Content.Server/_NF/Bank/BankSystem.cs b/Content.Server/_NF/Bank/BankSystem.cs index ebef827959d..a8ab4a59567 100644 --- a/Content.Server/_NF/Bank/BankSystem.cs +++ b/Content.Server/_NF/Bank/BankSystem.cs @@ -62,10 +62,10 @@ private void OnBankAccountChanged(EntityUid mobUid, BankAccountComponent bank, r bank.Balance, profile.Appearance, profile.SpawnPriority, - new Dictionary, JobPriority>(profile.JobPriorities), // Frontier Merge + new Dictionary, JobPriority>(profile.JobPriorities), profile.PreferenceUnavailable, - new HashSet>(profile.AntagPreferences), // Frontier Merge - new HashSet>(profile.TraitPreferences), // Frontier Merge + new HashSet>(profile.AntagPreferences), + new HashSet>(profile.TraitPreferences), new Dictionary(profile.Loadouts)); args.State = new BankAccountComponentState diff --git a/Content.Server/_NF/M_Emp/M_EmpSystem.cs b/Content.Server/_NF/M_Emp/M_EmpSystem.cs index 9f638492662..71189a06706 100644 --- a/Content.Server/_NF/M_Emp/M_EmpSystem.cs +++ b/Content.Server/_NF/M_Emp/M_EmpSystem.cs @@ -291,7 +291,15 @@ private bool SpawnM_Emp(EntityUid uid, M_EmpGeneratorComponent component) var empEnergyConsumption = 2700000; var empDisabledDuration = 60; - _emp.EmpPulse(Transform(uid).MapPosition, empRange, empEnergyConsumption, empDisabledDuration); + var xform = Transform(uid); + List? immuneGridList = null; + if (xform.GridUid != null) + { + immuneGridList = new List { + xform.GridUid.Value + }; + } + _emp.EmpPulse(xform.MapPosition, empRange, empEnergyConsumption, empDisabledDuration, immuneGrids: immuneGridList); return true; } diff --git a/Content.Server/_NF/Shuttles/NFDroneConsoleComponent.cs b/Content.Server/_NF/Shuttles/NFDroneConsoleComponent.cs new file mode 100644 index 00000000000..81efc7105bb --- /dev/null +++ b/Content.Server/_NF/Shuttles/NFDroneConsoleComponent.cs @@ -0,0 +1,17 @@ +namespace Content.Server.Shuttles.Components; + +/// +/// Lets you remotely control a shuttle. +/// +[RegisterComponent] +public sealed partial class NFDroneConsoleComponent : Component +{ + [DataField(required: true)] + public string Id = default!; + + /// + /// that we're proxied into. + /// + [DataField] + public EntityUid? Entity; +} diff --git a/Content.Server/_NF/Shuttles/NFDroneConsoleTargetComponent.cs b/Content.Server/_NF/Shuttles/NFDroneConsoleTargetComponent.cs new file mode 100644 index 00000000000..3abe9b36971 --- /dev/null +++ b/Content.Server/_NF/Shuttles/NFDroneConsoleTargetComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Server.Shuttles; + +/// +/// Lets you remotely control a shuttle. +/// +[RegisterComponent] +public sealed partial class NFDroneConsoleTargetComponent : Component +{ + [DataField(required: true)] + public string Id = default!; +} diff --git a/Content.Server/_NF/Shuttles/Systems/ShuttleConsoleSystem.NFDrone.cs b/Content.Server/_NF/Shuttles/Systems/ShuttleConsoleSystem.NFDrone.cs new file mode 100644 index 00000000000..b5aa13142f0 --- /dev/null +++ b/Content.Server/_NF/Shuttles/Systems/ShuttleConsoleSystem.NFDrone.cs @@ -0,0 +1,69 @@ +using Content.Server.Shuttles.Components; +using Content.Server.Shuttles.Events; +using Content.Shared.UserInterface; +using Content.Shared.Shuttles.Components; + +namespace Content.Server.Shuttles.Systems; + +public sealed partial class ShuttleConsoleSystem +{ + public void InitializeNFDrone() + { + SubscribeLocalEvent(OnNFCargoGetConsole); + SubscribeLocalEvent(OnNFDronePilotConsoleOpen); + Subs.BuiEvents(ShuttleConsoleUiKey.Key, subs => + { + subs.Event(OnNFDronePilotConsoleClose); + }); + } + + /// + /// Gets the drone console target if applicable otherwise returns itself. + /// + public EntityUid? GetNFDroneConsole(EntityUid consoleUid) + { + var getShuttleEv = new ConsoleShuttleEvent + { + Console = consoleUid, + }; + + RaiseLocalEvent(consoleUid, ref getShuttleEv); + return getShuttleEv.Console; + } + + private void OnNFDronePilotConsoleOpen(EntityUid uid, NFDroneConsoleComponent component, AfterActivatableUIOpenEvent args) + { + component.Entity = GetNFShuttleConsole(uid); + } + + private void OnNFDronePilotConsoleClose(EntityUid uid, NFDroneConsoleComponent component, BoundUIClosedEvent args) + { + // Only if last person closed UI. + if (!_ui.IsUiOpen(uid, args.UiKey)) + component.Entity = null; + } + + private void OnNFCargoGetConsole(EntityUid uid, NFDroneConsoleComponent component, ref ConsoleShuttleEvent args) + { + args.Console = GetNFShuttleConsole(uid, component); + } + + /// + /// Gets the relevant shuttle console to proxy from the drone console. + /// + private EntityUid? GetNFShuttleConsole(EntityUid uid, NFDroneConsoleComponent? sourceComp = null) + { + if (!Resolve(uid, ref sourceComp)) + return null; + + var query = AllEntityQuery(); + + while (query.MoveNext(out var cUid, out _, out var targetComp)) + { + if (sourceComp.Id == targetComp.Id) + return cUid; + } + + return null; + } +} diff --git a/Content.Server/_NF/SizeAttribute/SizeAttributeSystem.cs b/Content.Server/_NF/SizeAttribute/SizeAttributeSystem.cs index 7322da3d16e..1a985a3ff1a 100644 --- a/Content.Server/_NF/SizeAttribute/SizeAttributeSystem.cs +++ b/Content.Server/_NF/SizeAttribute/SizeAttributeSystem.cs @@ -4,7 +4,7 @@ using Robust.Shared.Physics.Collision.Shapes; using Robust.Shared.Physics.Systems; using Content.Shared._NF.SizeAttribute; -using Content.Shared.Item.PseudoItem; +using Content.Shared.Nyanotrasen.Item.PseudoItem; namespace Content.Server.SizeAttribute { @@ -13,7 +13,6 @@ public sealed class SizeAttributeSystem : EntitySystem [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly AppearanceSystem _appearance = default!; - [Dependency] private readonly FixtureSystem _fixtures = default!; public override void Initialize() { base.Initialize(); @@ -22,32 +21,35 @@ public override void Initialize() private void OnComponentInit(EntityUid uid, SizeAttributeComponent component, ComponentInit args) { - if (component.Tall && TryComp(uid, out var tall)) + if (component.Tall && TryComp(uid, out var tallComp)) { - Scale(uid, component, tall.Scale, tall.Density, tall.CosmeticOnly); - PseudoItem(uid, component, tall.PseudoItem); + Scale(uid, component, tallComp.Scale, tallComp.Density, tallComp.CosmeticOnly); + PseudoItem(uid, component, tallComp.PseudoItem, tallComp.Shape, tallComp.StoredOffset, tallComp.StoredRotation); } - else if (component.Short && TryComp(uid, out var smol)) + else if (component.Short && TryComp(uid, out var shortComp)) { - Scale(uid, component, smol.Scale, smol.Density, smol.CosmeticOnly); - PseudoItem(uid, component, smol.PseudoItem); + Scale(uid, component, shortComp.Scale, shortComp.Density, shortComp.CosmeticOnly); + PseudoItem(uid, component, shortComp.PseudoItem, shortComp.Shape, shortComp.StoredOffset, shortComp.StoredRotation); } } - private void PseudoItem(EntityUid uid, SizeAttributeComponent component, bool active) + private void PseudoItem(EntityUid uid, SizeAttributeComponent _, bool active, List? shape, Vector2i? storedOffset, float storedRotation) { if (active) { - if (TryComp(uid, out var pseudoI)) - return; + var pseudoI = _entityManager.EnsureComponent(uid); - _entityManager.AddComponent(uid); + pseudoI.StoredRotation = storedRotation; + pseudoI.StoredOffset = storedOffset ?? new(0, 17); + pseudoI.Shape = shape ?? new List + { + new Box2i(0, 0, 1, 4), + new Box2i(0, 2, 3, 4), + new Box2i(4, 0, 5, 4) + }; } else { - if (!TryComp(uid, out var pseudoI)) - return; - _entityManager.RemoveComponent(uid); } } diff --git a/Content.Shared/Contraband/ContrabandComponent.cs b/Content.Shared/Contraband/ContrabandComponent.cs index d58f24828f7..0236e24f1a2 100644 --- a/Content.Shared/Contraband/ContrabandComponent.cs +++ b/Content.Shared/Contraband/ContrabandComponent.cs @@ -41,5 +41,12 @@ public sealed partial class ContrabandComponent : Component [DataField] [AutoNetworkedField] public bool HideValues = false; + + /// + /// If true, will not show the carry status ("avoid carrying this around"/"in the clear"). + /// + [DataField] + [AutoNetworkedField] + public bool HideCarryStatus = false; // End Frontier: turn-in extensions } diff --git a/Content.Shared/Contraband/ContrabandSystem.cs b/Content.Shared/Contraband/ContrabandSystem.cs index c6c5fe5abda..e289ffe99b5 100644 --- a/Content.Shared/Contraband/ContrabandSystem.cs +++ b/Content.Shared/Contraband/ContrabandSystem.cs @@ -68,6 +68,9 @@ private void OnExamined(Entity ent, ref ExaminedEvent args) departments = id.Comp.JobDepartments; } + if (ent.Comp.HideCarryStatus) // Frontier: hide carry status + return; // Frontier: hide carry status + // either its fully restricted, you have no departments, or your departments dont intersect with the restricted departments if (ent.Comp.AllowedDepartments is null || departments is null diff --git a/Content.Shared/Item/ItemComponent.cs b/Content.Shared/Item/ItemComponent.cs index 9fadfa0783c..0f599ebdbed 100644 --- a/Content.Shared/Item/ItemComponent.cs +++ b/Content.Shared/Item/ItemComponent.cs @@ -1,4 +1,5 @@ using Content.Shared.Hands.Components; +using Content.Shared.Nyanotrasen.Item.PseudoItem; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; @@ -12,11 +13,11 @@ namespace Content.Shared.Item; /// [RegisterComponent] [NetworkedComponent] -[Access(typeof(SharedItemSystem)), AutoGenerateComponentState(true)] +[Access(typeof(SharedItemSystem), typeof(SharedPseudoItemSystem)), AutoGenerateComponentState(true)] // DeltaV - Gave PseudoItem access public sealed partial class ItemComponent : Component { [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] - [Access(typeof(SharedItemSystem))] + [Access(typeof(SharedItemSystem), typeof(SharedPseudoItemSystem))] // DeltaV - Gave PseudoItem access public ProtoId Size = "Small"; [Access(typeof(SharedItemSystem))] diff --git a/Content.Shared/Nyanotrasen/Item/Components/PseudoItemComponent.cs b/Content.Shared/Nyanotrasen/Item/Components/PseudoItemComponent.cs deleted file mode 100644 index 87214f16455..00000000000 --- a/Content.Shared/Nyanotrasen/Item/Components/PseudoItemComponent.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Content.Shared._NF.Cloning; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -namespace Content.Shared.Item.PseudoItem; -/// -/// For entities that behave like an item under certain conditions, -/// but not under most conditions. -/// -[RegisterComponent] -public sealed partial class PseudoItemComponent : Component, ITransferredByCloning -{ - [DataField("size", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string Size = "Huge"; - - public bool Active = false; - - [DataField] - public EntityUid? SleepAction; -} diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItem/AllowsSleepInsideComponent.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/AllowsSleepInsideComponent.cs new file mode 100644 index 00000000000..a28c7698fcd --- /dev/null +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/AllowsSleepInsideComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Shared.Nyanotrasen.Item.PseudoItem; + +/// +/// Signifies that pseudo-item creatures can sleep inside the container to which this component is applied. +/// +[RegisterComponent] +public sealed partial class AllowsSleepInsideComponent : Component +{ +} diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs new file mode 100644 index 00000000000..e6dfcd07bd7 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs @@ -0,0 +1,36 @@ +using Content.Shared.Item; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Nyanotrasen.Item.PseudoItem; + +/// +/// For entities that behave like an item under certain conditions, +/// but not under most conditions. +/// +[RegisterComponent, AutoGenerateComponentState] +public sealed partial class PseudoItemComponent : Component +{ + [DataField("size")] + public ProtoId Size = "Huge"; + + /// + /// An optional override for the shape of the item within the grid storage. + /// If null, a default shape will be used based on . + /// + [DataField, AutoNetworkedField] + public List? Shape; + + [DataField, AutoNetworkedField] + public Vector2i StoredOffset; + + [DataField, AutoNetworkedField] // Frontier + public float StoredRotation; // Frontier + + public bool Active = false; + + /// + /// Action for sleeping while inside a container with . + /// + [DataField] + public EntityUid? SleepAction; +} diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.Checks.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.Checks.cs new file mode 100644 index 00000000000..906503b3707 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.Checks.cs @@ -0,0 +1,35 @@ +using Content.Shared.Item; +using Content.Shared.Storage; + +namespace Content.Shared.Nyanotrasen.Item.PseudoItem; + +public partial class SharedPseudoItemSystem +{ + /// + /// Checks if the pseudo-item can be inserted into the specified storage entity. + /// + /// + /// This function creates and uses a fake item component if the entity doesn't have one. + /// + public bool CheckItemFits(Entity itemEnt, Entity storageEnt) + { + if (!Resolve(itemEnt, ref itemEnt.Comp) || !Resolve(storageEnt, ref storageEnt.Comp)) + return false; + + if (!TryComp(itemEnt, out var metadata)) + return false; + + TryComp(itemEnt, out var item); + // If the entity doesn't have an item comp, create a fake one + // The fake component is never actually added to the entity + item ??= new ItemComponent + { + Owner = itemEnt, + Shape = itemEnt.Comp.Shape, + Size = itemEnt.Comp.Size, + StoredOffset = itemEnt.Comp.StoredOffset + }; + + return _storage.CanInsert(storageEnt, itemEnt, out _, storageEnt.Comp, item, ignoreStacks: true); + } +} diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.cs new file mode 100644 index 00000000000..40104804333 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.cs @@ -0,0 +1,182 @@ +using Content.Shared.Actions; +using Content.Shared.Bed.Sleep; +using Content.Shared.DoAfter; +using Content.Shared.Hands; +using Content.Shared.IdentityManagement; +using Content.Shared.Interaction.Events; +using Content.Shared.Item; +using Content.Shared.Item.PseudoItem; +using Content.Shared.Popups; +using Content.Shared.Storage; +using Content.Shared.Storage.EntitySystems; +using Content.Shared.Tag; +using Content.Shared.Verbs; +using Robust.Shared.Containers; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Nyanotrasen.Item.PseudoItem; + +public abstract partial class SharedPseudoItemSystem : EntitySystem +{ + [Dependency] private readonly SharedStorageSystem _storage = default!; + [Dependency] private readonly SharedItemSystem _item = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly TagSystem _tag = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + + [ValidatePrototypeId] + private const string PreventTag = "PreventLabel"; + [ValidatePrototypeId] + private const string SleepActionId = "ActionSleep"; // The action used for sleeping inside bags. Currently uses the default sleep action (same as beds) + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent>(AddInsertVerb); + SubscribeLocalEvent(OnEntRemoved); + SubscribeLocalEvent(OnGettingPickedUpAttempt); + SubscribeLocalEvent(OnDropAttempt); + SubscribeLocalEvent(OnInsertAttempt); + SubscribeLocalEvent(OnInteractAttempt); + SubscribeLocalEvent(OnDoAfter); + SubscribeLocalEvent(OnAttackAttempt); + } + + private void AddInsertVerb(EntityUid uid, PseudoItemComponent component, GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess) + return; + + if (component.Active) + return; + + if (!TryComp(args.Target, out var targetStorage)) + return; + + if (!CheckItemFits((uid, component), (args.Target, targetStorage))) + return; + + if (Transform(args.Target).ParentUid == uid) + return; + + InnateVerb verb = new() + { + Act = () => + { + TryInsert(args.Target, uid, component, targetStorage); + }, + Text = Loc.GetString("action-name-insert-self"), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + public bool TryInsert(EntityUid storageUid, EntityUid toInsert, PseudoItemComponent component, + StorageComponent? storage = null) + { + if (!Resolve(storageUid, ref storage)) + return false; + + if (!CheckItemFits((toInsert, component), (storageUid, storage))) + return false; + + var itemComp = new ItemComponent + { Size = component.Size, Shape = component.Shape, StoredOffset = component.StoredOffset, StoredRotation = component.StoredRotation }; // Frontier: added StoredRotation + AddComp(toInsert, itemComp); + _item.VisualsChanged(toInsert); + + _tag.TryAddTag(toInsert, PreventTag); + + if (!_storage.Insert(storageUid, toInsert, out _, null, storage)) + { + component.Active = false; + RemComp(toInsert); + return false; + } + + // If the storage allows sleeping inside, add the respective action + if (HasComp(storageUid)) + _actions.AddAction(toInsert, ref component.SleepAction, SleepActionId, toInsert); + + component.Active = true; + return true; + } + + private void OnEntRemoved(EntityUid uid, PseudoItemComponent component, EntGotRemovedFromContainerMessage args) + { + if (!component.Active) + return; + + RemComp(uid); + component.Active = false; + + _actions.RemoveAction(uid, component.SleepAction); // Remove sleep action if it was added + } + + protected virtual void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component, + GettingPickedUpAttemptEvent args) + { + if (args.User == args.Item) + return; + + Transform(uid).AttachToGridOrMap(); + args.Cancel(); + } + + private void OnDropAttempt(EntityUid uid, PseudoItemComponent component, DropAttemptEvent args) + { + if (component.Active) + args.Cancel(); + } + + private void OnInsertAttempt(EntityUid uid, PseudoItemComponent component, + ContainerGettingInsertedAttemptEvent args) + { + if (!component.Active) + return; + // This hopefully shouldn't trigger, but this is a failsafe just in case so we dont bluespace them cats + args.Cancel(); + } + + // Prevents moving within the bag :) + private void OnInteractAttempt(EntityUid uid, PseudoItemComponent component, InteractionAttemptEvent args) + { + if (args.Uid == args.Target && component.Active) + args.Cancelled = true; + } + + private void OnDoAfter(EntityUid uid, PseudoItemComponent component, DoAfterEvent args) + { + if (args.Handled || args.Cancelled || args.Args.Used == null) + return; + + args.Handled = TryInsert(args.Args.Used.Value, uid, component); + } + + protected void StartInsertDoAfter(EntityUid inserter, EntityUid toInsert, EntityUid storageEntity, + PseudoItemComponent? pseudoItem = null) + { + if (!Resolve(toInsert, ref pseudoItem)) + return; + + var ev = new PseudoItemInsertDoAfterEvent(); + var args = new DoAfterArgs(EntityManager, inserter, 5f, ev, toInsert, toInsert, storageEntity) + { + BreakOnMove = true, + NeedHand = true + }; + + if (_doAfter.TryStartDoAfter(args)) + { + // Show a popup to the person getting picked up + _popupSystem.PopupEntity(Loc.GetString("carry-started", ("carrier", inserter)), toInsert, toInsert); + } + } + + private void OnAttackAttempt(EntityUid uid, PseudoItemComponent component, AttackAttemptEvent args) + { + if (component.Active) + args.Cancel(); + } +} diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItemInsertDoAfterEvent.cs b/Content.Shared/Nyanotrasen/Item/PseudoItemInsertDoAfterEvent.cs index 4b34118f377..daff55d2770 100644 --- a/Content.Shared/Nyanotrasen/Item/PseudoItemInsertDoAfterEvent.cs +++ b/Content.Shared/Nyanotrasen/Item/PseudoItemInsertDoAfterEvent.cs @@ -8,3 +8,4 @@ namespace Content.Shared.Item.PseudoItem; public sealed partial class PseudoItemInsertDoAfterEvent : SimpleDoAfterEvent { } + diff --git a/Content.Shared/Paper/PaperSystem.cs b/Content.Shared/Paper/PaperSystem.cs index 6569a464a2c..40cfbdceb74 100644 --- a/Content.Shared/Paper/PaperSystem.cs +++ b/Content.Shared/Paper/PaperSystem.cs @@ -12,7 +12,6 @@ using Content.Shared.Timing; // Frontier using Content.Shared.Access.Systems; // Frontier using Content.Shared.Verbs; // Frontier -using Content.Shared.Crayon; // Frontier using Content.Shared.Ghost; // Frontier namespace Content.Shared.Paper; @@ -327,7 +326,7 @@ public bool TrySign(Entity paper, EntityUid signer, EntityUid pe true ); - _popupSystem.PopupEntity( + _popupSystem.PopupClient( Loc.GetString( "paper-component-action-signed-self", ("target", paper.Owner) @@ -336,7 +335,7 @@ public bool TrySign(Entity paper, EntityUid signer, EntityUid pe signer ); - _audio.PlayPvs(paper.Comp.Sound, paper); + _audio.PlayPredicted(paper.Comp.Sound, paper, signer); _adminLogger.Add(LogType.Verb, LogImpact.Low, $"{ToPrettyString(signer):player} has signed {ToPrettyString(paper):paper}."); diff --git a/Content.Shared/Resist/EscapeInventoryCancelEvent.cs b/Content.Shared/Resist/EscapeInventoryCancelEvent.cs index 28428ea100d..a8e6b56f851 100644 --- a/Content.Shared/Resist/EscapeInventoryCancelEvent.cs +++ b/Content.Shared/Resist/EscapeInventoryCancelEvent.cs @@ -1,5 +1,6 @@ using Content.Shared.Actions; -public sealed partial class EscapeInventoryCancelActionEvent : InstantActionEvent -{ -} +namespace Content.Shared.Resist; + +// DeltaV +public sealed partial class EscapeInventoryCancelActionEvent : InstantActionEvent; diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index 9c72f909fd6..334d801ac78 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -15,7 +15,7 @@ using Content.Shared.Interaction.Components; using Content.Shared.Inventory; using Content.Shared.Item; -using Content.Shared.Item.PseudoItem; +using Content.Shared.Nyanotrasen.Item.PseudoItem; using Content.Shared.Lock; using Content.Shared.Materials; using Content.Shared.Placeable; @@ -446,7 +446,7 @@ private void AfterInteract(EntityUid uid, StorageComponent storageComp, AfterInt } //If there's only one then let's be generous - if (_entList.Count > 1) + if (_entList.Count >= 1) { var doAfterArgs = new DoAfterArgs(EntityManager, args.User, delay, new AreaPickupDoAfterEvent(GetNetEntityList(_entList)), uid, target: uid) { diff --git a/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs b/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs index 65a8871a4f3..cbfdf00789d 100644 --- a/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs +++ b/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs @@ -2,7 +2,7 @@ using Content.Shared.Construction.Components; using Content.Shared.Weapons.Melee.Components; using Content.Shared.Weapons.Melee.Events; -using Content.Shared.Whitelist; +using Content.Shared.Whitelist; // Frontier using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; @@ -19,7 +19,7 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; // Frontier /// public override void Initialize() @@ -49,12 +49,7 @@ private void OnMeleeHit(Entity ent, ref MeleeHitEvent if (comp.UnanchorOnHit && HasComp(hit)) { - if (comp.Whitelist != null) // Frontier - { - if (_whitelist.IsWhitelistPass(comp.Whitelist, hit)) - _transform.Unanchor(hit, Transform(hit)); - } - else // Frontier + if (_whitelist.IsWhitelistPassOrNull(comp.Whitelist, hit)) // Frontier _transform.Unanchor(hit, Transform(hit)); } diff --git a/Content.Shared/_EstacaoPirata/Cards/Card/CardComponent.cs b/Content.Shared/_EstacaoPirata/Cards/Card/CardComponent.cs new file mode 100644 index 00000000000..8d9ed16f6a7 --- /dev/null +++ b/Content.Shared/_EstacaoPirata/Cards/Card/CardComponent.cs @@ -0,0 +1,44 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + +namespace Content.Shared._EstacaoPirata.Cards.Card; + +/// +/// This is used for... +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class CardComponent : Component +{ + /// + /// The back of the card + /// + [DataField("backSpriteLayers", readOnly: true)] + public List? BackSprite = []; + + /// + /// The front of the card + /// + [DataField("frontSpriteLayers", readOnly: true)] + public List FrontSprite = []; + + /// + /// If it is currently flipped. This is used to update sprite and name. + /// + [DataField("flipped", readOnly: true), AutoNetworkedField] + public bool Flipped = false; + + + /// + /// The name of the card. + /// + [DataField("name", readOnly: true), AutoNetworkedField] + public string Name = ""; + +} + +[Serializable, NetSerializable] +public sealed class CardFlipUpdatedEvent(NetEntity card) : EntityEventArgs +{ + public NetEntity Card = card; +} diff --git a/Content.Shared/_EstacaoPirata/Cards/Card/CardSystem.cs b/Content.Shared/_EstacaoPirata/Cards/Card/CardSystem.cs new file mode 100644 index 00000000000..0f4c93a3d84 --- /dev/null +++ b/Content.Shared/_EstacaoPirata/Cards/Card/CardSystem.cs @@ -0,0 +1,220 @@ +using Content.Shared._EstacaoPirata.Cards.Deck; +using Content.Shared._EstacaoPirata.Cards.Hand; +using Content.Shared._EstacaoPirata.Cards.Stack; +using Content.Shared.Examine; +using Content.Shared.Hands.Components; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; +using Content.Shared.Verbs; +using Robust.Shared.Containers; +using Robust.Shared.Network; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared._EstacaoPirata.Cards.Card; + +/// +/// This handles... +/// +public sealed class CardSystem : EntitySystem +{ + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly CardStackSystem _cardStack = default!; + [Dependency] private readonly CardDeckSystem _cardDeck = default!; + [Dependency] private readonly CardHandSystem _cardHand = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + /// + public override void Initialize() + { + SubscribeLocalEvent>(AddTurnOnVerb); + SubscribeLocalEvent>(OnActivationVerb); + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnUse); + SubscribeLocalEvent(OnActivate); + } + private void OnExamined(EntityUid uid, CardComponent component, ExaminedEvent args) + { + if (args.IsInDetailsRange && !component.Flipped) + { + args.PushMarkup(Loc.GetString("card-examined", ("target", Loc.GetString(component.Name)))); + } + } + + private void AddTurnOnVerb(EntityUid uid, CardComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract || args.Hands == null) + return; + + args.Verbs.Add(new AlternativeVerb() + { + Act = () => FlipCard(uid, component), + Text = Loc.GetString("cards-verb-flip"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/flip.svg.192dpi.png")), + Priority = 1 + }); + + if (args.Using == null || args.Using == args.Target) + return; + + if (TryComp(args.Using, out var usingStack)) + { + args.Verbs.Add(new AlternativeVerb() + { + Act = () => JoinCards(args.User, args.Target, component, (EntityUid)args.Using, usingStack), + Text = Loc.GetString("card-verb-join"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")), + Priority = 2 + }); + } + else if (TryComp(args.Using, out var usingCard)) + { + args.Verbs.Add(new AlternativeVerb() + { + Act = () => _cardHand.TrySetupHandOfCards(args.User, args.Target, component, args.Using.Value, usingCard, false), + Text = Loc.GetString("card-verb-join"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")), + Priority = 2 + }); + } + } + + private void OnUse(EntityUid uid, CardComponent comp, UseInHandEvent args) + { + if (args.Handled) + return; + + FlipCard(uid, comp); + args.Handled = true; + } + + /// + /// Server-Side only method to flip card. This starts CardFlipUpdatedEvent event + /// + /// + /// + private void FlipCard(EntityUid uid, CardComponent component) + { + if (_net.IsClient) + return; + component.Flipped = !component.Flipped; + Dirty(uid, component); + RaiseNetworkEvent(new CardFlipUpdatedEvent(GetNetEntity(uid))); + } + + private void JoinCards(EntityUid user, EntityUid first, CardComponent firstComp, EntityUid second, CardStackComponent secondStack) + { + if (_net.IsClient) + return; + + EntityUid cardStack; + bool? flip = null; + if (HasComp(second)) + { + cardStack = SpawnInSameParent(_cardDeck.CardDeckBaseName, first); + } + else if (HasComp(second)) + { + cardStack = SpawnInSameParent(_cardHand.CardHandBaseName, first); + if(TryComp(cardStack, out var stackHand)) + stackHand.Flipped = firstComp.Flipped; + flip = firstComp.Flipped; + } + else + return; + + if (!TryComp(cardStack, out CardStackComponent? stack)) + return; + if (!_cardStack.TryInsertCard(cardStack, first, stack)) + return; + _cardStack.TransferNLastCardFromStacks(user, secondStack.Cards.Count, second, secondStack, cardStack, stack); + if (flip != null) + _cardStack.FlipAllCards(cardStack, stack, flip); //??? + } + + // Frontier: tries to spawn an entity with the same parent as another given entity. + // Useful when spawning decks/hands in a backpack, for example. + private EntityUid SpawnInSameParent(EntProtoId prototype, EntityUid uid) + { + if (_container.IsEntityOrParentInContainer(uid) && + _container.TryGetOuterContainer(uid, Transform(uid), out var container)) + { + return SpawnInContainerOrDrop(prototype, container.Owner, container.ID); + } + return Spawn(prototype, Transform(uid).Coordinates); + } + + // Frontier: hacky misuse of the activation verb, but allows us a separate way to draw cards without needing additional buttons and event fiddling + private void OnActivationVerb(EntityUid uid, CardComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract || args.Hands == null) + return; + + if (args.Using == args.Target) + return; + + if (HasComp(uid)) + return; + + if (args.Using == null) + { + args.Verbs.Add(new ActivationVerb() + { + Act = () => _hands.TryPickupAnyHand(args.User, args.Target), + Text = Loc.GetString("cards-verb-draw"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")), + Priority = 16 + }); + } + else if (TryComp(args.Using, out var cardStack)) + { + args.Verbs.Add(new ActivationVerb() + { + Act = () => _cardStack.InsertCardOnStack(args.User, args.Using.Value, cardStack, args.Target), + Text = Loc.GetString("cards-verb-draw"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")), + Priority = 16 + }); + } + else if (TryComp(args.Using, out var card)) + { + args.Verbs.Add(new ActivationVerb() + { + Act = () => _cardHand.TrySetupHandOfCards(args.User, args.Using.Value, card, args.Target, component, true), + Text = Loc.GetString("cards-verb-draw"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")), + Priority = 16 + }); + } + } + // End Frontier + + private void OnActivate(EntityUid uid, CardComponent component, ActivateInWorldEvent args) + { + if (!args.Complex || args.Handled) + return; + + if (!TryComp(args.User, out var hands)) + return; + + // Card stacks are handled differently + if (HasComp(args.Target)) + return; + + var activeItem = _hands.GetActiveItem((args.User, hands)); + + if (activeItem == null) + { + _hands.TryPickupAnyHand(args.User, args.Target); + } + else if (TryComp(activeItem, out var cardStack)) + { + _cardStack.InsertCardOnStack(args.User, activeItem.Value, cardStack, args.Target); + } + else if (TryComp(activeItem, out var card)) + { + _cardHand.TrySetupHandOfCards(args.User, activeItem.Value, card, args.Target, component, true); + } + } +} diff --git a/Content.Shared/_EstacaoPirata/Cards/Deck/CardDeckComponent.cs b/Content.Shared/_EstacaoPirata/Cards/Deck/CardDeckComponent.cs new file mode 100644 index 00000000000..5467cd3c618 --- /dev/null +++ b/Content.Shared/_EstacaoPirata/Cards/Deck/CardDeckComponent.cs @@ -0,0 +1,28 @@ +using Robust.Shared.Audio; + +namespace Content.Shared._EstacaoPirata.Cards.Deck; + +/// +/// This is used for... +/// +[RegisterComponent] +public sealed partial class CardDeckComponent : Component +{ + [DataField("shuffleSound")] + public SoundSpecifier ShuffleSound = new SoundCollectionSpecifier("cardFan"); + + [DataField("pickUpSound")] + public SoundSpecifier PickUpSound = new SoundCollectionSpecifier("cardSlide"); + + [DataField("placeDownSound")] + public SoundSpecifier PlaceDownSound = new SoundCollectionSpecifier("cardShove"); + + [DataField("yOffset")] + public float YOffset = 0.02f; + + [DataField("scale")] + public float Scale = 1; + + [DataField("limit")] + public int CardLimit = 5; +} diff --git a/Content.Shared/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs b/Content.Shared/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs new file mode 100644 index 00000000000..9d4ae1af82c --- /dev/null +++ b/Content.Shared/_EstacaoPirata/Cards/Deck/CardDeckSystem.cs @@ -0,0 +1,124 @@ +using Content.Shared._EstacaoPirata.Cards.Card; +using Content.Shared._EstacaoPirata.Cards.Stack; +using Content.Shared.Audio; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Interaction; +using Content.Shared.Item; +using Content.Shared.Popups; +using Content.Shared.Verbs; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Containers; +using Robust.Shared.Network; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Robust.Shared.Utility; + +namespace Content.Shared._EstacaoPirata.Cards.Deck; + +/// +/// This handles card decks +/// +/// +public sealed class CardDeckSystem : EntitySystem +{ + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly CardStackSystem _cardStackSystem = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + public readonly EntProtoId CardDeckBaseName = "CardDeckBase"; + + /// + public override void Initialize() + { + SubscribeLocalEvent>(AddTurnOnVerb); + } + + private void AddTurnOnVerb(EntityUid uid, CardDeckComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract || args.Hands == null) + return; + + if (!TryComp(uid, out CardStackComponent? comp)) + return; + + args.Verbs.Add(new AlternativeVerb() + { + Act = () => TryShuffle(uid, component, comp), + Text = Loc.GetString("cards-verb-shuffle"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/die.svg.192dpi.png")), + Priority = 4 + }); + args.Verbs.Add(new AlternativeVerb() + { + Act = () => TrySplit(args.Target, component, comp, args.User), + Text = Loc.GetString("cards-verb-split"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/dot.svg.192dpi.png")), + Priority = 3 + }); + args.Verbs.Add(new AlternativeVerb() + { + Act = () => TryOrganize(uid, component, comp, true), + Text = Loc.GetString("cards-verb-organize-down"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/flip.svg.192dpi.png")), + Priority = 2 + }); + args.Verbs.Add(new AlternativeVerb() + { + Act = () => TryOrganize(uid, component, comp, false), + Text = Loc.GetString("cards-verb-organize-up"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/flip.svg.192dpi.png")), + Priority = 1 + }); + } + + private void TrySplit(EntityUid uid, CardDeckComponent deck, CardStackComponent stack, EntityUid user) + { + if (stack.Cards.Count <= 1) + return; + + _audio.PlayPredicted(deck.PickUpSound, Transform(uid).Coordinates, user); + + if (!_net.IsServer) + return; + + var cardDeck = SpawnInSameParent(CardDeckBaseName, uid); + + EnsureComp(cardDeck, out var deckStack); + + _cardStackSystem.TransferNLastCardFromStacks(user, stack.Cards.Count / 2, uid, stack, cardDeck, deckStack); + _hands.PickupOrDrop(user, cardDeck); + } + + private void TryShuffle(EntityUid deck, CardDeckComponent comp, CardStackComponent? stack) + { + _cardStackSystem.ShuffleCards(deck, stack); + if (_net.IsClient) + return; + + _audio.PlayPvs(comp.ShuffleSound, deck, AudioHelpers.WithVariation(0.05f, _random)); + _popup.PopupEntity(Loc.GetString("card-verb-shuffle-success", ("target", MetaData(deck).EntityName)), deck); + } + + private void TryOrganize(EntityUid deck, CardDeckComponent comp, CardStackComponent? stack, bool isFlipped) + { + if (_net.IsClient) + return; + _cardStackSystem.FlipAllCards(deck, stack, isFlipped: isFlipped); + + _audio.PlayPvs(comp.ShuffleSound, deck, AudioHelpers.WithVariation(0.05f, _random)); + _popup.PopupEntity(Loc.GetString("card-verb-organize-success", ("target", MetaData(deck).EntityName), ("facedown", isFlipped)), deck); + } + + private EntityUid SpawnInSameParent(string prototype, EntityUid uid) + { + if (_container.IsEntityOrParentInContainer(uid) && + _container.TryGetOuterContainer(uid, Transform(uid), out var container)) + { + return SpawnInContainerOrDrop(prototype, container.Owner, container.ID); + } + return Spawn(prototype, Transform(uid).Coordinates); + } +} diff --git a/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandComponent.cs b/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandComponent.cs new file mode 100644 index 00000000000..6842dd946e1 --- /dev/null +++ b/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandComponent.cs @@ -0,0 +1,38 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared._EstacaoPirata.Cards.Hand; + +/// +/// This is used for... +/// +[RegisterComponent] +public sealed partial class CardHandComponent : Component +{ + [DataField("angle")] + public float Angle = 120f; + + [DataField("xOffset")] + public float XOffset = 0.5f; + + [DataField("scale")] + public float Scale = 1; + + [DataField("limit")] + public int CardLimit = 10; + + [DataField("flipped")] + public bool Flipped = false; +} + + +[Serializable, NetSerializable] +public enum CardUiKey : byte +{ + Key +} + +[Serializable, NetSerializable] +public sealed class CardHandDrawMessage(NetEntity card) : BoundUserInterfaceMessage +{ + public NetEntity Card = card; +} diff --git a/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandSystem.cs b/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandSystem.cs new file mode 100644 index 00000000000..6560d60435a --- /dev/null +++ b/Content.Shared/_EstacaoPirata/Cards/Hand/CardHandSystem.cs @@ -0,0 +1,204 @@ +using System.Linq; +using Content.Shared._EstacaoPirata.Cards.Card; +using Content.Shared._EstacaoPirata.Cards.Stack; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Interaction; +using Content.Shared.Popups; +using Content.Shared.Storage.EntitySystems; +using Content.Shared.Verbs; +using Robust.Shared.Containers; +using Robust.Shared.Network; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared._EstacaoPirata.Cards.Hand; + +/// +/// This handles... +/// +public sealed class CardHandSystem : EntitySystem +{ + public readonly EntProtoId CardHandBaseName = "CardHandBase"; + public readonly EntProtoId CardDeckBaseName = "CardDeckBase"; + + [Dependency] private readonly CardStackSystem _cardStack = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly SharedUserInterfaceSystem _ui = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly SharedStorageSystem _storage = default!; // Frontier + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnInteractUsing); + SubscribeLocalEvent(OnCardDraw); + SubscribeLocalEvent(OnStackQuantityChange); + SubscribeLocalEvent>(OnAlternativeVerb); + } + + private void OnStackQuantityChange(EntityUid uid, CardHandComponent comp, CardStackQuantityChangeEvent args) + { + if (_net.IsClient) + return; + + if (!TryComp(uid, out CardStackComponent? stack)) + return; + + var text = args.Type switch + { + StackQuantityChangeType.Added => "cards-stackquantitychange-added", + StackQuantityChangeType.Removed => "cards-stackquantitychange-removed", + StackQuantityChangeType.Joined => "cards-stackquantitychange-joined", + StackQuantityChangeType.Split => "cards-stackquantitychange-split", + _ => "cards-stackquantitychange-unknown" + }; + + _popupSystem.PopupEntity(Loc.GetString(text, ("quantity", stack.Cards.Count)), uid); + + _cardStack.FlipAllCards(uid, stack, comp.Flipped); + } + + private void OnCardDraw(EntityUid uid, CardHandComponent comp, CardHandDrawMessage args) + { + if (!TryComp(uid, out CardStackComponent? stack)) + return; + var cardEnt = GetEntity(args.Card); + if (!_cardStack.TryRemoveCard(uid, cardEnt, stack)) + return; + + if (_net.IsServer) + _storage.PlayPickupAnimation(cardEnt, Transform(cardEnt).Coordinates, Transform(args.Actor).Coordinates, 0); + + _hands.TryPickupAnyHand(args.Actor, cardEnt); + } + + private void OpenHandMenu(EntityUid user, EntityUid hand) + { + if (!TryComp(user, out var actor)) + return; + + _ui.OpenUi(hand, CardUiKey.Key, actor.PlayerSession); + + } + + private void OnAlternativeVerb(EntityUid uid, CardHandComponent comp, GetVerbsEvent args) + { + args.Verbs.Add(new AlternativeVerb() + { + Act = () => OpenHandMenu(args.User, uid), + Text = Loc.GetString("cards-verb-pickcard"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/die.svg.192dpi.png")), + Priority = 4 + }); + args.Verbs.Add(new AlternativeVerb() + { + Act = () => _cardStack.ShuffleCards(uid), + Text = Loc.GetString("cards-verb-shuffle"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/die.svg.192dpi.png")), + Priority = 3 + }); + args.Verbs.Add(new AlternativeVerb() + { + Act = () => FlipCards(uid, comp), + Text = Loc.GetString("cards-verb-flip"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/flip.svg.192dpi.png")), + Priority = 2 + }); + args.Verbs.Add(new AlternativeVerb() + { + Act = () => ConvertToDeck(args.User, uid), + Text = Loc.GetString("cards-verb-convert-to-deck"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/rotate_cw.svg.192dpi.png")), + Priority = 1 + }); + } + + private void OnInteractUsing(EntityUid uid, CardComponent comp, InteractUsingEvent args) + { + if (args.Handled) + return; + + if (HasComp(args.Used) || + !TryComp(args.Used, out CardComponent? usedComp)) + return; + + if (!HasComp(args.Target) && + TryComp(args.Target, out CardComponent? targetCardComp)) + { + TrySetupHandOfCards(args.User, args.Used, usedComp, args.Target, targetCardComp, true); + args.Handled = true; + } + } + + private void ConvertToDeck(EntityUid user, EntityUid hand) + { + if (_net.IsClient) + return; + + var cardDeck = SpawnInSameParent(CardDeckBaseName, hand); + bool isHoldingCards = _hands.IsHolding(user, hand); + + EnsureComp(cardDeck, out var deckStack); + if (!TryComp(hand, out CardStackComponent? handStack)) + return; + _cardStack.TryJoinStacks(cardDeck, hand, deckStack, handStack, null); + + if (isHoldingCards) + _hands.TryPickupAnyHand(user, cardDeck); + } + public void TrySetupHandOfCards(EntityUid user, EntityUid card, CardComponent comp, EntityUid target, CardComponent targetComp, bool pickup) + { + if (_net.IsClient) + return; + var cardHand = SpawnInSameParent(CardHandBaseName, card); + if (TryComp(cardHand, out var handComp)) + handComp.Flipped = targetComp.Flipped; + if (!TryComp(cardHand, out CardStackComponent? stack)) + return; + if (!_cardStack.TryInsertCard(cardHand, card, stack) || !_cardStack.TryInsertCard(cardHand, target, stack)) + return; + if (_net.IsServer) + _storage.PlayPickupAnimation(card, Transform(card).Coordinates, Transform(cardHand).Coordinates, 0); + if (pickup && !_hands.TryPickupAnyHand(user, cardHand)) + return; + _cardStack.FlipAllCards(cardHand, stack, targetComp.Flipped); + } + + public void TrySetupHandFromStack(EntityUid user, EntityUid card, CardComponent comp, EntityUid target, CardStackComponent targetComp, bool pickup) + { + if (_net.IsClient) + return; + var cardHand = SpawnInSameParent(CardHandBaseName, card); + if (TryComp(cardHand, out var handComp)) + handComp.Flipped = comp.Flipped; + if (!TryComp(cardHand, out CardStackComponent? stack)) + return; + if (!_cardStack.TryInsertCard(cardHand, card, stack)) + return; + _cardStack.TransferNLastCardFromStacks(user, 1, target, targetComp, cardHand, stack); + if (pickup && !_hands.TryPickupAnyHand(user, cardHand)) + return; + _cardStack.FlipAllCards(cardHand, stack, comp.Flipped); + } + + private void FlipCards(EntityUid hand, CardHandComponent comp) + { + comp.Flipped = !comp.Flipped; + _cardStack.FlipAllCards(hand, null, comp.Flipped); + } + + // Frontier: tries to spawn an entity with the same parent as another given entity. + // Useful when spawning decks/hands in a backpack, for example. + private EntityUid SpawnInSameParent(EntProtoId prototype, EntityUid uid) + { + if (_container.IsEntityOrParentInContainer(uid) && + _container.TryGetOuterContainer(uid, Transform(uid), out var container)) + { + return SpawnInContainerOrDrop(prototype, container.Owner, container.ID); + } + return Spawn(prototype, Transform(uid).Coordinates); + } +} diff --git a/Content.Shared/_EstacaoPirata/Cards/Stack/CardStackComponent.cs b/Content.Shared/_EstacaoPirata/Cards/Stack/CardStackComponent.cs new file mode 100644 index 00000000000..c4bf5450edd --- /dev/null +++ b/Content.Shared/_EstacaoPirata/Cards/Stack/CardStackComponent.cs @@ -0,0 +1,83 @@ +using Robust.Shared.Audio; +using Robust.Shared.Containers; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared._EstacaoPirata.Cards.Stack; + +/// +/// This is used for holding the prototype ids of the cards in the stack or hand. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] + +public sealed partial class CardStackComponent : Component +{ + [DataField("content")] + public List InitialContent = []; + + [DataField("shuffleSound")] + public SoundSpecifier ShuffleSound = new SoundCollectionSpecifier("cardFan"); + + [DataField("pickUpSound")] + public SoundSpecifier PickUpSound = new SoundCollectionSpecifier("cardSlide"); + + [DataField("placeDownSound")] + public SoundSpecifier PlaceDownSound = new SoundCollectionSpecifier("cardShove"); + + + /// + /// The containers that contain the items held in the stack + /// + [ViewVariables] + public Container ItemContainer = default!; + + /// + /// The list EntityUIds of Cards + /// + [DataField, AutoNetworkedField] + public List Cards = []; +} + +[Serializable, NetSerializable] +public sealed class CardStackInitiatedEvent(NetEntity cardStack) : EntityEventArgs +{ + public NetEntity CardStack = cardStack; +} + +/// +/// This gets Updated when new cards are added or removed from the stack +/// +[Serializable, NetSerializable] +public sealed class CardStackQuantityChangeEvent(NetEntity stack, NetEntity? card, StackQuantityChangeType type) : EntityEventArgs +{ + public NetEntity Stack = stack; + public NetEntity? Card = card; + public StackQuantityChangeType Type = type; +} + +[Serializable, NetSerializable] +public enum StackQuantityChangeType : sbyte +{ + Added, + Removed, + Joined, + Split +} + + + +[Serializable, NetSerializable] +public sealed class CardStackReorderedEvent(NetEntity stack) : EntityEventArgs +{ + public NetEntity Stack = stack; +} + +[Serializable, NetSerializable] +public sealed class CardStackFlippedEvent(NetEntity cardStack) : EntityEventArgs +{ + public NetEntity CardStack = cardStack; +} + + + diff --git a/Content.Shared/_EstacaoPirata/Cards/Stack/CardStackSystem.cs b/Content.Shared/_EstacaoPirata/Cards/Stack/CardStackSystem.cs new file mode 100644 index 00000000000..8317c3cef92 --- /dev/null +++ b/Content.Shared/_EstacaoPirata/Cards/Stack/CardStackSystem.cs @@ -0,0 +1,446 @@ +using System.Linq; +using Content.Shared._EstacaoPirata.Cards.Card; +using Content.Shared._EstacaoPirata.Cards.Deck; +using Content.Shared._EstacaoPirata.Cards.Hand; +using Content.Shared.Examine; +using Content.Shared.Hands.Components; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Interaction; +using Content.Shared.Storage.EntitySystems; +using Content.Shared.Verbs; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Containers; +using Robust.Shared.Map; +using Robust.Shared.Network; +using Robust.Shared.Random; +using Robust.Shared.Utility; + +namespace Content.Shared._EstacaoPirata.Cards.Stack; + +/// +/// This handles stack of cards. +/// It is used to shuffle, flip, insert, remove, and join stacks of cards. +/// It also handles the events related to the stack of cards. +/// +public sealed class CardStackSystem : EntitySystem +{ + public const string ContainerId = "cardstack-container"; + public const int MaxCardsInStack = 212; // Frontier: four 53-card decks. + + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly EntityManager _entityManager = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedStorageSystem _storage = default!; + [Dependency] private readonly CardHandSystem _cardHandSystem = default!; // Frontier + [Dependency] private readonly SharedHandsSystem _hands = default!; + + /// + public override void Initialize() + { + // Pretty much a rip-off of the BinSystem + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnEntRemoved); + SubscribeLocalEvent>(OnAlternativeVerb); + SubscribeLocalEvent>(OnActivationVerb); + SubscribeLocalEvent(OnActivate); + SubscribeLocalEvent(OnExamine); + SubscribeLocalEvent(OnInteractUsing); + } + + public bool TryRemoveCard(EntityUid uid, EntityUid card, CardStackComponent? comp = null) + { + if (!Resolve(uid, ref comp)) + return false; + + if (!TryComp(card, out CardComponent? _)) + return false; + + _container.Remove(card, comp.ItemContainer); + comp.Cards.Remove(card); + + Dirty(uid, comp); + + RaiseLocalEvent(uid, new CardStackQuantityChangeEvent(GetNetEntity(uid), GetNetEntity(card), StackQuantityChangeType.Removed)); + RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(uid), GetNetEntity(card), StackQuantityChangeType.Removed)); + // Prevents prediction ruining things + if (_net.IsServer && comp.Cards.Count <= 0) + { + _entityManager.DeleteEntity(uid); + } + return true; + } + + public bool TryInsertCard(EntityUid uid, EntityUid card, CardStackComponent? comp = null) + { + if (!Resolve(uid, ref comp)) + return false; + + if (!TryComp(card, out CardComponent? _)) + return false; + + if (comp.Cards.Count >= MaxCardsInStack) + return false; + + _container.Insert(card, comp.ItemContainer); + comp.Cards.Add(card); + + Dirty(uid, comp); + RaiseLocalEvent(uid, new CardStackQuantityChangeEvent(GetNetEntity(uid), GetNetEntity(card), StackQuantityChangeType.Added)); + RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(uid), GetNetEntity(card), StackQuantityChangeType.Added)); + return true; + } + + public bool ShuffleCards(EntityUid uid, CardStackComponent? comp = null) + { + if (!Resolve(uid, ref comp)) + return false; + + _random.Shuffle(comp.Cards); + + Dirty(uid, comp); + RaiseLocalEvent(uid, new CardStackReorderedEvent(GetNetEntity(uid))); + RaiseNetworkEvent(new CardStackReorderedEvent(GetNetEntity(uid))); + return true; + } + + /// + /// Server-Side only method to flip all cards within a stack. This starts CardFlipUpdatedEvent and CardStackFlippedEvent event + /// + /// + /// + /// If null, all cards will just invert direction, if it contains a value, then all cards will receive that value + /// + public bool FlipAllCards(EntityUid uid, CardStackComponent? comp = null, bool? isFlipped = null) + { + if (_net.IsClient) + return false; + if (!Resolve(uid, ref comp)) + return false; + foreach (var card in comp.Cards) + { + if (!TryComp(card, out CardComponent? cardComponent)) + continue; + + cardComponent.Flipped = isFlipped ?? !cardComponent.Flipped; + + Dirty(card, cardComponent); + RaiseNetworkEvent(new CardFlipUpdatedEvent(GetNetEntity(card))); + } + + RaiseNetworkEvent(new CardStackFlippedEvent(GetNetEntity(uid))); + return true; + } + + public bool TryJoinStacks(EntityUid firstStack, EntityUid secondStack, CardStackComponent? firstComp = null, CardStackComponent? secondComp = null, EntityUid? soundUser = null) + { + if (firstStack == secondStack) + return false; + if (!Resolve(firstStack, ref firstComp) || !Resolve(secondStack, ref secondComp)) + return false; + + bool changed = false; + var cardList = secondComp.Cards.ToList(); + EntityUid? firstCard = secondComp.Cards.Count > 0 ? cardList[0] : null; // Cache the first card transferred for animations (better to have something moving than nothing, and we destroy the other stack) + + foreach (var card in cardList) + { + if (firstComp.Cards.Count >= MaxCardsInStack) + break; + _container.Remove(card, secondComp.ItemContainer); + secondComp.Cards.Remove(card); + firstComp.Cards.Add(card); + _container.Insert(card, firstComp.ItemContainer); + changed = true; + } + if (changed) + { + if (_net.IsClient) + return changed; + + if (soundUser != null) + { + _audio.PlayPredicted(firstComp.PlaceDownSound, Transform(firstStack).Coordinates, soundUser.Value); + + _storage.PlayPickupAnimation(firstCard!.Value, Transform(secondStack).Coordinates, Transform(firstStack).Coordinates, 0); + } + + Dirty(firstStack, firstComp); + if (secondComp.Cards.Count <= 0) + { + _entityManager.DeleteEntity(secondStack); + } + else + { + Dirty(secondStack, secondComp); + RaiseLocalEvent(secondStack, new CardStackQuantityChangeEvent(GetNetEntity(secondStack), null, StackQuantityChangeType.Split)); + RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(secondStack), null, StackQuantityChangeType.Split)); + } + RaiseLocalEvent(firstStack, new CardStackQuantityChangeEvent(GetNetEntity(firstStack), null, StackQuantityChangeType.Joined)); + RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(firstStack), null, StackQuantityChangeType.Joined)); + } + + return changed; + } + + #region EventHandling + + private void OnStartup(EntityUid uid, CardStackComponent component, ComponentStartup args) + { + component.ItemContainer = _container.EnsureContainer(uid, ContainerId); + } + + private void OnMapInit(EntityUid uid, CardStackComponent comp, MapInitEvent args) + { + if (_net.IsClient) + return; + + var coordinates = Transform(uid).Coordinates; + foreach (var id in comp.InitialContent) + { + var ent = Spawn(id, coordinates); + if (TryInsertCard(uid, ent, comp)) + continue; + Log.Error($"Entity {ToPrettyString(ent)} was unable to be initialized into stack {ToPrettyString(uid)}"); + return; + } + RaiseNetworkEvent(new CardStackInitiatedEvent(GetNetEntity(uid))); + } + + // It seems the cards don't get removed if this event is not subscribed... strange right? thanks again bin system + private void OnEntRemoved(EntityUid uid, CardStackComponent component, EntRemovedFromContainerMessage args) + { + component.Cards.Remove(args.Entity); + } + + private void OnExamine(EntityUid uid, CardStackComponent component, ExaminedEvent args) + { + args.PushText(Loc.GetString("card-stack-examine", ("count", component.Cards.Count))); + } + + private void OnAlternativeVerb(EntityUid uid, CardStackComponent component, GetVerbsEvent args) + { + if (args.Using == args.Target) + return; + if (!TryComp(args.Target, out CardStackComponent? targetStack)) + return; + + if (TryComp(args.Using, out CardStackComponent? usingStack)) + { + args.Verbs.Add(new AlternativeVerb() + { + Text = Loc.GetString("card-verb-join"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")), + Priority = 8, + Act = () => JoinStacks(args.User, args.Target, targetStack, (EntityUid)args.Using, usingStack) + }); + } + else if (TryComp(args.Using, out CardComponent? usingCard)) // Frontier: single card interaction + { + args.Verbs.Add(new AlternativeVerb() + { + Text = Loc.GetString("card-verb-join"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")), + Priority = 8, + Act = () => InsertCardOnStack(args.User, args.Target, targetStack, (EntityUid)args.Using) + }); + } // End Frontier: single card interaction + } + + // Frontier: hacky misuse of the activation verb, but allows us a separate way to draw cards without needing additional buttons and event fiddling + private void OnActivationVerb(EntityUid uid, CardStackComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract || args.Hands == null) + return; + + if (args.Using == args.Target) + return; + + if (args.Using == null) + { + args.Verbs.Add(new ActivationVerb() + { + Act = () => OnInteractHand(args.Target, component, args.User), + Text = Loc.GetString("cards-verb-draw"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")), + Priority = 16 + }); + } + else if (TryComp(args.Using, out var cardStack)) + { + args.Verbs.Add(new ActivationVerb() + { + Act = () => TransferNLastCardFromStacks(args.User, 1, args.Target, component, args.Using.Value, cardStack), + Text = Loc.GetString("cards-verb-draw"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")), + Priority = 16 + }); + } + else if (TryComp(args.Using, out var card)) + { + args.Verbs.Add(new ActivationVerb() + { + Act = () => _cardHandSystem.TrySetupHandFromStack(args.User, args.Using.Value, card, args.Target, component, true), + Text = Loc.GetString("cards-verb-draw"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")), + Priority = 16 + }); + } + } + // End Frontier + + private void JoinStacks(EntityUid user, EntityUid first, CardStackComponent firstComp, EntityUid second, CardStackComponent secondComp) + { + if (_net.IsServer) + { + TryJoinStacks(first, second, firstComp, secondComp, user); + } + else + { + if (firstComp.Cards.Count < MaxCardsInStack) + _audio.PlayPredicted(firstComp.PlaceDownSound, Transform(first).Coordinates, user); + } + } + + public void InsertCardOnStack(EntityUid user, EntityUid stack, CardStackComponent stackComponent, EntityUid card) + { + if (!TryInsertCard(stack, card)) + return; + + _audio.PlayPredicted(stackComponent.PlaceDownSound, Transform(stack).Coordinates, user); + if (_net.IsClient) + return; + _storage.PlayPickupAnimation(card, Transform(user).Coordinates, Transform(stack).Coordinates, 0); + } + + /// + /// This takes the last card from the first stack and inserts it into the second stack + /// + public void TransferNLastCardFromStacks(EntityUid user, int n, EntityUid first, CardStackComponent firstComp, EntityUid second, CardStackComponent secondComp) + { + if (firstComp.Cards.Count <= 0) + return; + + var cards = firstComp.Cards.TakeLast(n).ToList(); // Frontier: make a copy we don't munge during iteration + + var firstCard = cards.First(); // Cache first card for animation - enumerable changes in foreach + + bool changed = false; + foreach (var card in cards) + { + if (secondComp.Cards.Count >= MaxCardsInStack) + break; + _container.Remove(card, firstComp.ItemContainer); + firstComp.Cards.Remove(card); + secondComp.Cards.Add(card); + _container.Insert(card, secondComp.ItemContainer); + changed = true; + } + + if (changed) + { + _audio.PlayPredicted(firstComp.PlaceDownSound, Transform(second).Coordinates, user); + if (_net.IsClient) + return; + + _storage.PlayPickupAnimation(firstCard, Transform(first).Coordinates, Transform(second).Coordinates, 0); + + Dirty(second, secondComp); + if (firstComp.Cards.Count <= 0) + { + _entityManager.DeleteEntity(first); + } + else + { + Dirty(first, firstComp); + RaiseLocalEvent(first, new CardStackQuantityChangeEvent(GetNetEntity(first), null, StackQuantityChangeType.Removed)); + RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(first), null, StackQuantityChangeType.Removed)); + } + RaiseLocalEvent(second, new CardStackQuantityChangeEvent(GetNetEntity(second), null, StackQuantityChangeType.Added)); + RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(second), null, StackQuantityChangeType.Added)); + } + } + + private void OnInteractUsing(InteractUsingEvent args) + { + if (args.Handled) + return; + + // This checks if the user is using an item with Stack component + if (TryComp(args.Used, out CardStackComponent? usedStack)) + { + // If the target is a card, then it will insert the card into the stack + if (TryComp(args.Target, out CardComponent? _)) + { + InsertCardOnStack(args.User, args.Used, usedStack, args.Target); + args.Handled = true; + return; + } + + // If instead, the target is a stack, then it will join the two stacks + if (!TryComp(args.Target, out CardStackComponent? targetStack)) + return; + + TransferNLastCardFromStacks(args.User, 1, args.Target, targetStack, args.Used, usedStack); + args.Handled = true; + } + + // This handles the reverse case, where the user is using a card and inserting it to a stack + else if (TryComp(args.Target, out CardStackComponent? stack)) + { + //InsertCardOnStack(args.User, args.Target, stack, args.Used); // Frontier: old version + if (TryComp(args.Used, out CardComponent? card)) + { + _cardHandSystem.TrySetupHandFromStack(args.User, args.Used, card, args.Target, stack, true); + args.Handled = true; + } + } + } + + private void OnInteractHand(EntityUid uid, CardStackComponent component, EntityUid user) + { + if (component.Cards.Count <= 0) + return; + + if (!component.Cards.TryGetValue(component.Cards.Count - 1, out var card)) + return; + + if (!TryRemoveCard(uid, card, component)) + return; + + _hands.TryPickupAnyHand(user, card); + + if (TryComp(uid, out var deck)) + _audio.PlayPredicted(deck.PickUpSound, Transform(card).Coordinates, user); + else + _audio.PlayPredicted(component.PickUpSound, Transform(card).Coordinates, user); + } + + private void OnActivate(EntityUid uid, CardStackComponent component, ActivateInWorldEvent args) + { + if (!args.Complex || args.Handled) + return; + + if (!TryComp(args.User, out var hands)) + return; + + var activeItem = _hands.GetActiveItem((args.User, hands)); + + if (activeItem == null) + { + OnInteractHand(args.Target, component, args.User); + } + else if (TryComp(activeItem, out var cardStack)) + { + TransferNLastCardFromStacks(args.User, 1, args.Target, component, activeItem.Value, cardStack); + } + else if (TryComp(activeItem, out var card)) + { + _cardHandSystem.TrySetupHandFromStack(args.User, activeItem.Value, card, args.Target, component, true); + } + } + + #endregion +} diff --git a/Content.Shared/_NF/SizeAttribute/ShortWhitelistComponent.cs b/Content.Shared/_NF/SizeAttribute/ShortWhitelistComponent.cs index 5fb2b9611ad..0416f30ac14 100644 --- a/Content.Shared/_NF/SizeAttribute/ShortWhitelistComponent.cs +++ b/Content.Shared/_NF/SizeAttribute/ShortWhitelistComponent.cs @@ -15,4 +15,13 @@ public sealed partial class ShortWhitelistComponent : Component [DataField] public bool CosmeticOnly = true; + + [DataField] + public List? Shape; + + [DataField] + public Vector2i? StoredOffset; + + [DataField] + public float StoredRotation = 0; } diff --git a/Content.Shared/_NF/SizeAttribute/TallWhitelistComponent.cs b/Content.Shared/_NF/SizeAttribute/TallWhitelistComponent.cs index b4faef0fab8..021b428f9e6 100644 --- a/Content.Shared/_NF/SizeAttribute/TallWhitelistComponent.cs +++ b/Content.Shared/_NF/SizeAttribute/TallWhitelistComponent.cs @@ -15,4 +15,13 @@ public sealed partial class TallWhitelistComponent : Component [DataField] public bool CosmeticOnly = true; + + [DataField] + public List? Shape; + + [DataField] + public Vector2i? StoredOffset; + + [DataField] + public float StoredRotation = 0; } diff --git a/README.md b/README.md index 560736bcae5..2247ece7179 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

Frontier Station 14

-Frontier Station 14 is a fork of [Space Station 14](https://github.com/space-wizards/space-station-14) that runs on [Robust Toolbox](https://github.com/space-wizards/RobustToolbox), our homegrown engine written in C#. +Frontier Station 14 is a fork of [Space Station 14](https://github.com/space-wizards/space-station-14) that runs on [Robust Toolbox](https://github.com/space-wizards/RobustToolbox) engine written in C#. This is the primary repo for Frontier Station 14. diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/attributions.yml b/Resources/Audio/EstacaoPirata/Effects/Cards/attributions.yml new file mode 100644 index 00000000000..879bb3bc044 --- /dev/null +++ b/Resources/Audio/EstacaoPirata/Effects/Cards/attributions.yml @@ -0,0 +1,6 @@ +- files: [ "cardFan1.ogg", "cardFan2.ogg", "cardOpenPackage1.ogg", "cardOpenPackage2.ogg", "cardPlace1.ogg", "cardPlace2.ogg", "cardPlace3.ogg", "cardPlace4.ogg", "cardShove1.ogg", "cardShove2.ogg", "cardShove3.ogg", "cardShove4.ogg", "cardShuffle.ogg", "cardSlide1.ogg", "cardSlide2.ogg", "cardSlide3.ogg", "cardSlide4.ogg", "cardSlide5.ogg", "cardSlide6.ogg", "cardSlide7.ogg", "cardSlide8.ogg", "cardTakeOutPackage1.ogg", "cardTakeOutPackage2.ogg"] + license: "CC0-1.0" + copyright: "Kenney.nl" + source: "https://opengameart.org/content/54-casino-sound-effects-cards-dice-chips" + + diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardFan1.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardFan1.ogg new file mode 100644 index 00000000000..6d059e204b8 Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardFan1.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardFan2.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardFan2.ogg new file mode 100644 index 00000000000..b744067444a Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardFan2.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardOpenPackage1.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardOpenPackage1.ogg new file mode 100644 index 00000000000..9d04ade0be6 Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardOpenPackage1.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardOpenPackage2.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardOpenPackage2.ogg new file mode 100644 index 00000000000..32afa72eb7b Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardOpenPackage2.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace1.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace1.ogg new file mode 100644 index 00000000000..61d8b7170f7 Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace1.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace2.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace2.ogg new file mode 100644 index 00000000000..827baa8dfd6 Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace2.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace3.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace3.ogg new file mode 100644 index 00000000000..7f1b11ce4c9 Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace3.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace4.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace4.ogg new file mode 100644 index 00000000000..088455b47db Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardPlace4.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove1.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove1.ogg new file mode 100644 index 00000000000..89fb73a9a55 Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove1.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove2.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove2.ogg new file mode 100644 index 00000000000..5b625d30124 Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove2.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove3.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove3.ogg new file mode 100644 index 00000000000..282d1a870ea Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove3.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove4.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove4.ogg new file mode 100644 index 00000000000..cc10d9248d5 Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShove4.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardShuffle.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShuffle.ogg new file mode 100644 index 00000000000..6b2724fe5ea Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardShuffle.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide1.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide1.ogg new file mode 100644 index 00000000000..9545e244850 Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide1.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide2.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide2.ogg new file mode 100644 index 00000000000..d41969c20b8 Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide2.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide3.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide3.ogg new file mode 100644 index 00000000000..4e229522176 Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide3.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide4.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide4.ogg new file mode 100644 index 00000000000..47dd7e9032f Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide4.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide5.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide5.ogg new file mode 100644 index 00000000000..281d89da0af Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide5.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide6.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide6.ogg new file mode 100644 index 00000000000..b11d1b90927 Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide6.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide7.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide7.ogg new file mode 100644 index 00000000000..700e64b893b Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide7.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide8.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide8.ogg new file mode 100644 index 00000000000..8aff3ea887b Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardSlide8.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage1.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage1.ogg new file mode 100644 index 00000000000..cc90ece1584 Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage1.ogg differ diff --git a/Resources/Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage2.ogg b/Resources/Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage2.ogg new file mode 100644 index 00000000000..95755e66144 Binary files /dev/null and b/Resources/Audio/EstacaoPirata/Effects/Cards/cardTakeOutPackage2.ogg differ diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 38c7f90f48f..ebd99f032e5 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -6890,3 +6890,211 @@ Entries: message: The power monitoring console should work correctly. id: 5263 time: '2024-09-11T16:38:56.0000000+00:00' +- author: GreaseMonk + changes: + - type: Fix + message: shipyard rcd reclaiming for much more than it is to make one. + id: 5264 + time: '2024-09-13T11:39:48.0000000+00:00' +- author: arimah + changes: + - type: Fix + message: Mattresses now break into just cloth, no more steel. + id: 5265 + time: '2024-09-13T11:41:45.0000000+00:00' +- author: arimah + changes: + - type: Add + message: Raw meatballs can now be cooked on a grill or in a microwave. Yum! + id: 5266 + time: '2024-09-13T21:55:50.0000000+00:00' +- author: whatston3 + changes: + - type: Fix + message: >- + The RPED and other area insert items can pick up single item sets when + clicking on the floor. + id: 5267 + time: '2024-09-14T14:50:55.0000000+00:00' +- author: whatston3 + changes: + - type: Fix + message: >- + The station records computer should now properly list all jobs whenever + possible. + id: 5268 + time: '2024-09-14T15:33:23.0000000+00:00' +- author: whatston3 + changes: + - type: Fix + message: Fixed ghost role whitelist requirement checks. + id: 5269 + time: '2024-09-14T15:44:56.0000000+00:00' +- author: erhardsteinhauer and whatston3 + changes: + - type: Add + message: Added a pouch for pipe-weed. Can be recycled and/or butchered for cloth. + - type: Add + message: >- + Added 3 more pipe-smokeable tobacco powders: stonecut tobacco, fungal + whiff tobacco and sweet dreams tobacco. All are lased with questionable + chemicals. Can't be grown in hydroponics. + - type: Add + message: Added pipe-weed pouches to ShadyCigs and as a loadout option. + - type: Add + message: >- + Added new microwave recipe - dried shrooms: spaceshrooms + chanterelle + + fly amanita for 15 seconds which gives you dried shrooms that can be + ground into fungal whiff tobacco. + id: 5270 + time: '2024-09-14T16:07:16.0000000+00:00' +- author: dvir001 + changes: + - type: Tweak + message: >- + When an item is picked up by a mech, anything buckled onto it is + unbuckled first. + id: 5271 + time: '2024-09-14T16:48:05.0000000+00:00' +- author: whatston3 + changes: + - type: Tweak + message: The M_EMP generator no longer affects the ship it is on. + - type: Remove + message: The Marauder is no longer EMP immune. + id: 5272 + time: '2024-09-14T19:55:12.0000000+00:00' +- author: whatston3 + changes: + - type: Fix + message: >- + Bluespace events should now spawn again, and are scheduled separately + from other events. + - type: Tweak + message: >- + False alarms are more rare, NFSD/Frontier bank accounts are rewarded + less for event completion. + - type: Remove + message: The CentDrobe has been removed from the Vault bluespace event. + id: 5273 + time: '2024-09-14T21:09:57.0000000+00:00' +- author: Leander + changes: + - type: Add + message: Trinkets loadout now comes with a pack of play cards. + - type: Add + message: >- + Ported playing cards, now gamble away all your money playing poker and + other games! + id: 5274 + time: '2024-09-14T23:33:18.0000000+00:00' +- author: ray-boop + changes: + - type: Add + message: >- + Added a set of new drinks for bartenders to mix: Gin and Sonic, Golden + Cat, Pineapple Blast, Torpedo Juice and the Bee's Knees. + id: 5275 + time: '2024-09-16T05:34:32.0000000+00:00' +- author: whatston3 + changes: + - type: Fix + message: >- + The biker jacket is purchasable again from Contractor, Pilot, and Merc + loadouts. + id: 5276 + time: '2024-09-16T05:40:54.0000000+00:00' +- author: erhardsteinhauer + changes: + - type: Add + message: Added Arcadia Ind. flak trenchcoat and 'tactical' jumpsuit. + - type: Fix + message: Classified Arcadia Industries items as C3-contraband. + id: 5277 + time: '2024-09-16T12:49:23.0000000+00:00' +- author: MagnusCrowe and GhostPrinceLost + changes: + - type: Add + message: Added NFSD docking ports and external airlocks! + - type: Add + message: Added 9 NFSD themed signs! + id: 5278 + time: '2024-09-16T21:37:35.0000000+00:00' +- author: RealJoesphStalin + changes: + - type: Tweak + message: Added encryption keys to the astrovend. + id: 5279 + time: '2024-09-16T22:28:49.0000000+00:00' +- author: whatston3 + changes: + - type: Fix + message: Signing a piece of paper no longer duplicates audio and popup messages. + id: 5280 + time: '2024-09-17T18:52:35.0000000+00:00' +- author: ErhardSteinhauer + changes: + - type: Tweak + message: >- + Dangerous characters with contraband status are no longer referred to as + an "item". + id: 5281 + time: '2024-09-17T18:53:25.0000000+00:00' +- author: VividPups + changes: + - type: Add + message: Brass Knuckles + id: 5282 + time: '2024-09-18T03:09:43.0000000+00:00' +- author: dvir001 + changes: + - type: Add + message: >- + Most jobs now have selectable headset options in their loadouts. Keys + may be included in your backpack. + - type: Fix + message: The PAL can now choose between a jumpsuit and jumpskirt. + id: 5283 + time: '2024-09-18T04:12:12.0000000+00:00' +- author: whatston3 + changes: + - type: Add + message: >- + An extra radar has been added to the Frontier Outpost bridge to monitor + Trade Outpost traffic. + - type: Add + message: >- + The STC now has an off-base office in the Trade Outpost near the gravity + generator. + - type: Fix + message: The SR's main office door is now accessible by the STC. + id: 5284 + time: '2024-09-18T22:30:44.0000000+00:00' +- author: Ghost-Prince + changes: + - type: Add + message: Added Fancy chairs! Use carpet to put cover on wooden chair. + id: 5285 + time: '2024-09-20T09:23:18.0000000+00:00' +- author: whatston3 + changes: + - type: Add + message: The fireaxe can now remove hull plating. + - type: Add + message: >- + A new tool, the maintenance jack, is available from the EngiVend. It can + remove hull plating. + id: 5286 + time: '2024-09-20T09:31:01.0000000+00:00' +- author: erhardsteinhauer + changes: + - type: Add + message: Added bounty hunter mantle and jackboots to the BountyVend. + - type: Tweak + message: Used old HoS trench coat and hat sprites for Bounty Hunter stuff. + - type: Tweak + message: Made inventories of BountyVends on POIs infinite. + - type: Fix + message: Reclassified jackboots, combat boots and combat gloves as C1. + id: 5287 + time: '2024-09-20T10:21:06.0000000+00:00' diff --git a/Resources/Locale/en-US/_NF/contraband/contraband-severity.ftl b/Resources/Locale/en-US/_NF/contraband/contraband-severity.ftl index aa74cda6ce0..64dbbdf7c3b 100644 --- a/Resources/Locale/en-US/_NF/contraband/contraband-severity.ftl +++ b/Resources/Locale/en-US/_NF/contraband/contraband-severity.ftl @@ -8,3 +8,6 @@ contraband-examine-text-Class3Pirate = [color=crimson]This pirate item is consid contraband-examine-text-Class3Syndicate = [color=crimson]This Syndicate item is considered class 3 contraband, and its possession is illegal.[/color] contraband-examine-text-Class3Wizard = [color=crimson]This Wizard item is considered class 3 contraband, and its possession is illegal.[/color] contraband-examine-text-PirateTarget = [color=yellow]This item may be a highly valuable target for pirates![/color] +contraband-examine-text-Class3MobHuman = [color=magenta]This individual is deemed too dangerous to be contained, and is considered as class 3 contraband when in captivity. Keeping them in confinement, alive or dead, is illegal.[/color] +contraband-examine-text-Class3MobCreature = [color=magenta]This creature is deemed too dangerous to be contained, and is considered as class 3 contraband when in captivity. Keeping it in confinement, alive or dead, is illegal.[/color] +contraband-examine-text-Class3MobConstruct = [color=magenta]This intelligence is deemed too dangerous to be contained, and is considered as class 3 contraband when in captivity. Keeping it in confinement, alive or dead, is illegal.[/color] diff --git a/Resources/Locale/en-US/_NF/flavors/flavor-profiles.ftl b/Resources/Locale/en-US/_NF/flavors/flavor-profiles.ftl index 9ef7d59859a..e42086b5c71 100644 --- a/Resources/Locale/en-US/_NF/flavors/flavor-profiles.ftl +++ b/Resources/Locale/en-US/_NF/flavors/flavor-profiles.ftl @@ -1 +1,7 @@ flavor-base-basic = basic +flavor-complex-fast = fast +flavor-complex-greed = like greed +flavor-complex-blast = like jungle warfare +flavor-complex-torpedo = like convoy raiding +flavor-complex-bees = like buzzing and honey +flavor-base-earthy = earthy diff --git a/Resources/Locale/en-US/_NF/preferences/loadout-groups.ftl b/Resources/Locale/en-US/_NF/preferences/loadout-groups.ftl index 3824822afc6..3e79fad732c 100644 --- a/Resources/Locale/en-US/_NF/preferences/loadout-groups.ftl +++ b/Resources/Locale/en-US/_NF/preferences/loadout-groups.ftl @@ -2,6 +2,7 @@ loadout-group-contractor-gloves = gloves loadout-group-contractor-head = head +loadout-group-contractor-ears = ears loadout-group-contractor-jumpsuit = jumpsuit loadout-group-contractor-outerclothing = outer clothing loadout-group-contractor-belt = belt diff --git a/Resources/Locale/en-US/_NF/reagents/meta/consumable/drink/drinks.ftl b/Resources/Locale/en-US/_NF/reagents/meta/consumable/drink/drinks.ftl index 858ae5f354e..87166bd67cb 100644 --- a/Resources/Locale/en-US/_NF/reagents/meta/consumable/drink/drinks.ftl +++ b/Resources/Locale/en-US/_NF/reagents/meta/consumable/drink/drinks.ftl @@ -1,2 +1,17 @@ reagent-name-pumpkin-spice-latte = spiced pumpkin latte reagent-desc-pumpkin-spice-latte = It's autumn somewhere. Smells like cinnamon and cloves. + +reagent-name-gin-and-sonic = gin and sonic +reagent-desc-gin-and-sonic = Why did the hedgehog go to Saturn? To collect its rings! + +reagent-name-golden-cat = golden cat +reagent-desc-golden-cat = Legends speak of a golden cat that sold a burger for a fortune. Has a metallic smell. + +reagent-name-pineapple-blast = pineapple blast +reagent-desc-pineapple-blast = For when the trees start talking. Smells tropical, with notes of sulfur. + +reagent-name-torpedo-juice = torpedo juice +reagent-desc-torpedo-juice = The joys of drinking and unrestricted submarine warfare combined! Has a strong alcoholic smell. + +reagent-name-bees-knees = bee’s knees +reagent-desc-bees-knees = BEEEEEEEEEEEEEEES!!! Has a stingy smell. \ No newline at end of file diff --git a/Resources/Locale/en-US/_NF/reagents/meta/narcotics.ftl b/Resources/Locale/en-US/_NF/reagents/meta/narcotics.ftl new file mode 100644 index 00000000000..20bf64bcc81 --- /dev/null +++ b/Resources/Locale/en-US/_NF/reagents/meta/narcotics.ftl @@ -0,0 +1,5 @@ +reagent-name-rock-dust = rock dust +reagent-desc-rock-dust = A blend of finely pulverized rock minerals suspended in water, presents a murky, earth-toned liquid. + +reagent-name-shroom-mix = shroom mix +reagent-desc-shroom-mix = A blend of cut, chewed and ground partially dried shrooms, suspended in mopwata. diff --git a/Resources/Locale/en-US/_NF/reagents/psicodine.ftl b/Resources/Locale/en-US/_NF/reagents/psicodine.ftl new file mode 100644 index 00000000000..f0ba755b1d0 --- /dev/null +++ b/Resources/Locale/en-US/_NF/reagents/psicodine.ftl @@ -0,0 +1,3 @@ +psicodine-effect-nf-calm = You feel calm and at ease. +psicodine-effect-nf-no-stress = You feel your stress lifting away. +psicodine-effect-nf-everything-is-fine = Everything will be fine. diff --git a/Resources/Locale/en-US/deltav/tools/tool-qualities.ftl b/Resources/Locale/en-US/deltav/tools/tool-qualities.ftl new file mode 100644 index 00000000000..29252751884 --- /dev/null +++ b/Resources/Locale/en-US/deltav/tools/tool-qualities.ftl @@ -0,0 +1,2 @@ +tool-quality-axing-name = Axing +tool-quality-axing-tool-name = Fireaxe diff --git a/Resources/Locale/en-US/estacao-pirata/cards/cards.ftl b/Resources/Locale/en-US/estacao-pirata/cards/cards.ftl new file mode 100644 index 00000000000..cbb2bf3613e --- /dev/null +++ b/Resources/Locale/en-US/estacao-pirata/cards/cards.ftl @@ -0,0 +1,85 @@ +card-examined = This is the {$target}. +cards-verb-shuffle = Shuffle +card-verb-shuffle-success = Cards shuffled +cards-verb-draw = Draw card +cards-verb-flip = Flip cards +card-verb-join = Join cards +card-verb-organize-success = Cards flipped face { $facedown -> + [true] down + *[false] up +} +cards-verb-organize-up = Flip cards face up +cards-verb-organize-down = Flip cards face down +cards-verb-pickcard = Pick a card +card-stack-examine = { $count -> + [one] There is {$count} card in this stack. + *[other] There are {$count} cards in this stack. +} +cards-stackquantitychange-added = Card was added (Total cards: {$quantity}) +cards-stackquantitychange-removed = Card was removed (Total cards: {$quantity}) +cards-stackquantitychange-joined = Stack was merged (Total cards: {$quantity}) +cards-stackquantitychange-split = Stack was split (Total cards: {$quantity}) +cards-stackquantitychange-unknown = Stack count changed (Total cards: {$quantity}) +cards-verb-convert-to-deck = Convert to deck +cards-verb-split = Split in half + +card-base-name = card +card-deck-name = deck of cards + +card-sc-2-clubs-black = 2 of clubs +card-sc-3-clubs-black = 3 of clubs +card-sc-4-clubs-black = 4 of clubs +card-sc-5-clubs-black = 5 of clubs +card-sc-6-clubs-black = 6 of clubs +card-sc-7-clubs-black = 7 of clubs +card-sc-8-clubs-black = 8 of clubs +card-sc-9-clubs-black = 9 of clubs +card-sc-10-clubs-black = 10 of clubs +card-sc-ace-clubs-black = ace of clubs +card-sc-jack-clubs-black = jack of clubs +card-sc-king-clubs-black = king of clubs +card-sc-queen-clubs-black = queen of clubs + +card-sc-2-diamonds-black = 2 of diamonds +card-sc-3-diamonds-black = 3 of diamonds +card-sc-4-diamonds-black = 4 of diamonds +card-sc-5-diamonds-black = 5 of diamonds +card-sc-6-diamonds-black = 6 of diamonds +card-sc-7-diamonds-black = 7 of diamonds +card-sc-8-diamonds-black = 8 of diamonds +card-sc-9-diamonds-black = 9 of diamonds +card-sc-10-diamonds-black = 10 of diamonds +card-sc-ace-diamonds-black = ace of diamonds +card-sc-jack-diamonds-black = jack of diamonds +card-sc-king-diamonds-black = king of diamonds +card-sc-queen-diamonds-black = queen of diamonds + +card-sc-2-hearts-black = 2 of hearts +card-sc-3-hearts-black = 3 of hearts +card-sc-4-hearts-black = 4 of hearts +card-sc-5-hearts-black = 5 of hearts +card-sc-6-hearts-black = 6 of hearts +card-sc-7-hearts-black = 7 of hearts +card-sc-8-hearts-black = 8 of hearts +card-sc-9-hearts-black = 9 of hearts +card-sc-10-hearts-black = 10 of hearts +card-sc-ace-hearts-black = ace of hearts +card-sc-jack-hearts-black = jack of hearts +card-sc-king-hearts-black = king of hearts +card-sc-queen-hearts-black = queen of hearts + +card-sc-2-spades-black = 2 of spades +card-sc-3-spades-black = 3 of spades +card-sc-4-spades-black = 4 of spades +card-sc-5-spades-black = 5 of spades +card-sc-6-spades-black = 6 of spades +card-sc-7-spades-black = 7 of spades +card-sc-8-spades-black = 8 of spades +card-sc-9-spades-black = 9 of spades +card-sc-10-spades-black = 10 of spades +card-sc-ace-spades-black = ace of spades +card-sc-jack-spades-black = jack of spades +card-sc-king-spades-black = king of spades +card-sc-queen-spades-black = queen of spades + +card-sc-joker-black = joker diff --git a/Resources/Locale/pt-BR/estacao-pirata/cards/cards.ftl b/Resources/Locale/pt-BR/estacao-pirata/cards/cards.ftl new file mode 100644 index 00000000000..e3bcadbb2c2 --- /dev/null +++ b/Resources/Locale/pt-BR/estacao-pirata/cards/cards.ftl @@ -0,0 +1,77 @@ +card-examined = Essa é uma {$target}. +cards-verb-shuffle = Embaralhar +card-verb-shuffle-success = Cartas embaralhadas +cards-verb-flip = Virar cartas +card-verb-join = Juntar cartas +card-verb-organize-success = Cartas embaralhadas +card-verb-organize = Organizar cartas +cards-verb-organize-up = Organizar Cartas viradas para cima +cards-verb-organize-down = Organizar Cartas viradas para baixo +cards-verb-pickcard = Pegar carta +card-stack-examine = Este conjunto tem {$count} cartas. +cards-stackquantitychange-added = Carta foi adicionada (Total de cartas: {$quantity}) +cards-stackquantitychange-removed = Carta foi removida (Total de cartas: {$quantity}) +cards-verb-convert-to-deck = Converter em Pilha de Cartas +cards-verb-split = Dividir + +ent-CardBase = Carta +ent-CardDeck = Pilha de cartas +ent-CardDeckBlack = pilha de cartas + +card-sc-2-clubs-black = carta de 2 de Paus (Conjunto Mão do Povo) +card-sc-3-clubs-black = carta de 3 de Paus (Conjunto Mão do Povo) +card-sc-4-clubs-black = carta de 4 de Paus (Conjunto Mão do Povo) +card-sc-5-clubs-black = carta de 5 de Paus (Conjunto Mão do Povo) +card-sc-6-clubs-black = carta de 6 de Paus (Conjunto Mão do Povo) +card-sc-7-clubs-black = carta de 7 de Paus (Conjunto Mão do Povo) +card-sc-8-clubs-black = carta de 8 de Paus (Conjunto Mão do Povo) +card-sc-9-clubs-black = carta de 9 de Paus (Conjunto Mão do Povo) +card-sc-10-clubs-black = carta de 10 de Paus (Conjunto Mão do Povo) +card-sc-ace-clubs-black = carta de Ás de Paus (Conjunto Mão do Povo) +card-sc-jack-clubs-black = carta de Valete de Paus (Conjunto Mão do Povo) +card-sc-king-clubs-black = carta de Rei de Paus (Conjunto Mão do Povo) +card-sc-queen-clubs-black = carta de Rainha de Paus (Conjunto Mão do Povo) + +card-sc-2-diamonds-black = carta de 2 de Ouros (Conjunto Mão do Povo) +card-sc-3-diamonds-black = carta de 3 de Ouros (Conjunto Mão do Povo) +card-sc-4-diamonds-black = carta de 4 de Ouros (Conjunto Mão do Povo) +card-sc-5-diamonds-black = carta de 5 de Ouros (Conjunto Mão do Povo) +card-sc-6-diamonds-black = carta de 6 de Ouros (Conjunto Mão do Povo) +card-sc-7-diamonds-black = carta de 7 de Ouros (Conjunto Mão do Povo) +card-sc-8-diamonds-black = carta de 8 de Ouros (Conjunto Mão do Povo) +card-sc-9-diamonds-black = carta de 9 de Ouros (Conjunto Mão do Povo) +card-sc-10-diamonds-black = carta de 10 de Ouros (Conjunto Mão do Povo) +card-sc-ace-diamonds-black = carta de Ás de Ouros (Conjunto Mão do Povo) +card-sc-jack-diamonds-black = carta de Valete de Ouros (Conjunto Mão do Povo) +card-sc-king-diamonds-black = carta de Rei de Ouros (Conjunto Mão do Povo) +card-sc-queen-diamonds-black = carta de Rainha de Ouros (Conjunto Mão do Povo) + +card-sc-2-hearts-black = carta de 2 de Copas (Conjunto Mão do Povo) +card-sc-3-hearts-black = carta de 3 de Copas (Conjunto Mão do Povo) +card-sc-4-hearts-black = carta de 4 de Copas (Conjunto Mão do Povo) +card-sc-5-hearts-black = carta de 5 de Copas (Conjunto Mão do Povo) +card-sc-6-hearts-black = carta de 6 de Copas (Conjunto Mão do Povo) +card-sc-7-hearts-black = carta de 7 de Copas (Conjunto Mão do Povo) +card-sc-8-hearts-black = carta de 8 de Copas (Conjunto Mão do Povo) +card-sc-9-hearts-black = carta de 9 de Copas (Conjunto Mão do Povo) +card-sc-10-hearts-black = carta de 10 de Copas (Conjunto Mão do Povo) +card-sc-ace-hearts-black = carta de Ás de Copas (Conjunto Mão do Povo) +card-sc-jack-hearts-black = carta de Valete de Copas (Conjunto Mão do Povo) +card-sc-king-hearts-black = carta de Rei de Copas (Conjunto Mão do Povo) +card-sc-queen-hearts-black = carta de Rainha de Copas (Conjunto Mão do Povo) + +card-sc-2-spades-black = carta de 2 de Espadas (Conjunto Mão do Povo) +card-sc-3-spades-black = carta de 3 de Espadas (Conjunto Mão do Povo) +card-sc-4-spades-black = carta de 4 de Espadas (Conjunto Mão do Povo) +card-sc-5-spades-black = carta de 5 de Espadas (Conjunto Mão do Povo) +card-sc-6-spades-black = carta de 6 de Espadas (Conjunto Mão do Povo) +card-sc-7-spades-black = carta de 7 de Espadas (Conjunto Mão do Povo) +card-sc-8-spades-black = carta de 8 de Espadas (Conjunto Mão do Povo) +card-sc-9-spades-black = carta de 9 de Espadas (Conjunto Mão do Povo) +card-sc-10-spades-black = carta de 10 de Espadas (Conjunto Mão do Povo) +card-sc-ace-spades-black = carta de Ás de Espadas (Conjunto Mão do Povo) +card-sc-jack-spades-black = carta de Valete de Espadas (Conjunto Mão do Povo) +card-sc-king-spades-black = carta de Rei de Espadas (Conjunto Mão do Povo) +card-sc-queen-spades-black = carta de Rainha de Espadas (Conjunto Mão do Povo) + +card-sc-joker-black = carta Coringa (Conjunto Mão do Povo) diff --git a/Resources/Maps/_NF/Bluespace/vault.yml b/Resources/Maps/_NF/Bluespace/vault.yml index 2c8792b3494..b108b8cbf6a 100644 --- a/Resources/Maps/_NF/Bluespace/vault.yml +++ b/Resources/Maps/_NF/Bluespace/vault.yml @@ -7594,13 +7594,6 @@ entities: - type: Transform pos: -5.5,-13.5 parent: 1 -- proto: VendingMachineCentDrobe - entities: - - uid: 1162 - components: - - type: Transform - pos: 6.5,3.5 - parent: 1 - proto: WallPlastitanium entities: - uid: 3 diff --git a/Resources/Maps/_NF/Outpost/frontier.yml b/Resources/Maps/_NF/Outpost/frontier.yml index 1c8d7d9c780..1db3b814461 100644 --- a/Resources/Maps/_NF/Outpost/frontier.yml +++ b/Resources/Maps/_NF/Outpost/frontier.yml @@ -43,7 +43,7 @@ entities: chunks: 0,0: ind: 0,0 - tiles: agAAAAACfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAawAAAAAAfQAAAAAAXAAAAAABXAAAAAAAXAAAAAACXAAAAAADXAAAAAACXAAAAAADXAAAAAABXAAAAAADXAAAAAAAXAAAAAABXAAAAAAAXAAAAAACXAAAAAAAXAAAAAACXAAAAAACawAAAAAAXAAAAAABXAAAAAAAXAAAAAAAXAAAAAADXAAAAAADXAAAAAACXAAAAAADXAAAAAADXAAAAAADXAAAAAADXAAAAAADXAAAAAACXAAAAAAAXAAAAAADXAAAAAABawAAAAAAXAAAAAABXAAAAAAAXAAAAAABXAAAAAADXAAAAAACXAAAAAADXAAAAAABXAAAAAAAXAAAAAABXAAAAAABXAAAAAABXAAAAAACXAAAAAAAXAAAAAADXAAAAAACawAAAAAAXAAAAAADXAAAAAAAXAAAAAAAXAAAAAACXAAAAAAAXAAAAAADXAAAAAABXAAAAAADXAAAAAADXAAAAAADXAAAAAAAXAAAAAABXAAAAAADXAAAAAADXAAAAAABawAAAAAAXAAAAAAAXAAAAAADXAAAAAADXAAAAAACXAAAAAABXAAAAAADXAAAAAAAXAAAAAACXAAAAAAAXAAAAAABXAAAAAADXAAAAAACXAAAAAAAXAAAAAADXAAAAAADawAAAAAAXAAAAAAAXAAAAAABXAAAAAADXAAAAAAAXAAAAAACXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAABfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAawAAAAAAawAAAAAAawAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAaAAAAAAAHgAAAAAAHgAAAAADHgAAAAABfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAaAAAAAAAHgAAAAADHgAAAAAAHgAAAAADfQAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAXAAAAAABHgAAAAADHgAAAAABLgAAAAAAHgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAHgAAAAABLgAAAAADHgAAAAABLgAAAAADHgAAAAABLgAAAAABHgAAAAACHgAAAAABXAAAAAADHgAAAAACHgAAAAAAHgAAAAAAHgAAAAACfQAAAAAAAAAAAAAAfQAAAAAAHgAAAAACLgAAAAADHgAAAAAALgAAAAABHgAAAAABLgAAAAABHgAAAAABHgAAAAABaAAAAAAAaAAAAAAAHgAAAAAALgAAAAAAHgAAAAADfQAAAAAAAAAAAAAAfQAAAAAAHgAAAAACHgAAAAADHgAAAAAAHgAAAAADHgAAAAACHgAAAAAAHgAAAAACHgAAAAADXAAAAAAAaAAAAAAAHgAAAAAAHgAAAAADHgAAAAACfQAAAAAAAAAAAAAAfQAAAAAAHgAAAAABHgAAAAABHgAAAAADHgAAAAACHgAAAAAAHgAAAAABHgAAAAABHgAAAAABfQAAAAAAXAAAAAADHgAAAAACLgAAAAADHgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAHgAAAAABHgAAAAADHgAAAAACLgAAAAACLgAAAAACHgAAAAACXAAAAAADawAAAAAAHgAAAAACHgAAAAAAHgAAAAABawAAAAAAHgAAAAACHgAAAAAAHgAAAAACawAAAAAAHgAAAAABHgAAAAAALgAAAAABHgAAAAACHgAAAAACLgAAAAAB + tiles: agAAAAACfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAawAAAAAAfQAAAAAAXAAAAAABXAAAAAAAXAAAAAACXAAAAAADXAAAAAACXAAAAAADXAAAAAABXAAAAAADXAAAAAAAXAAAAAABXAAAAAAAXAAAAAACXAAAAAAAXAAAAAACXAAAAAACawAAAAAAXAAAAAABXAAAAAAAXAAAAAAAXAAAAAADXAAAAAADXAAAAAACXAAAAAADXAAAAAADXAAAAAADXAAAAAADXAAAAAADXAAAAAACXAAAAAAAXAAAAAADXAAAAAABawAAAAAAXAAAAAABXAAAAAAAXAAAAAABXAAAAAADXAAAAAACXAAAAAADXAAAAAABXAAAAAAAXAAAAAABXAAAAAABXAAAAAABXAAAAAACXAAAAAAAXAAAAAADXAAAAAACawAAAAAAXAAAAAADXAAAAAAAXAAAAAAAXAAAAAACXAAAAAAAXAAAAAADXAAAAAABXAAAAAADXAAAAAADXAAAAAADXAAAAAAAXAAAAAABXAAAAAADXAAAAAADXAAAAAABawAAAAAAXAAAAAAAXAAAAAADXAAAAAADXAAAAAACXAAAAAABXAAAAAADXAAAAAAAXAAAAAACXAAAAAAAXAAAAAABXAAAAAADXAAAAAACXAAAAAAAXAAAAAADXAAAAAADawAAAAAAXAAAAAAAXAAAAAABXAAAAAADXAAAAAAAXAAAAAACXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAABfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAawAAAAAAawAAAAAAawAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAaAAAAAAAHgAAAAAAHgAAAAADHgAAAAABfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAaAAAAAAAHgAAAAADHgAAAAAAHgAAAAADfQAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAXAAAAAABHgAAAAADHgAAAAABLgAAAAAAHgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAHgAAAAABLgAAAAADHgAAAAABLgAAAAADHgAAAAABLgAAAAABHgAAAAACLgAAAAAAXAAAAAADHgAAAAACHgAAAAAAHgAAAAAAHgAAAAACfQAAAAAAAAAAAAAAfQAAAAAAHgAAAAACLgAAAAADHgAAAAAALgAAAAABHgAAAAABLgAAAAABHgAAAAABLgAAAAABaAAAAAAAaAAAAAAAHgAAAAAALgAAAAAAHgAAAAADfQAAAAAAAAAAAAAAfQAAAAAAHgAAAAACHgAAAAADHgAAAAAAHgAAAAADHgAAAAACHgAAAAAAHgAAAAACHgAAAAADXAAAAAAAaAAAAAAAHgAAAAAAHgAAAAADHgAAAAACfQAAAAAAAAAAAAAAfQAAAAAAHgAAAAABHgAAAAABHgAAAAADHgAAAAACHgAAAAAAHgAAAAABHgAAAAABHgAAAAABfQAAAAAAXAAAAAADHgAAAAACLgAAAAADHgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAHgAAAAABHgAAAAADHgAAAAACLgAAAAACLgAAAAACHgAAAAACXAAAAAADawAAAAAAHgAAAAACHgAAAAAAHgAAAAABawAAAAAAHgAAAAACHgAAAAAAHgAAAAACawAAAAAAHgAAAAABHgAAAAAALgAAAAABHgAAAAACHgAAAAACLgAAAAAB version: 6 -1,0: ind: -1,0 @@ -266,7 +266,6 @@ entities: 259: 9,11 260: 9,10 261: 11,11 - 262: 11,10 263: 13,11 264: 13,10 265: 12,15 @@ -281,6 +280,9 @@ entities: 2031: -5,12 2032: -5,14 2033: -5,17 + 2492: 11,10 + 2494: 15,10 + 2495: 15,11 - node: cleanable: True color: '#FFFFFFFF' @@ -776,6 +778,12 @@ entities: 256: 6,18 257: 7,18 258: 8,18 + - node: + color: '#D381C996' + id: BrickTileWhiteLineS + decals: + 2474: 14,12 + 2475: 15,12 - node: color: '#DE3A3A96' id: BrickTileWhiteLineS @@ -827,6 +835,12 @@ entities: id: BrickTileWhiteLineW decals: 2402: 16,15 + - node: + color: '#D381C996' + id: BrickTileWhiteLineW + decals: + 2472: 14,10 + 2473: 14,11 - node: color: '#DE3A3A96' id: BrickTileWhiteLineW @@ -1348,9 +1362,6 @@ entities: 1757: 16,15 1758: 17,14 1759: 16,11 - 1760: 15,10 - 1761: 15,10 - 1762: 15,11 1763: 16,10 1764: 17,11 1765: 17,11 @@ -1816,6 +1827,7 @@ entities: 2391: 0,21 2440: -37,12 2441: -38,12 + 2493: 11,10 - node: cleanable: True zIndex: 180 @@ -2234,8 +2246,6 @@ entities: 1777: 17,15 1778: 17,16 1779: 17,13 - 1780: 15,11 - 1781: 15,10 1782: 14,10 1783: 7,15 1784: 8,16 @@ -2306,6 +2316,8 @@ entities: 2348: 40,10 2349: 37,11 2439: -35,12 + 2496: 15,10 + 2497: 15,11 - node: cleanable: True zIndex: 180 @@ -3966,12 +3978,12 @@ entities: id: Frontier - type: StationTransit - type: ProtectedGrid - preventFloorRemoval: true - preventFloorPlacement: true - preventRCDUse: true - preventEmpEvents: true - preventExplosions: true - preventArtifactTriggers: true + preventArtifactTriggers: True + preventExplosions: True + preventEmpEvents: True + preventRCDUse: True + preventFloorPlacement: True + preventFloorRemoval: True - type: SpreaderGrid - type: IFF readOnly: True @@ -4358,6 +4370,11 @@ entities: rot: 1.5707963267948966 rad pos: 9.5,15.5 parent: 2173 + - uid: 2550 + components: + - type: Transform + pos: 7.5,17.5 + parent: 2173 - uid: 3955 components: - type: Transform @@ -4435,13 +4452,6 @@ entities: rot: 3.141592653589793 rad pos: -39.5,7.5 parent: 2173 -- proto: AirlockFrontierCommandGlassLocked - entities: - - uid: 2550 - components: - - type: Transform - pos: 7.5,17.5 - parent: 2173 - proto: AirlockGlass entities: - uid: 529 @@ -14115,6 +14125,18 @@ entities: parent: 2173 - proto: ChairOfficeDark entities: + - uid: 2129 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 15.5,11.5 + parent: 2173 + - uid: 2130 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 15.5,10.5 + parent: 2173 - uid: 2151 components: - type: Transform @@ -14508,6 +14530,14 @@ entities: rot: 1.5707963267948966 rad pos: 3.5,22.5 parent: 2173 +- proto: ComputerTabletopAlert + entities: + - uid: 2128 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 14.5,11.5 + parent: 2173 - proto: ComputerTabletopCargoOrders entities: - uid: 2832 @@ -14518,11 +14548,10 @@ entities: parent: 2173 - proto: ComputerTabletopComms entities: - - uid: 816 + - uid: 815 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 12.5,15.5 + pos: 14.5,16.5 parent: 2173 - proto: ComputerTabletopCrewMonitoring entities: @@ -14588,19 +14617,28 @@ entities: - type: Transform pos: -0.5,4.5 parent: 2173 -- proto: ComputerTabletopShuttle +- proto: ComputerTabletopShuttleFrontierOutpostLocal entities: - uid: 814 components: - type: Transform pos: 13.5,16.5 parent: 2173 +- proto: ComputerTabletopShuttleTradeOutpostRemote + entities: + - uid: 731 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 12.5,15.5 + parent: 2173 - proto: ComputerTabletopSurveillanceCameraMonitor entities: - - uid: 815 + - uid: 816 components: - type: Transform - pos: 14.5,16.5 + rot: -1.5707963267948966 rad + pos: 15.5,15.5 parent: 2173 - uid: 2764 components: @@ -14610,11 +14648,11 @@ entities: parent: 2173 - proto: ComputerTabletopSurveillanceWirelessCameraMonitor entities: - - uid: 731 + - uid: 2127 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 15.5,15.5 + rot: 1.5707963267948966 rad + pos: 14.5,10.5 parent: 2173 - proto: ComputerTelevision entities: @@ -33014,6 +33052,16 @@ entities: - type: Transform pos: 6.5,18.5 parent: 2173 + - uid: 2125 + components: + - type: Transform + pos: 14.5,11.5 + parent: 2173 + - uid: 2126 + components: + - type: Transform + pos: 14.5,10.5 + parent: 2173 - uid: 2410 components: - type: Transform @@ -33292,7 +33340,7 @@ entities: pos: 51.5,9.5 parent: 2173 - type: DisableToolUse - anchoring: true + anchoring: True - proto: TwoWayLever entities: - uid: 6145 @@ -37251,6 +37299,23 @@ entities: rot: 1.5707963267948966 rad pos: 15.5,16.5 parent: 2173 + - uid: 2122 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 13.5,10.5 + parent: 2173 + - uid: 2123 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 13.5,11.5 + parent: 2173 + - uid: 2124 + components: + - type: Transform + pos: 14.5,12.5 + parent: 2173 - uid: 2563 components: - type: Transform diff --git a/Resources/Maps/_NF/POI/caseyscasino.yml b/Resources/Maps/_NF/POI/caseyscasino.yml index 74a32fa5137..16e2cc2d1e3 100644 --- a/Resources/Maps/_NF/POI/caseyscasino.yml +++ b/Resources/Maps/_NF/POI/caseyscasino.yml @@ -862,13 +862,6 @@ entities: - type: Transform pos: 16.5,-5.5 parent: 2 -- proto: BackgammonBoard - entities: - - uid: 450 - components: - - type: Transform - pos: 1.5735054,-0.2374655 - parent: 2 - proto: BarSignTheHarmbaton entities: - uid: 113 @@ -957,17 +950,11 @@ entities: - type: Transform pos: 8.5,-0.5 parent: 2 - - type: DeviceLinkSink - links: - - 1179 - uid: 1027 components: - type: Transform pos: 8.5,0.5 parent: 2 - - type: DeviceLinkSink - links: - - 1179 - proto: BoozeDispenser entities: - uid: 474 @@ -2469,6 +2456,18 @@ entities: rot: 3.141592653589793 rad pos: -6.5,6.5 parent: 2 +- proto: CardBoxBlack + entities: + - uid: 450 + components: + - type: Transform + pos: 1.5656135,-0.21679902 + parent: 2 + - uid: 487 + components: + - type: Transform + pos: 13.020431,4.016234 + parent: 2 - proto: CarpetOrange entities: - uid: 158 @@ -6675,113 +6674,71 @@ entities: - type: Transform pos: 0.5,3.5 parent: 2 - - type: DeviceLinkSink - links: - - 777 - uid: 1010 components: - type: Transform pos: -0.5,3.5 parent: 2 - - type: DeviceLinkSink - links: - - 777 - uid: 1011 components: - type: Transform pos: -2.5,3.5 parent: 2 - - type: DeviceLinkSink - links: - - 777 - uid: 1012 components: - type: Transform pos: -1.5,3.5 parent: 2 - - type: DeviceLinkSink - links: - - 777 - uid: 1013 components: - type: Transform pos: 2.5,3.5 parent: 2 - - type: DeviceLinkSink - links: - - 777 - uid: 1014 components: - type: Transform pos: 1.5,3.5 parent: 2 - - type: DeviceLinkSink - links: - - 777 - uid: 1015 components: - type: Transform pos: 3.5,3.5 parent: 2 - - type: DeviceLinkSink - links: - - 777 - uid: 1016 components: - type: Transform pos: -2.5,-3.5 parent: 2 - - type: DeviceLinkSink - links: - - 777 - uid: 1017 components: - type: Transform pos: -0.5,-3.5 parent: 2 - - type: DeviceLinkSink - links: - - 777 - uid: 1018 components: - type: Transform pos: -1.5,-3.5 parent: 2 - - type: DeviceLinkSink - links: - - 777 - uid: 1019 components: - type: Transform pos: 0.5,-3.5 parent: 2 - - type: DeviceLinkSink - links: - - 777 - uid: 1020 components: - type: Transform pos: 1.5,-3.5 parent: 2 - - type: DeviceLinkSink - links: - - 777 - uid: 1021 components: - type: Transform pos: 2.5,-3.5 parent: 2 - - type: DeviceLinkSink - links: - - 777 - uid: 1022 components: - type: Transform pos: 3.5,-3.5 parent: 2 - - type: DeviceLinkSink - links: - - 777 - proto: SignalButton entities: - uid: 777 diff --git a/Resources/Maps/_NF/POI/lodge.yml b/Resources/Maps/_NF/POI/lodge.yml index e3c4e2418f6..cd3a3f3a219 100644 --- a/Resources/Maps/_NF/POI/lodge.yml +++ b/Resources/Maps/_NF/POI/lodge.yml @@ -16610,7 +16610,7 @@ entities: - type: Transform pos: -1.5,11.5 parent: 1 -- proto: VendingMachineBountyVend +- proto: VendingMachineBountyVendPOI entities: - uid: 1052 components: diff --git a/Resources/Maps/_NF/POI/nfsd.yml b/Resources/Maps/_NF/POI/nfsd.yml index 08e2c1b3189..9f9c28c7eb4 100644 --- a/Resources/Maps/_NF/POI/nfsd.yml +++ b/Resources/Maps/_NF/POI/nfsd.yml @@ -15408,7 +15408,7 @@ entities: - type: Transform pos: -5.5,9.5 parent: 1 -- proto: VendingMachineBountyVend +- proto: VendingMachineBountyVendPOI entities: - uid: 1565 components: diff --git a/Resources/Maps/_NF/POI/tinnia.yml b/Resources/Maps/_NF/POI/tinnia.yml index af6c02ac6ad..afd13801f9b 100644 --- a/Resources/Maps/_NF/POI/tinnia.yml +++ b/Resources/Maps/_NF/POI/tinnia.yml @@ -868,7 +868,7 @@ entities: pos: 14.5,-0.5 parent: 1 - type: Door - secondsUntilStateChange: -2439.343 + secondsUntilStateChange: -2535.3264 state: Opening - uid: 196 components: @@ -1344,7 +1344,7 @@ entities: parent: 1 - type: Physics bodyType: Static -- proto: BookChefGaming +- proto: BookHowToCookForFortySpaceman entities: - uid: 1790 components: @@ -4582,6 +4582,13 @@ entities: rot: -1.5707963267948966 rad pos: 0.5,14.5 parent: 1 +- proto: CardBoxBlack + entities: + - uid: 1628 + components: + - type: Transform + pos: -8.991313,-9.907341 + parent: 1 - proto: CarpetPurple entities: - uid: 338 @@ -6737,28 +6744,28 @@ entities: pos: 4.5,-5.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - uid: 389 components: - type: Transform pos: 4.5,6.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - uid: 391 components: - type: Transform pos: -6.5,-7.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - uid: 392 components: - type: Transform pos: 11.5,-3.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: ComputerSolarControl entities: - uid: 1412 @@ -10059,7 +10066,7 @@ entities: pos: 1.5,13.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: Grille entities: - uid: 6 @@ -10551,7 +10558,7 @@ entities: pos: -1.5,5.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: KitchenKnife entities: - uid: 1811 @@ -10567,14 +10574,14 @@ entities: pos: -1.5,4.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - uid: 253 components: - type: Transform pos: 2.5,5.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: KitchenReagentGrinder entities: - uid: 187 @@ -10583,14 +10590,14 @@ entities: pos: -2.5,4.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - uid: 254 components: - type: Transform pos: 1.5,5.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: KitchenSpike entities: - uid: 206 @@ -11940,7 +11947,7 @@ entities: pos: -5.5,8.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: SignBar entities: - uid: 1991 @@ -11994,7 +12001,7 @@ entities: pos: -0.5,14.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: SodaDispenser entities: - uid: 308 @@ -12003,7 +12010,7 @@ entities: pos: -3.5,-3.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: SolarPanel entities: - uid: 410 @@ -12943,7 +12950,7 @@ entities: pos: 5.5,-5.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: VendingMachineBooze entities: - uid: 309 @@ -12952,7 +12959,7 @@ entities: pos: -1.5,-3.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: VendingMachineChefDrobe entities: - uid: 255 @@ -12968,7 +12975,7 @@ entities: pos: -3.5,1.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: VendingMachineCigs entities: - uid: 1468 @@ -12996,7 +13003,7 @@ entities: pos: -4.5,1.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: VendingMachineGames entities: - uid: 1965 @@ -13019,7 +13026,7 @@ entities: pos: -3.5,13.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: VendingMachineNutri entities: - uid: 132 @@ -13028,7 +13035,7 @@ entities: pos: -8.5,12.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: VendingMachinePottedPlantVend entities: - uid: 1466 @@ -13044,7 +13051,7 @@ entities: pos: -7.5,12.5 parent: 1 - type: DisableToolUse - anchoring: true + anchoring: True - proto: WallReinforced entities: - uid: 3 diff --git a/Resources/Maps/_NF/POI/trade.yml b/Resources/Maps/_NF/POI/trade.yml index daf56a1f21e..3255b630b3d 100644 --- a/Resources/Maps/_NF/POI/trade.yml +++ b/Resources/Maps/_NF/POI/trade.yml @@ -51,7 +51,7 @@ entities: version: 6 1,0: ind: 1,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAKAwAAAAAEAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAADBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAADAwAAAAAAAwAAAAAHAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAADAQAAAAACBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAABAQAAAAAAAQAAAAABBgAAAAAAAgAAAAAADQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAACAAAAAADCAAAAAAACAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAIAwAAAAAEAwAAAAAAAwAAAAAAAgAAAAAACAAAAAADCAAAAAACCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAACAAAAAADCAAAAAACCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAHAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAJAwAAAAAAAwAAAAAAAwAAAAAMAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAKAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAJAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAJAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABgAAAAAAAgAAAAAAAgAAAAAABgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAKAwAAAAAEAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAABgAAAAAAAQAAAAAAAQAAAAAAAQAAAAADBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAADAwAAAAAAAwAAAAAHAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAADAQAAAAACBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAABAQAAAAAAAQAAAAABBgAAAAAAAgAAAAAADQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAACAAAAAADCAAAAAAACAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAIAwAAAAAEAwAAAAAAAwAAAAAAAgAAAAAACAAAAAADCAAAAAACCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAACAAAAAADCAAAAAACCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAHAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAJAwAAAAAAAwAAAAAAAwAAAAAMAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAKAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAJAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAJAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABgAAAAAAAgAAAAAAAgAAAAAABgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 0,-1: ind: 0,-1 @@ -87,7 +87,7 @@ entities: version: 6 1,-1: ind: 1,-1 - tiles: AQAAAAAAAQAAAAABAQAAAAABAQAAAAAAAQAAAAADAQAAAAABAQAAAAAABQAAAAAABgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAFAwAAAAAAAwAAAAALAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAAABQAAAAAABQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAHAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAFAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAALAwAAAAAAAwAAAAAEAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAQAAAAABAQAAAAADAQAAAAAAAQAAAAADAQAAAAACAQAAAAACAQAAAAAABgAAAAAAAQAAAAAAAQAAAAADAQAAAAABAQAAAAADAQAAAAADAQAAAAADAQAAAAABAgAAAAAAAQAAAAABAQAAAAADAQAAAAABAQAAAAADAQAAAAAAAQAAAAABAQAAAAAABgAAAAAAAQAAAAABAQAAAAADAQAAAAAAAQAAAAACAQAAAAADAQAAAAADAQAAAAADAwAAAAAAAQAAAAADAQAAAAADAQAAAAABAQAAAAAAAQAAAAABAQAAAAACAQAAAAABBgAAAAAAAQAAAAADAQAAAAADAQAAAAAAAQAAAAADAQAAAAACAQAAAAAAAQAAAAACAwAAAAADAgAAAAAACAAAAAAACAAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAQAAAAACAQAAAAACAQAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAKAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAABAQAAAAAAAQAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAJAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAABAQAAAAAAAwAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAMAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAABAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAADAQAAAAADAQAAAAAAAgAAAAAA + tiles: AQAAAAAAAQAAAAABAQAAAAABAQAAAAAAAQAAAAADAQAAAAABAQAAAAAABQAAAAAABgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAFAwAAAAAAAwAAAAALAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAAABQAAAAAABQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAHAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAFAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAALAwAAAAAAAwAAAAAEAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAQAAAAABAQAAAAADAQAAAAAAAQAAAAADAQAAAAACAQAAAAACAQAAAAAABgAAAAAAAQAAAAAAAQAAAAADAQAAAAABAQAAAAADAQAAAAADAQAAAAADAQAAAAABAgAAAAAAAQAAAAABAQAAAAADAQAAAAABAQAAAAADAQAAAAAAAQAAAAABAQAAAAAABgAAAAAAAQAAAAABAQAAAAADAQAAAAAAAQAAAAACAQAAAAADAQAAAAADAQAAAAADAwAAAAAAAQAAAAADAQAAAAADAQAAAAABAQAAAAAAAQAAAAABAQAAAAACAQAAAAABBgAAAAAAAQAAAAADAQAAAAADAQAAAAAAAQAAAAADAQAAAAACAQAAAAAAAQAAAAACAwAAAAADAgAAAAAACAAAAAAACAAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAQAAAAACAQAAAAACAQAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAKAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAABAQAAAAAAAQAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAJAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAABAQAAAAAAAwAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAMAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAABAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAADAQAAAAADAQAAAAAAAgAAAAAA version: 6 1,-2: ind: 1,-2 @@ -187,148 +187,148 @@ entities: color: '#FFFFFFFF' id: Bot decals: - 474: 48,11 - 475: 49,11 - 476: 50,11 - 477: 51,11 - 478: 52,11 - 479: 49,9 - 480: 50,9 - 481: 51,9 - 482: 61,9 - 483: 62,9 - 484: 63,9 - 485: 60,11 - 486: 61,11 - 487: 62,11 - 488: 63,11 - 489: 64,11 - 1072: -27,8 - 1073: -27,9 - 1125: 8,-21 - 1126: 7,-21 - 1127: 83,-8 - 1128: 83,-7 - 1129: 63,24 - 1130: 62,24 + 473: 48,11 + 474: 49,11 + 475: 50,11 + 476: 51,11 + 477: 52,11 + 478: 49,9 + 479: 50,9 + 480: 51,9 + 481: 61,9 + 482: 62,9 + 483: 63,9 + 484: 60,11 + 485: 61,11 + 486: 62,11 + 487: 63,11 + 488: 64,11 + 1071: -27,8 + 1072: -27,9 + 1124: 8,-21 + 1125: 7,-21 + 1126: 83,-8 + 1127: 83,-7 + 1128: 63,24 + 1129: 62,24 - node: color: '#FFFFFFFF' id: BotRightGreyscale decals: - 490: 49,4 - 491: 50,4 - 492: 51,4 - 493: 61,4 - 494: 60,4 - 495: 59,4 + 489: 49,4 + 490: 50,4 + 491: 51,4 + 492: 61,4 + 493: 60,4 + 494: 59,4 - node: color: '#FFFFFFFF' id: BrickTileDarkCornerNe decals: 215: 76,-10 - 301: -3,-14 - 325: -10,13 - 443: 64,20 - 465: 59,25 - 509: 79,7 - 510: 84,2 - 631: 22,-16 - 667: -22,10 + 300: -3,-14 + 324: -10,13 + 442: 64,20 + 464: 59,25 + 508: 79,7 + 509: 84,2 + 630: 22,-16 + 666: -22,10 - node: color: '#FFFFFFFF' id: BrickTileDarkCornerNw decals: - 245: 28,2 - 452: 48,20 - 460: 53,25 - 511: 78,7 - 630: 6,-16 - 662: -28,5 - 663: -23,10 + 451: 48,20 + 459: 53,25 + 510: 78,7 + 629: 6,-16 + 661: -28,5 + 662: -23,10 + 1214: 28,2 - node: color: '#FFFFFFFF' id: BrickTileDarkCornerSe decals: - 253: 30,-8 - 442: 64,19 - 512: 79,-9 - 513: 84,-4 - 628: 17,-22 - 629: 22,-17 - 664: -22,-6 + 252: 30,-8 + 441: 64,19 + 511: 79,-9 + 512: 84,-4 + 627: 17,-22 + 628: 22,-17 + 663: -22,-6 - node: color: '#FFFFFFFF' id: BrickTileDarkCornerSw decals: - 291: -12,-8 - 292: -8,-15 - 366: -16,11 - 453: 48,19 - 514: 78,-9 - 626: 11,-22 - 627: 6,-17 - 665: -28,-1 - 666: -23,-6 + 290: -12,-8 + 291: -8,-15 + 365: -16,11 + 452: 48,19 + 513: 78,-9 + 625: 11,-22 + 626: 6,-17 + 664: -28,-1 + 665: -23,-6 - node: color: '#FFFFFFFF' id: BrickTileDarkInnerNe decals: 138: 57,0 234: 57,-10 - 286: 13,-6 - 309: -6,-14 - 367: -14,13 - 455: 59,20 - 471: 57,25 - 515: 79,2 - 516: 84,0 - 621: 15,-16 - 673: -22,3 + 285: 13,-6 + 308: -6,-14 + 366: -14,13 + 454: 59,20 + 470: 57,25 + 514: 79,2 + 515: 84,0 + 620: 15,-16 + 672: -22,3 - node: color: '#FFFFFFFF' id: BrickTileDarkInnerNw decals: 139: 55,2 - 254: 28,-6 - 287: 11,-6 - 370: -12,3 - 454: 53,20 - 470: 55,25 - 519: 78,0 - 620: 13,-16 - 668: -23,5 - 669: -28,3 + 253: 28,-6 + 286: 11,-6 + 369: -12,3 + 453: 53,20 + 469: 55,25 + 518: 78,0 + 619: 13,-16 + 667: -23,5 + 668: -28,3 - node: color: '#FFFFFFFF' id: BrickTileDarkInnerSe decals: 140: 57,-2 235: 57,-12 - 285: 15,-8 - 289: -6,-8 - 517: 79,-4 - 518: 84,-2 - 622: 15,-22 - 623: 17,-17 - 672: -22,1 - 674: 57,19 - 963: 30,0 + 284: 15,-8 + 288: -6,-8 + 516: 79,-4 + 517: 84,-2 + 621: 15,-22 + 622: 17,-17 + 671: -22,1 + 673: 57,19 + 962: 30,0 - node: color: '#FFFFFFFF' id: BrickTileDarkInnerSw decals: - 284: 13,-8 - 290: -8,-8 - 308: -4,-15 - 368: -12,11 - 369: -12,1 - 624: 13,-22 - 625: 11,-17 - 670: -28,1 - 671: -23,-1 - 675: 55,19 - 1003: 74,-12 - 1149: 78,-2 + 283: 13,-8 + 289: -8,-8 + 307: -4,-15 + 367: -12,11 + 368: -12,1 + 623: 13,-22 + 624: 11,-17 + 669: -28,1 + 670: -23,-1 + 674: 55,19 + 1002: 74,-12 + 1148: 78,-2 - node: color: '#FFFFFFFF' id: BrickTileDarkLineE @@ -367,78 +367,78 @@ entities: 226: 76,-22 227: 57,-13 228: 57,-9 - 246: 30,-1 - 247: 30,-2 - 248: 30,-3 - 249: 30,-4 - 250: 30,-5 - 251: 30,-6 - 252: 30,-7 - 274: 15,-10 - 275: 15,-11 - 276: 15,-12 - 277: 15,-13 - 278: 15,-14 - 293: -3,-15 - 302: -10,-5 - 303: -6,-13 - 304: -6,-12 - 305: -6,-11 - 306: -6,-10 - 310: -10,-4 - 311: -10,-3 - 312: -10,-2 - 313: -10,0 - 314: -10,1 - 315: -10,2 - 316: -10,3 - 317: -10,4 - 318: -10,5 - 319: -10,7 - 320: -10,8 - 321: -10,9 - 322: -10,10 - 323: -10,11 - 324: -10,12 - 357: -14,24 - 358: -14,22 - 359: -14,21 - 360: -14,20 - 361: -14,18 - 362: -14,19 - 363: -14,17 - 364: -14,16 - 365: -14,15 - 461: 59,24 - 462: 59,23 - 463: 59,22 - 464: 59,21 - 528: 79,3 - 529: 79,4 - 530: 79,5 - 531: 79,6 - 532: 84,1 - 533: 84,-3 - 534: 79,-5 - 535: 79,-6 - 536: 79,-7 - 537: 79,-8 - 616: 17,-21 - 617: 17,-20 - 618: 17,-19 - 619: 17,-18 - 650: -22,9 - 651: -22,8 - 652: -22,7 - 653: -22,6 - 654: -22,5 - 655: -22,4 - 656: -22,0 - 657: -22,-1 - 658: -22,-2 - 659: -22,-3 - 660: -22,-4 - 661: -22,-5 + 245: 30,-1 + 246: 30,-2 + 247: 30,-3 + 248: 30,-4 + 249: 30,-5 + 250: 30,-6 + 251: 30,-7 + 273: 15,-10 + 274: 15,-11 + 275: 15,-12 + 276: 15,-13 + 277: 15,-14 + 292: -3,-15 + 301: -10,-5 + 302: -6,-13 + 303: -6,-12 + 304: -6,-11 + 305: -6,-10 + 309: -10,-4 + 310: -10,-3 + 311: -10,-2 + 312: -10,0 + 313: -10,1 + 314: -10,2 + 315: -10,3 + 316: -10,4 + 317: -10,5 + 318: -10,7 + 319: -10,8 + 320: -10,9 + 321: -10,10 + 322: -10,11 + 323: -10,12 + 356: -14,24 + 357: -14,22 + 358: -14,21 + 359: -14,20 + 360: -14,18 + 361: -14,19 + 362: -14,17 + 363: -14,16 + 364: -14,15 + 460: 59,24 + 461: 59,23 + 462: 59,22 + 463: 59,21 + 527: 79,3 + 528: 79,4 + 529: 79,5 + 530: 79,6 + 531: 84,1 + 532: 84,-3 + 533: 79,-5 + 534: 79,-6 + 535: 79,-7 + 536: 79,-8 + 615: 17,-21 + 616: 17,-20 + 617: 17,-19 + 618: 17,-18 + 649: -22,9 + 650: -22,8 + 651: -22,7 + 652: -22,6 + 653: -22,5 + 654: -22,4 + 655: -22,0 + 656: -22,-1 + 657: -22,-2 + 658: -22,-3 + 659: -22,-4 + 660: -22,-5 - node: color: '#FFFFFFFF' id: BrickTileDarkLineN @@ -502,67 +502,67 @@ entities: 214: 75,-10 243: 29,2 244: 30,2 - 255: 27,-6 - 256: 26,-6 - 257: 25,-6 - 258: 24,-6 - 259: 22,-6 - 260: 21,-6 - 261: 20,-6 - 262: 19,-6 - 263: 18,-6 - 264: 17,-6 - 265: 16,-6 - 266: 15,-6 - 267: 14,-6 - 268: 10,-6 - 269: 9,-6 - 270: 8,-6 - 271: 7,-6 - 272: 6,-6 - 273: 5,-6 - 288: 3,-6 - 294: -4,-14 - 326: -11,13 - 327: -12,13 - 328: -13,13 - 377: -20,3 - 378: -19,3 - 379: -18,3 - 380: -16,3 - 381: -17,3 - 382: -15,3 - 383: -14,3 - 444: 63,20 - 445: 62,20 - 446: 61,20 - 447: 60,20 - 448: 52,20 - 449: 51,20 - 450: 50,20 - 451: 49,20 - 472: 54,25 - 473: 58,25 - 524: 83,2 - 525: 82,2 - 526: 81,2 - 527: 80,2 - 604: 7,-16 - 605: 8,-16 - 606: 9,-16 - 607: 10,-16 - 608: 11,-16 - 609: 12,-16 - 610: 16,-16 - 611: 17,-16 - 612: 18,-16 - 613: 19,-16 - 614: 20,-16 - 615: 21,-16 - 646: -24,5 - 647: -25,5 - 648: -26,5 - 649: -27,5 + 254: 27,-6 + 255: 26,-6 + 256: 25,-6 + 257: 24,-6 + 258: 22,-6 + 259: 21,-6 + 260: 20,-6 + 261: 19,-6 + 262: 18,-6 + 263: 17,-6 + 264: 16,-6 + 265: 15,-6 + 266: 14,-6 + 267: 10,-6 + 268: 9,-6 + 269: 8,-6 + 270: 7,-6 + 271: 6,-6 + 272: 5,-6 + 287: 3,-6 + 293: -4,-14 + 325: -11,13 + 326: -12,13 + 327: -13,13 + 376: -20,3 + 377: -19,3 + 378: -18,3 + 379: -16,3 + 380: -17,3 + 381: -15,3 + 382: -14,3 + 443: 63,20 + 444: 62,20 + 445: 61,20 + 446: 60,20 + 447: 52,20 + 448: 51,20 + 449: 50,20 + 450: 49,20 + 471: 54,25 + 472: 58,25 + 523: 83,2 + 524: 82,2 + 525: 81,2 + 526: 80,2 + 603: 7,-16 + 604: 8,-16 + 605: 9,-16 + 606: 10,-16 + 607: 11,-16 + 608: 12,-16 + 609: 16,-16 + 610: 17,-16 + 611: 18,-16 + 612: 19,-16 + 613: 20,-16 + 614: 21,-16 + 645: -24,5 + 646: -25,5 + 647: -26,5 + 648: -27,5 - node: color: '#FFFFFFFF' id: BrickTileDarkLineS @@ -649,48 +649,48 @@ entities: 194: 60,-12 195: 59,-12 196: 58,-12 - 295: -6,-15 - 296: -7,-15 - 329: -15,11 - 330: -14,11 - 331: -13,11 - 371: -14,1 - 372: -15,1 - 373: -17,1 - 374: -18,1 - 375: -19,1 - 376: -20,1 - 430: 54,19 - 431: 53,19 - 432: 52,19 - 433: 51,19 - 434: 50,19 - 435: 49,19 - 436: 58,19 - 437: 59,19 - 438: 60,19 - 439: 61,19 - 440: 62,19 - 441: 63,19 - 520: 80,-4 - 521: 81,-4 - 522: 82,-4 - 523: 83,-4 - 594: 12,-22 - 595: 16,-22 - 596: 18,-17 - 597: 19,-17 - 598: 21,-17 - 599: 20,-17 - 600: 7,-17 - 601: 8,-17 - 602: 9,-17 - 603: 10,-17 - 642: -27,-1 - 643: -26,-1 - 644: -25,-1 - 645: -24,-1 - 1070: -16,1 + 294: -6,-15 + 295: -7,-15 + 328: -15,11 + 329: -14,11 + 330: -13,11 + 370: -14,1 + 371: -15,1 + 372: -17,1 + 373: -18,1 + 374: -19,1 + 375: -20,1 + 429: 54,19 + 430: 53,19 + 431: 52,19 + 432: 51,19 + 433: 50,19 + 434: 49,19 + 435: 58,19 + 436: 59,19 + 437: 60,19 + 438: 61,19 + 439: 62,19 + 440: 63,19 + 519: 80,-4 + 520: 81,-4 + 521: 82,-4 + 522: 83,-4 + 593: 12,-22 + 594: 16,-22 + 595: 18,-17 + 596: 19,-17 + 597: 21,-17 + 598: 20,-17 + 599: 7,-17 + 600: 8,-17 + 601: 9,-17 + 602: 10,-17 + 641: -27,-1 + 642: -26,-1 + 643: -25,-1 + 644: -24,-1 + 1069: -16,1 - node: color: '#FFFFFFFF' id: BrickTileDarkLineW @@ -729,381 +729,423 @@ entities: 240: 28,-1 241: 28,0 242: 28,1 - 279: 13,-10 - 280: 13,-11 - 281: 13,-12 - 282: 13,-13 - 283: 13,-14 - 297: -8,-14 - 298: -8,-13 - 299: -8,-12 - 300: -8,-10 - 307: -8,-11 - 332: -16,12 - 333: -16,13 - 334: -12,10 - 335: -12,9 - 336: -12,8 - 337: -12,7 - 338: -12,6 - 339: -12,5 - 340: -12,4 - 341: -12,0 - 342: -12,-2 - 343: -12,-3 - 344: -12,-4 - 345: -12,-5 - 346: -12,-6 - 347: -12,-7 - 348: -16,15 - 349: -16,16 - 350: -16,17 - 351: -16,18 - 352: -16,19 - 353: -16,20 - 354: -16,21 - 355: -16,22 - 356: -16,24 - 456: 53,21 - 457: 53,22 - 458: 53,23 - 459: 53,24 - 496: 55,3 - 497: 78,1 - 498: 78,2 - 499: 78,3 - 500: 78,4 - 501: 78,5 - 502: 78,6 - 503: 78,-3 - 504: 78,-4 - 505: 78,-5 - 506: 78,-6 - 507: 78,-7 - 508: 78,-8 - 590: 11,-21 - 591: 11,-20 - 592: 11,-19 - 593: 11,-18 - 632: -28,0 - 633: -28,4 - 634: -23,6 - 635: -23,7 - 636: -23,8 - 637: -23,9 - 638: -23,-2 - 639: -23,-3 - 640: -23,-4 - 641: -23,-5 + 278: 13,-10 + 279: 13,-11 + 280: 13,-12 + 281: 13,-13 + 282: 13,-14 + 296: -8,-14 + 297: -8,-13 + 298: -8,-12 + 299: -8,-10 + 306: -8,-11 + 331: -16,12 + 332: -16,13 + 333: -12,10 + 334: -12,9 + 335: -12,8 + 336: -12,7 + 337: -12,6 + 338: -12,5 + 339: -12,4 + 340: -12,0 + 341: -12,-2 + 342: -12,-3 + 343: -12,-4 + 344: -12,-5 + 345: -12,-6 + 346: -12,-7 + 347: -16,15 + 348: -16,16 + 349: -16,17 + 350: -16,18 + 351: -16,19 + 352: -16,20 + 353: -16,21 + 354: -16,22 + 355: -16,24 + 455: 53,21 + 456: 53,22 + 457: 53,23 + 458: 53,24 + 495: 55,3 + 496: 78,1 + 497: 78,2 + 498: 78,3 + 499: 78,4 + 500: 78,5 + 501: 78,6 + 502: 78,-3 + 503: 78,-4 + 504: 78,-5 + 505: 78,-6 + 506: 78,-7 + 507: 78,-8 + 589: 11,-21 + 590: 11,-20 + 591: 11,-19 + 592: 11,-18 + 631: -28,0 + 632: -28,4 + 633: -23,6 + 634: -23,7 + 635: -23,8 + 636: -23,9 + 637: -23,-2 + 638: -23,-3 + 639: -23,-4 + 640: -23,-5 - node: color: '#DE3A3AFF' id: BrickTileSteelCornerNe decals: - 548: -3,-14 + 547: -3,-14 - node: color: '#DE3A3AFF' id: BrickTileSteelInnerSw decals: - 550: -4,-15 + 549: -4,-15 - node: color: '#DE3A3AFF' id: BrickTileSteelLineE decals: - 468: 57,27 - 469: 57,28 - 543: 76,-22 - 544: 15,-24 - 545: 15,-25 - 549: -3,-15 - 557: -14,24 + 467: 57,27 + 468: 57,28 + 542: 76,-22 + 543: 15,-24 + 544: 15,-25 + 548: -3,-15 + 556: -14,24 - node: color: '#DE3A3AFF' id: BrickTileSteelLineN decals: - 538: 86,0 - 539: 87,0 - 551: -4,-14 - 552: -30,3 - 553: -31,3 + 537: 86,0 + 538: 87,0 + 550: -4,-14 + 551: -30,3 + 552: -31,3 - node: color: '#DE3A3AFF' id: BrickTileSteelLineS decals: - 540: 87,-2 - 541: 86,-2 - 554: -30,1 - 555: -31,1 + 539: 87,-2 + 540: 86,-2 + 553: -30,1 + 554: -31,1 - node: color: '#DE3A3AFF' id: BrickTileSteelLineW decals: - 466: 55,28 - 467: 55,27 - 542: 74,-22 - 546: 13,-25 - 547: 13,-24 - 556: -16,24 + 465: 55,28 + 466: 55,27 + 541: 74,-22 + 545: 13,-25 + 546: 13,-24 + 555: -16,24 - node: color: '#3EB388FF' id: BrickTileWhiteCornerNe decals: - 1060: 76,-10 + 1059: 76,-10 - node: color: '#951710FF' id: BrickTileWhiteCornerNe decals: - 1135: 49,-2 + 1134: 49,-2 - node: color: '#9C2020FF' id: BrickTileWhiteCornerNe decals: - 1181: 53,-2 + 1180: 53,-2 + - node: + color: '#9FED5896' + id: BrickTileWhiteCornerNe + decals: + 1217: 26,2 - node: color: '#D58C18FF' id: BrickTileWhiteCornerNe decals: - 1134: 51,-6 + 1133: 51,-6 - node: color: '#951710FF' id: BrickTileWhiteCornerNw decals: - 1137: 48,-2 + 1136: 48,-2 - node: color: '#9C2020FF' id: BrickTileWhiteCornerNw decals: - 1182: 51,-2 + 1181: 51,-2 + - node: + color: '#9FED5896' + id: BrickTileWhiteCornerNw + decals: + 1218: 24,2 - node: color: '#D58C18FF' id: BrickTileWhiteCornerNw decals: - 1132: 50,-6 + 1131: 50,-6 - node: color: '#951710FF' id: BrickTileWhiteCornerSe decals: - 1138: 49,-4 + 1137: 49,-4 - node: color: '#9C2020FF' id: BrickTileWhiteCornerSe decals: - 1179: 53,-4 + 1178: 53,-4 + - node: + color: '#9FED5896' + id: BrickTileWhiteCornerSe + decals: + 1216: 26,-1 - node: color: '#D58C18FF' id: BrickTileWhiteCornerSe decals: - 1133: 51,-7 + 1132: 51,-7 - node: color: '#951710FF' id: BrickTileWhiteCornerSw decals: - 1136: 48,-4 + 1135: 48,-4 - node: color: '#9C2020FF' id: BrickTileWhiteCornerSw decals: - 1178: 51,-4 + 1177: 51,-4 + - node: + color: '#9FED5896' + id: BrickTileWhiteCornerSw + decals: + 1215: 24,-1 - node: color: '#D58C18FF' id: BrickTileWhiteCornerSw decals: - 1131: 50,-7 + 1130: 50,-7 - node: color: '#3EB388FF' id: BrickTileWhiteInnerNe decals: - 394: -10,-6 + 393: -10,-6 - node: color: '#9C2020FF' id: BrickTileWhiteInnerSw decals: - 1200: 55,0 + 1199: 55,0 - node: color: '#3EB388FF' id: BrickTileWhiteLineE decals: - 389: -10,-5 - 390: -10,-3 - 391: -10,1 - 392: -10,3 - 393: -10,5 - 413: -10,6 - 414: -10,2 - 415: -10,-2 - 1068: -22,6 + 388: -10,-5 + 389: -10,-3 + 390: -10,1 + 391: -10,3 + 392: -10,5 + 412: -10,6 + 413: -10,2 + 414: -10,-2 + 1067: -22,6 - node: color: '#951710FF' id: BrickTileWhiteLineE decals: - 1139: 49,-3 + 1138: 49,-3 - node: color: '#9C2020FF' id: BrickTileWhiteLineE decals: - 1183: 53,-3 + 1182: 53,-3 + - node: + color: '#9FED5896' + id: BrickTileWhiteLineE + decals: + 1221: 26,0 + 1222: 26,1 - node: color: '#EFB34196' id: BrickTileWhiteLineE decals: - 384: -10,-4 - 385: -10,-2 - 386: -10,0 - 387: -10,2 - 388: -10,4 + 383: -10,-4 + 384: -10,-2 + 385: -10,0 + 386: -10,2 + 387: -10,4 - node: color: '#EFB341FF' id: BrickTileWhiteLineE decals: - 395: -10,-5 - 396: -10,-4 - 397: -10,-3 - 398: -10,0 - 399: -10,1 - 410: -10,3 - 411: -10,4 - 412: -10,5 + 394: -10,-5 + 395: -10,-4 + 396: -10,-3 + 397: -10,0 + 398: -10,1 + 409: -10,3 + 410: -10,4 + 411: -10,5 - node: color: '#3EB388FF' id: BrickTileWhiteLineN decals: - 416: -6,-6 - 417: -2,-6 - 418: 2,-6 - 1058: 38,2 - 1059: 62,0 - 1062: 61,7 - 1063: 50,7 - 1065: 58,-15 - 1066: 20,-6 - 1067: 18,-16 + 415: -6,-6 + 416: -2,-6 + 417: 2,-6 + 1057: 38,2 + 1058: 62,0 + 1061: 61,7 + 1062: 50,7 + 1064: 58,-15 + 1065: 20,-6 + 1066: 18,-16 - node: color: '#52B4E9FF' id: BrickTileWhiteLineN decals: - 1052: 60,0 - 1057: 15,-6 + 1051: 60,0 + 1056: 15,-6 - node: color: '#9C2020FF' id: BrickTileWhiteLineN decals: - 1185: 52,-2 + 1184: 52,-2 + - node: + color: '#9FED5896' + id: BrickTileWhiteLineN + decals: + 1224: 25,2 - node: color: '#DE3A3AFF' id: BrickTileWhiteLineN decals: - 1053: 61,0 - 1054: 16,-6 + 1052: 61,0 + 1053: 16,-6 - node: color: '#EFB34196' id: BrickTileWhiteLineN decals: - 400: 0,-6 + 399: 0,-6 - node: color: '#EFB341FF' id: BrickTileWhiteLineN decals: - 401: 0,-6 - 402: 1,-6 - 403: -1,-6 - 404: -3,-6 - 405: -4,-6 - 406: -5,-6 - 407: -7,-6 - 408: -8,-6 - 409: -9,-6 + 400: 0,-6 + 401: 1,-6 + 402: -1,-6 + 403: -3,-6 + 404: -4,-6 + 405: -5,-6 + 406: -7,-6 + 407: -8,-6 + 408: -9,-6 - node: color: '#3EB388FF' id: BrickTileWhiteLineS decals: - 419: -2,-8 - 420: 2,-8 - 1064: 60,19 + 418: -2,-8 + 419: 2,-8 + 1063: 60,19 - node: color: '#52B4E9FF' id: BrickTileWhiteLineS decals: - 1056: -15,11 + 1055: -15,11 - node: color: '#9C2020FF' id: BrickTileWhiteLineS decals: - 1180: 52,-4 - 1186: 48,0 - 1187: 49,0 - 1188: 50,0 - 1189: 51,0 - 1190: 52,0 - 1191: 53,0 - 1192: 54,0 + 1179: 52,-4 + 1185: 48,0 + 1186: 49,0 + 1187: 50,0 + 1188: 51,0 + 1189: 52,0 + 1190: 53,0 + 1191: 54,0 + - node: + color: '#9FED5896' + id: BrickTileWhiteLineS + decals: + 1223: 25,-1 - node: color: '#A46106FF' id: BrickTileWhiteLineS decals: - 424: 58,19 - 425: 59,19 - 426: 60,19 - 427: 61,19 - 428: 62,19 - 429: 63,19 + 423: 58,19 + 424: 59,19 + 425: 60,19 + 426: 61,19 + 427: 62,19 + 428: 63,19 - node: color: '#DE3A3AFF' id: BrickTileWhiteLineS decals: - 1055: -14,11 + 1054: -14,11 - node: color: '#EFB341FF' id: BrickTileWhiteLineS decals: - 421: 1,-8 - 422: 0,-8 - 423: -1,-8 + 420: 1,-8 + 421: 0,-8 + 422: -1,-8 - node: color: '#3EB388FF' id: BrickTileWhiteLineW decals: - 1061: 78,3 + 1060: 78,3 - node: color: '#951710FF' id: BrickTileWhiteLineW decals: - 1140: 48,-3 + 1139: 48,-3 - node: color: '#9C2020FF' id: BrickTileWhiteLineW decals: - 1184: 51,-3 - 1193: 55,-1 - 1194: 55,-2 - 1195: 55,-3 - 1196: 55,-4 - 1197: 55,-5 - 1198: 55,-6 - 1199: 55,-7 + 1183: 51,-3 + 1192: 55,-1 + 1193: 55,-2 + 1194: 55,-3 + 1195: 55,-4 + 1196: 55,-5 + 1197: 55,-6 + 1198: 55,-7 + - node: + color: '#9FED5896' + id: BrickTileWhiteLineW + decals: + 1219: 24,1 + 1220: 24,0 - node: color: '#A4610696' id: CheckerNESW decals: - 1150: 80,0 - 1152: 82,-1 - 1160: 13,-18 - 1163: 15,-20 + 1149: 80,0 + 1151: 82,-1 + 1159: 13,-18 + 1162: 15,-20 - node: color: '#A4610696' id: CheckerNWSE decals: - 1151: 82,0 - 1161: 13,-20 - 1162: 15,-18 - 1166: 15,-19 + 1150: 82,0 + 1160: 13,-20 + 1161: 15,-18 + 1165: 15,-19 - node: color: '#FFFFFFFF' id: Delivery decals: - 1049: -14,-1 - 1071: -27,7 - 1122: 83,-6 - 1123: 61,24 - 1124: 9,-21 + 1048: -14,-1 + 1070: -27,7 + 1121: 83,-6 + 1122: 61,24 + 1123: 9,-21 - node: color: '#52B4E9FF' id: DeliveryGreyscale @@ -1122,38 +1164,38 @@ entities: color: '#A4610696' id: HalfTileOverlayGreyscale decals: - 1153: 81,0 - 1165: 14,-18 - 1168: -25,1 - 1170: -24,1 + 1152: 81,0 + 1164: 14,-18 + 1167: -25,1 + 1169: -24,1 - node: color: '#A4610696' id: HalfTileOverlayGreyscale180 decals: - 1141: 56,21 - 1154: 81,-1 - 1155: 80,-2 - 1156: 81,-2 - 1157: 82,-2 - 1164: 14,-20 + 1140: 56,21 + 1153: 81,-1 + 1154: 80,-2 + 1155: 81,-2 + 1156: 82,-2 + 1163: 14,-20 - node: color: '#A4610696' id: HalfTileOverlayGreyscale270 decals: - 1172: -24,2 - 1173: -24,3 + 1171: -24,2 + 1172: -24,3 - node: color: '#A4610696' id: HalfTileOverlayGreyscale90 decals: - 1142: 56,22 - 1143: 56,23 + 1141: 56,22 + 1142: 56,23 - node: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: LoadingArea decals: - 1204: 62,24 + 1203: 62,24 - node: color: '#FFFFFFFF' id: LoadingArea @@ -1164,269 +1206,269 @@ entities: 21: 11,25 22: 12,25 23: 13,25 - 1201: -27,8 + 1200: -27,8 - node: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: LoadingArea decals: - 1202: 8,-21 + 1201: 8,-21 - node: angle: 3.141592653589793 rad color: '#FFFFFFFF' id: LoadingArea decals: - 1203: 83,-7 + 1202: 83,-7 - node: color: '#8C347FFF' id: MiniTileWhiteCornerNe decals: - 1035: 52,-9 - 1046: -15,-1 + 1034: 52,-9 + 1045: -15,-1 - node: color: '#8C347FFF' id: MiniTileWhiteCornerNw decals: - 1033: 48,-9 - 1047: -19,-1 + 1032: 48,-9 + 1046: -19,-1 - node: color: '#8C347FFF' id: MiniTileWhiteCornerSe decals: - 1034: 52,-12 - 1042: -15,-3 + 1033: 52,-12 + 1041: -15,-3 - node: color: '#8C347FFF' id: MiniTileWhiteCornerSw decals: - 1036: 48,-11 - 1037: 50,-12 - 1043: -18,-3 - 1044: -19,-2 + 1035: 48,-11 + 1036: 50,-12 + 1042: -18,-3 + 1043: -19,-2 - node: color: '#8C347FFF' id: MiniTileWhiteInnerSw decals: - 1038: 50,-11 - 1048: -18,-2 + 1037: 50,-11 + 1047: -18,-2 - node: color: '#3EB388FF' id: MiniTileWhiteLineE decals: - 1069: -15,-2 + 1068: -15,-2 - node: color: '#8C347FFF' id: MiniTileWhiteLineE decals: - 1030: 52,-11 - 1031: 52,-10 - 1045: -15,-2 + 1029: 52,-11 + 1030: 52,-10 + 1044: -15,-2 - node: color: '#8C347FFF' id: MiniTileWhiteLineN decals: - 1026: 49,-9 - 1027: 50,-9 - 1028: 51,-9 - 1041: -16,-1 - 1050: -18,-1 - 1051: -17,-1 + 1025: 49,-9 + 1026: 50,-9 + 1027: 51,-9 + 1040: -16,-1 + 1049: -18,-1 + 1050: -17,-1 - node: color: '#8C347FFF' id: MiniTileWhiteLineS decals: - 1029: 51,-12 - 1032: 49,-11 - 1039: -17,-3 - 1040: -16,-3 + 1028: 51,-12 + 1031: 49,-11 + 1038: -17,-3 + 1039: -16,-3 - node: color: '#8C347FFF' id: MiniTileWhiteLineW decals: - 1025: 48,-10 + 1024: 48,-10 - node: color: '#A4610696' id: QuarterTileOverlayGreyscale decals: - 1158: 80,-2 - 1169: -26,1 - 1176: -25,2 + 1157: 80,-2 + 1168: -26,1 + 1175: -25,2 - node: color: '#A4610696' id: QuarterTileOverlayGreyscale180 decals: - 1145: 55,21 - 1159: 80,-1 - 1174: -25,3 - 1175: -26,2 + 1144: 55,21 + 1158: 80,-1 + 1173: -25,3 + 1174: -26,2 - node: color: '#A4610696' id: QuarterTileOverlayGreyscale270 decals: - 1144: 57,21 - 1147: 56,23 - 1171: -24,1 + 1143: 57,21 + 1146: 56,23 + 1170: -24,1 - node: color: '#A4610696' id: QuarterTileOverlayGreyscale90 decals: - 1146: 56,21 - 1148: 55,22 - 1167: 14,-19 - 1177: -26,1 + 1145: 56,21 + 1147: 55,22 + 1166: 14,-19 + 1176: -26,1 - node: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: StandClear decals: - 747: 85,0 - 748: 85,-1 - 749: 85,-2 - 750: 88,0 - 751: 88,-1 - 752: 88,-2 - 833: -5,-15 - 834: -5,-14 - 835: -32,1 - 836: -32,2 - 837: -32,3 - 838: -29,2 - 839: -29,1 - 840: -29,3 - 893: 27,13 - 894: 24,13 - 895: -1,13 - 896: -4,13 + 746: 85,0 + 747: 85,-1 + 748: 85,-2 + 749: 88,0 + 750: 88,-1 + 751: 88,-2 + 832: -5,-15 + 833: -5,-14 + 834: -32,1 + 835: -32,2 + 836: -32,3 + 837: -29,2 + 838: -29,1 + 839: -29,3 + 892: 27,13 + 893: 24,13 + 894: -1,13 + 895: -4,13 - node: color: '#FFFFFFFF' id: StandClear decals: - 753: 76,-23 - 754: 75,-23 - 755: 74,-23 - 756: 74,-21 - 757: 75,-21 - 758: 76,-21 - 791: 57,29 - 792: 56,29 - 793: 55,29 - 794: 55,26 - 795: 56,26 - 796: 57,26 - 797: 13,-26 - 798: 14,-26 - 799: 15,-26 - 800: 13,-23 - 801: 14,-23 - 802: 15,-23 - 831: -4,-16 - 832: -3,-16 - 873: -14,23 - 874: -15,23 - 875: -16,23 - 876: -16,25 - 877: -15,25 - 878: -14,25 - 879: 17,21 - 880: 17,19 + 752: 76,-23 + 753: 75,-23 + 754: 74,-23 + 755: 74,-21 + 756: 75,-21 + 757: 76,-21 + 790: 57,29 + 791: 56,29 + 792: 55,29 + 793: 55,26 + 794: 56,26 + 795: 57,26 + 796: 13,-26 + 797: 14,-26 + 798: 15,-26 + 799: 13,-23 + 800: 14,-23 + 801: 15,-23 + 830: -4,-16 + 831: -3,-16 + 872: -14,23 + 873: -15,23 + 874: -16,23 + 875: -16,25 + 876: -15,25 + 877: -14,25 + 878: 17,21 + 879: 17,19 - node: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: StandClearGreyscale decals: - 700: 77,0 - 701: 77,-1 - 702: 77,-2 - 703: 65,0 - 704: 65,-1 - 705: 65,-2 - 897: -21,1 - 898: -21,2 - 899: -21,3 - 900: -13,1 - 901: -13,2 - 902: -13,3 - 903: 4,-8 - 904: 4,-7 - 905: 4,-6 - 906: 23,-8 - 907: 23,-7 - 908: 23,-6 - 909: 31,0 - 910: 31,1 - 911: 31,2 - 912: 47,0 - 913: 47,1 - 914: 47,2 + 699: 77,0 + 700: 77,-1 + 701: 77,-2 + 702: 65,0 + 703: 65,-1 + 704: 65,-2 + 896: -21,1 + 897: -21,2 + 898: -21,3 + 899: -13,1 + 900: -13,2 + 901: -13,3 + 902: 4,-8 + 903: 4,-7 + 904: 4,-6 + 905: 23,-8 + 906: 23,-7 + 907: 23,-6 + 908: 31,0 + 909: 31,1 + 910: 31,2 + 911: 47,0 + 912: 47,1 + 913: 47,2 - node: color: '#FFFFFFFF' id: StandClearGreyscale decals: - 682: 55,18 - 683: 56,18 - 684: 57,18 - 685: 55,10 - 686: 56,10 - 687: 57,10 - 706: 55,-8 - 707: 56,-8 - 708: 57,-8 - 915: 57,-14 - 916: 56,-14 - 917: 55,-14 - 918: 15,-15 - 919: 14,-15 - 920: 13,-15 - 921: 13,-9 - 922: 14,-9 - 923: 15,-9 - 924: 13,-5 - 925: 12,-5 - 926: 11,-5 - 927: 11,3 - 928: 12,3 - 929: 13,3 - 930: -10,-1 - 931: -11,-1 - 932: -12,-1 - 933: -8,-9 - 934: -7,-9 - 935: -6,-9 - 936: -14,14 - 937: -15,14 - 938: -16,14 + 681: 55,18 + 682: 56,18 + 683: 57,18 + 684: 55,10 + 685: 56,10 + 686: 57,10 + 705: 55,-8 + 706: 56,-8 + 707: 57,-8 + 914: 57,-14 + 915: 56,-14 + 916: 55,-14 + 917: 15,-15 + 918: 14,-15 + 919: 13,-15 + 920: 13,-9 + 921: 14,-9 + 922: 15,-9 + 923: 13,-5 + 924: 12,-5 + 925: 11,-5 + 926: 11,3 + 927: 12,3 + 928: 13,3 + 929: -10,-1 + 930: -11,-1 + 931: -12,-1 + 932: -8,-9 + 933: -7,-9 + 934: -6,-9 + 935: -14,14 + 936: -15,14 + 937: -16,14 - node: color: '#FFFFFFFF' id: WarnCornerSmallNE decals: - 1084: -28,6 - 1096: 6,-22 - 1108: 82,-9 - 1111: 60,23 + 1083: -28,6 + 1095: 6,-22 + 1107: 82,-9 + 1110: 60,23 - node: color: '#FFFFFFFF' id: WarnCornerSmallNW decals: - 1085: -26,6 - 1086: 10,-22 - 1109: 84,-9 - 1110: 64,23 + 1084: -26,6 + 1085: 10,-22 + 1108: 84,-9 + 1109: 64,23 - node: color: '#FFFFFFFF' id: WarnCornerSmallSE decals: - 1083: -28,10 - 1095: 6,-20 - 1107: 82,-5 - 1112: 60,25 + 1082: -28,10 + 1094: 6,-20 + 1106: 82,-5 + 1111: 60,25 - node: color: '#FFFFFFFF' id: WarnCornerSmallSW decals: - 1082: -26,10 - 1094: 10,-20 - 1106: 84,-5 - 1113: 64,25 + 1081: -26,10 + 1093: 10,-20 + 1105: 84,-5 + 1112: 64,25 - node: color: '#FFFFFFFF' id: WarnEndS @@ -1441,342 +1483,342 @@ entities: color: '#FFFFFFFF' id: WarnLineE decals: - 568: 54,27 - 569: 54,28 - 570: 58,28 - 571: 58,27 - 582: 16,-25 - 583: 16,-24 - 588: 12,-25 - 589: 12,-24 - 730: 88,0 - 731: 88,-1 - 732: 88,-2 - 741: 85,-2 - 742: 85,-1 - 743: 85,0 - 787: 58,26 - 788: 58,29 - 789: 54,29 - 790: 54,26 - 815: 16,-26 - 816: 16,-23 - 817: 12,-23 - 818: 12,-26 - 825: -5,-15 - 826: -5,-14 - 851: -29,1 - 852: -29,2 - 853: -29,3 - 854: -32,3 - 855: -32,2 - 856: -32,1 - 889: -1,13 - 890: -4,13 - 891: 27,13 - 892: 24,13 - 1075: -28,7 - 1076: -28,8 - 1077: -28,9 - 1090: 6,-21 - 1103: 82,-8 - 1104: 82,-7 - 1105: 82,-6 - 1121: 60,24 + 567: 54,27 + 568: 54,28 + 569: 58,28 + 570: 58,27 + 581: 16,-25 + 582: 16,-24 + 587: 12,-25 + 588: 12,-24 + 729: 88,0 + 730: 88,-1 + 731: 88,-2 + 740: 85,-2 + 741: 85,-1 + 742: 85,0 + 786: 58,26 + 787: 58,29 + 788: 54,29 + 789: 54,26 + 814: 16,-26 + 815: 16,-23 + 816: 12,-23 + 817: 12,-26 + 824: -5,-15 + 825: -5,-14 + 850: -29,1 + 851: -29,2 + 852: -29,3 + 853: -32,3 + 854: -32,2 + 855: -32,1 + 888: -1,13 + 889: -4,13 + 890: 27,13 + 891: 24,13 + 1074: -28,7 + 1075: -28,8 + 1076: -28,9 + 1089: 6,-21 + 1102: 82,-8 + 1103: 82,-7 + 1104: 82,-6 + 1120: 60,24 - node: color: '#FFFFFFFF' id: WarnLineGreyscaleE decals: - 697: 77,0 - 698: 77,-1 - 699: 77,-2 - 721: 65,0 - 722: 65,-1 - 723: 65,-2 - 724: 77,0 - 725: 77,-1 - 726: 77,-2 - 957: 47,0 - 958: 47,1 - 959: 47,2 - 960: 31,0 - 961: 31,1 - 962: 31,2 - 964: 23,-6 - 965: 23,-8 - 966: 23,-7 - 967: 4,-8 - 968: 4,-7 - 969: 4,-6 - 970: -13,1 - 971: -13,2 - 972: -13,3 - 973: -21,1 - 974: -21,2 - 975: -21,3 + 696: 77,0 + 697: 77,-1 + 698: 77,-2 + 720: 65,0 + 721: 65,-1 + 722: 65,-2 + 723: 77,0 + 724: 77,-1 + 725: 77,-2 + 956: 47,0 + 957: 47,1 + 958: 47,2 + 959: 31,0 + 960: 31,1 + 961: 31,2 + 963: 23,-6 + 964: 23,-8 + 965: 23,-7 + 966: 4,-8 + 967: 4,-7 + 968: 4,-6 + 969: -13,1 + 970: -13,2 + 971: -13,3 + 972: -21,1 + 973: -21,2 + 974: -21,3 - node: color: '#FFFFFFFF' id: WarnLineGreyscaleN decals: - 679: 55,18 - 680: 56,18 - 681: 57,18 - 688: 55,10 - 689: 56,10 - 690: 57,10 - 718: 55,-8 - 719: 56,-8 - 720: 57,-8 - 1000: 57,-14 - 1001: 56,-14 - 1002: 55,-14 - 1004: 15,-9 - 1005: 14,-9 - 1006: 13,-9 - 1007: 15,-15 - 1008: 14,-15 - 1009: 13,-15 - 1010: 13,-5 - 1011: 12,-5 - 1012: 11,-5 - 1013: 13,3 - 1014: 12,3 - 1015: 11,3 - 1016: -6,-9 - 1017: -7,-9 - 1018: -8,-9 - 1019: -10,-1 - 1020: -11,-1 - 1021: -12,-1 - 1022: -14,14 - 1023: -15,14 - 1024: -16,14 + 678: 55,18 + 679: 56,18 + 680: 57,18 + 687: 55,10 + 688: 56,10 + 689: 57,10 + 717: 55,-8 + 718: 56,-8 + 719: 57,-8 + 999: 57,-14 + 1000: 56,-14 + 1001: 55,-14 + 1003: 15,-9 + 1004: 14,-9 + 1005: 13,-9 + 1006: 15,-15 + 1007: 14,-15 + 1008: 13,-15 + 1009: 13,-5 + 1010: 12,-5 + 1011: 11,-5 + 1012: 13,3 + 1013: 12,3 + 1014: 11,3 + 1015: -6,-9 + 1016: -7,-9 + 1017: -8,-9 + 1018: -10,-1 + 1019: -11,-1 + 1020: -12,-1 + 1021: -14,14 + 1022: -15,14 + 1023: -16,14 - node: color: '#FFFFFFFF' id: WarnLineGreyscaleS decals: - 676: 55,18 - 677: 56,18 - 678: 57,18 - 691: 55,10 - 692: 56,10 - 693: 57,10 - 715: 57,-8 - 716: 56,-8 - 717: 55,-8 - 976: -16,14 - 977: -15,14 - 978: -14,14 - 979: -12,-1 - 980: -11,-1 - 981: -10,-1 - 982: -8,-9 - 983: -7,-9 - 984: -6,-9 - 985: 11,3 - 986: 12,3 - 987: 13,3 - 988: 11,-5 - 989: 12,-5 - 990: 13,-5 - 991: 13,-9 - 992: 14,-9 - 993: 15,-9 - 994: 13,-15 - 995: 14,-15 - 996: 15,-15 - 997: 55,-14 - 998: 56,-14 - 999: 57,-14 + 675: 55,18 + 676: 56,18 + 677: 57,18 + 690: 55,10 + 691: 56,10 + 692: 57,10 + 714: 57,-8 + 715: 56,-8 + 716: 55,-8 + 975: -16,14 + 976: -15,14 + 977: -14,14 + 978: -12,-1 + 979: -11,-1 + 980: -10,-1 + 981: -8,-9 + 982: -7,-9 + 983: -6,-9 + 984: 11,3 + 985: 12,3 + 986: 13,3 + 987: 11,-5 + 988: 12,-5 + 989: 13,-5 + 990: 13,-9 + 991: 14,-9 + 992: 15,-9 + 993: 13,-15 + 994: 14,-15 + 995: 15,-15 + 996: 55,-14 + 997: 56,-14 + 998: 57,-14 - node: color: '#FFFFFFFF' id: WarnLineGreyscaleW decals: - 694: 77,0 - 695: 77,-1 - 696: 77,-2 - 709: 77,0 - 710: 77,-1 - 711: 77,-2 - 712: 65,0 - 713: 65,-1 - 714: 65,-2 - 939: -21,1 - 940: -21,2 - 941: -21,3 - 942: -13,1 - 943: -13,2 - 944: -13,3 - 945: 4,-8 - 946: 4,-7 - 947: 4,-6 - 948: 23,-8 - 949: 23,-7 - 950: 23,-6 - 951: 31,0 - 952: 31,1 - 953: 31,2 - 954: 47,2 - 955: 47,1 - 956: 47,0 + 693: 77,0 + 694: 77,-1 + 695: 77,-2 + 708: 77,0 + 709: 77,-1 + 710: 77,-2 + 711: 65,0 + 712: 65,-1 + 713: 65,-2 + 938: -21,1 + 939: -21,2 + 940: -21,3 + 941: -13,1 + 942: -13,2 + 943: -13,3 + 944: 4,-8 + 945: 4,-7 + 946: 4,-6 + 947: 23,-8 + 948: 23,-7 + 949: 23,-6 + 950: 31,0 + 951: 31,1 + 952: 31,2 + 953: 47,2 + 954: 47,1 + 955: 47,0 - node: color: '#FFFFFFFF' id: WarnLineN decals: - 560: 86,1 - 561: 87,1 - 562: 87,-3 - 563: 86,-3 - 574: -31,0 - 575: -30,0 - 576: -31,4 - 577: -30,4 - 734: 85,1 - 735: 85,-3 - 739: 88,1 - 740: 88,-3 - 765: 74,-21 - 766: 75,-21 - 767: 76,-21 - 768: 74,-23 - 769: 75,-23 - 770: 76,-23 - 771: 55,26 - 772: 56,26 - 773: 57,26 - 774: 57,29 - 775: 56,29 - 776: 55,29 - 809: 13,-26 - 810: 14,-26 - 811: 15,-26 - 812: 13,-23 - 813: 14,-23 - 814: 15,-23 - 829: -3,-16 - 830: -4,-16 - 847: -32,0 - 848: -29,0 - 849: -29,4 - 850: -32,4 - 867: -14,23 - 868: -15,23 - 869: -16,23 - 870: -16,25 - 871: -15,25 - 872: -14,25 - 883: 17,19 - 884: 17,21 - 1081: -27,10 - 1091: 7,-20 - 1092: 8,-20 - 1093: 9,-20 - 1102: 83,-5 - 1118: 63,25 - 1119: 62,25 - 1120: 61,25 + 559: 86,1 + 560: 87,1 + 561: 87,-3 + 562: 86,-3 + 573: -31,0 + 574: -30,0 + 575: -31,4 + 576: -30,4 + 733: 85,1 + 734: 85,-3 + 738: 88,1 + 739: 88,-3 + 764: 74,-21 + 765: 75,-21 + 766: 76,-21 + 767: 74,-23 + 768: 75,-23 + 769: 76,-23 + 770: 55,26 + 771: 56,26 + 772: 57,26 + 773: 57,29 + 774: 56,29 + 775: 55,29 + 808: 13,-26 + 809: 14,-26 + 810: 15,-26 + 811: 13,-23 + 812: 14,-23 + 813: 15,-23 + 828: -3,-16 + 829: -4,-16 + 846: -32,0 + 847: -29,0 + 848: -29,4 + 849: -32,4 + 866: -14,23 + 867: -15,23 + 868: -16,23 + 869: -16,25 + 870: -15,25 + 871: -14,25 + 882: 17,19 + 883: 17,21 + 1080: -27,10 + 1090: 7,-20 + 1091: 8,-20 + 1092: 9,-20 + 1101: 83,-5 + 1117: 63,25 + 1118: 62,25 + 1119: 61,25 - node: color: '#FFFFFFFF' id: WarnLineS decals: - 566: 54,27 - 567: 54,28 - 572: 58,27 - 573: 58,28 - 584: 16,-25 - 585: 16,-24 - 586: 12,-25 - 587: 12,-24 - 727: 88,-2 - 728: 88,-1 - 729: 88,0 - 744: 85,0 - 745: 85,-1 - 746: 85,-2 - 783: 54,29 - 784: 54,26 - 785: 58,26 - 786: 58,29 - 819: 12,-26 - 820: 12,-23 - 821: 16,-26 - 822: 16,-23 - 823: -5,-15 - 824: -5,-14 - 841: -32,1 - 842: -32,2 - 843: -32,3 - 844: -29,1 - 845: -29,2 - 846: -29,3 - 885: -4,13 - 886: -1,13 - 887: 24,13 - 888: 27,13 - 1078: -26,7 - 1079: -26,8 - 1080: -26,9 - 1097: 10,-21 - 1098: 84,-8 - 1099: 84,-7 - 1100: 84,-6 - 1117: 64,24 + 565: 54,27 + 566: 54,28 + 571: 58,27 + 572: 58,28 + 583: 16,-25 + 584: 16,-24 + 585: 12,-25 + 586: 12,-24 + 726: 88,-2 + 727: 88,-1 + 728: 88,0 + 743: 85,0 + 744: 85,-1 + 745: 85,-2 + 782: 54,29 + 783: 54,26 + 784: 58,26 + 785: 58,29 + 818: 12,-26 + 819: 12,-23 + 820: 16,-26 + 821: 16,-23 + 822: -5,-15 + 823: -5,-14 + 840: -32,1 + 841: -32,2 + 842: -32,3 + 843: -29,1 + 844: -29,2 + 845: -29,3 + 884: -4,13 + 885: -1,13 + 886: 24,13 + 887: 27,13 + 1077: -26,7 + 1078: -26,8 + 1079: -26,9 + 1096: 10,-21 + 1097: 84,-8 + 1098: 84,-7 + 1099: 84,-6 + 1116: 64,24 - node: color: '#FFFFFFFF' id: WarnLineW decals: - 558: 86,1 - 559: 87,1 - 564: 86,-3 - 565: 87,-3 - 578: -31,4 - 579: -30,4 - 580: -31,0 - 581: -30,0 - 733: 85,1 - 736: 85,-3 - 737: 88,-3 - 738: 88,1 - 759: 74,-23 - 760: 75,-23 - 761: 76,-23 - 762: 74,-21 - 763: 75,-21 - 764: 76,-21 - 777: 57,29 - 778: 56,29 - 779: 55,29 - 780: 57,26 - 781: 56,26 - 782: 55,26 - 803: 13,-23 - 804: 14,-23 - 805: 15,-23 - 806: 15,-26 - 807: 14,-26 - 808: 13,-26 - 827: -4,-16 - 828: -3,-16 - 857: -32,4 - 858: -29,4 - 859: -29,0 - 860: -32,0 - 861: -14,25 - 862: -15,25 - 863: -16,25 - 864: -14,23 - 865: -15,23 - 866: -16,23 - 881: 17,21 - 882: 17,19 - 1074: -27,6 - 1087: 9,-22 - 1088: 7,-22 - 1089: 8,-22 - 1101: 83,-9 - 1114: 61,23 - 1115: 62,23 - 1116: 63,23 + 557: 86,1 + 558: 87,1 + 563: 86,-3 + 564: 87,-3 + 577: -31,4 + 578: -30,4 + 579: -31,0 + 580: -30,0 + 732: 85,1 + 735: 85,-3 + 736: 88,-3 + 737: 88,1 + 758: 74,-23 + 759: 75,-23 + 760: 76,-23 + 761: 74,-21 + 762: 75,-21 + 763: 76,-21 + 776: 57,29 + 777: 56,29 + 778: 55,29 + 779: 57,26 + 780: 56,26 + 781: 55,26 + 802: 13,-23 + 803: 14,-23 + 804: 15,-23 + 805: 15,-26 + 806: 14,-26 + 807: 13,-26 + 826: -4,-16 + 827: -3,-16 + 856: -32,4 + 857: -29,4 + 858: -29,0 + 859: -32,0 + 860: -14,25 + 861: -15,25 + 862: -16,25 + 863: -14,23 + 864: -15,23 + 865: -16,23 + 880: 17,21 + 881: 17,19 + 1073: -27,6 + 1086: 9,-22 + 1087: 7,-22 + 1088: 8,-22 + 1100: 83,-9 + 1113: 61,23 + 1114: 62,23 + 1115: 63,23 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerNe @@ -1973,8 +2015,12 @@ entities: 0: 3 5,3: 0: 4080 + 6,0: + 1: 1919 6,3: 1: 1776 + 6,-1: + 1: 28672 6,1: 1: 2184 7,0: @@ -2288,7 +2334,7 @@ entities: 12,-3: 1: 65532 12,-1: - 1: 3003 + 1: 3067 12,-2: 1: 36032 12,-5: @@ -2626,6 +2672,8 @@ entities: - 3910 - 4030 - 3760 + - 6413 + - 6418 - uid: 6084 components: - type: Transform @@ -3088,6 +3136,13 @@ entities: - type: Transform pos: 17.5,21.5 parent: 1 +- proto: AirlockFrontierBridgeGlassLocked + entities: + - uid: 2620 + components: + - type: Transform + pos: 27.5,0.5 + parent: 1 - proto: AirlockGlass entities: - uid: 88 @@ -3579,7 +3634,6 @@ entities: - uid: 1220 components: - type: Transform - rot: 3.141592653589793 rad pos: 54.5,-3.5 parent: 1 - proto: AirlockSecurityLocked @@ -3953,73 +4007,46 @@ entities: - type: Transform pos: 52.5,-6.5 parent: 1 - - type: DeviceLinkSink - links: - - 224 - uid: 669 components: - type: Transform pos: 53.5,-0.5 parent: 1 - - type: DeviceLinkSink - links: - - 822 - uid: 698 components: - type: Transform pos: 54.5,-1.5 parent: 1 - - type: DeviceLinkSink - links: - - 822 - uid: 710 components: - type: Transform pos: 52.5,-5.5 parent: 1 - - type: DeviceLinkSink - links: - - 224 - uid: 711 components: - type: Transform pos: 54.5,-6.5 parent: 1 - - type: DeviceLinkSink - links: - - 224 - uid: 712 components: - type: Transform pos: 54.5,-5.5 parent: 1 - - type: DeviceLinkSink - links: - - 224 - uid: 722 components: - type: Transform pos: 54.5,-3.5 parent: 1 - - type: DeviceLinkSink - links: - - 822 - uid: 724 components: - type: Transform pos: 54.5,-0.5 parent: 1 - - type: DeviceLinkSink - links: - - 822 - uid: 829 components: - type: Transform pos: 52.5,-0.5 parent: 1 - - type: DeviceLinkSink - links: - - 822 - proto: BorgCharger entities: - uid: 5809 @@ -4028,6 +4055,13 @@ entities: rot: 3.141592653589793 rad pos: -13.5,-0.5 parent: 1 +- proto: BoxFolderGreen + entities: + - uid: 6407 + components: + - type: Transform + pos: 24.809456,2.735341 + parent: 1 - proto: ButtonFrameCaution entities: - uid: 227 @@ -7199,6 +7233,21 @@ entities: - type: Transform pos: 19.5,-16.5 parent: 1 + - uid: 6408 + components: + - type: Transform + pos: 28.5,0.5 + parent: 1 + - uid: 6409 + components: + - type: Transform + pos: 27.5,0.5 + parent: 1 + - uid: 6410 + components: + - type: Transform + pos: 26.5,0.5 + parent: 1 - proto: CableHV entities: - uid: 2526 @@ -9316,9 +9365,6 @@ entities: - type: Transform pos: -24.5,9.5 parent: 1 - - type: DeviceLinkSink - links: - - 4291 - type: ContainerContainer containers: machine_board: !type:Container @@ -9330,9 +9376,6 @@ entities: - type: Transform pos: -24.5,7.5 parent: 1 - - type: DeviceLinkSink - links: - - 4291 - type: ContainerContainer containers: machine_board: !type:Container @@ -9344,9 +9387,6 @@ entities: - type: Transform pos: 7.5,-18.5 parent: 1 - - type: DeviceLinkSink - links: - - 604 - type: ContainerContainer containers: machine_board: !type:Container @@ -9358,9 +9398,6 @@ entities: - type: Transform pos: 9.5,-18.5 parent: 1 - - type: DeviceLinkSink - links: - - 604 - type: ContainerContainer containers: machine_board: !type:Container @@ -9372,9 +9409,6 @@ entities: - type: Transform pos: 81.5,-5.5 parent: 1 - - type: DeviceLinkSink - links: - - 758 - type: ContainerContainer containers: machine_board: !type:Container @@ -9386,9 +9420,6 @@ entities: - type: Transform pos: 81.5,-7.5 parent: 1 - - type: DeviceLinkSink - links: - - 758 - type: ContainerContainer containers: machine_board: !type:Container @@ -9400,9 +9431,6 @@ entities: - type: Transform pos: 61.5,22.5 parent: 1 - - type: DeviceLinkSink - links: - - 238 - type: ContainerContainer containers: machine_board: !type:Container @@ -9414,9 +9442,6 @@ entities: - type: Transform pos: 63.5,22.5 parent: 1 - - type: DeviceLinkSink - links: - - 238 - type: ContainerContainer containers: machine_board: !type:Container @@ -10527,6 +10552,12 @@ entities: rot: 3.141592653589793 rad pos: 52.5,-2.5 parent: 1 + - uid: 2926 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 25.5,1.5 + parent: 1 - proto: ClosetEmergencyFilledRandom entities: - uid: 6181 @@ -10895,6 +10926,21 @@ entities: rot: -1.5707963267948966 rad pos: -20.5,-3.5 parent: 1 +- proto: ComputerTabletopShuttleFrontierOutpostRemote + entities: + - uid: 2940 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 24.5,1.5 + parent: 1 +- proto: ComputerTabletopShuttleTradeOutpostLocal + entities: + - uid: 2945 + components: + - type: Transform + pos: 25.5,2.5 + parent: 1 - proto: ComputerTabletopSurveillanceCameraMonitor entities: - uid: 1264 @@ -11098,367 +11144,241 @@ entities: - type: Transform pos: 54.5,29.5 parent: 1 - - type: DeviceLinkSink - links: - - 6331 - uid: 240 components: - type: Transform pos: 54.5,28.5 parent: 1 - - type: DeviceLinkSink - links: - - 6331 - uid: 241 components: - type: Transform pos: 54.5,27.5 parent: 1 - - type: DeviceLinkSink - links: - - 6331 - uid: 242 components: - type: Transform pos: 54.5,26.5 parent: 1 - - type: DeviceLinkSink - links: - - 6331 - uid: 243 components: - type: Transform pos: 54.5,25.5 parent: 1 - - type: DeviceLinkSink - links: - - 6331 - uid: 244 components: - type: Transform rot: 3.141592653589793 rad pos: 58.5,25.5 parent: 1 - - type: DeviceLinkSink - links: - - 6331 - uid: 245 components: - type: Transform rot: 3.141592653589793 rad pos: 58.5,26.5 parent: 1 - - type: DeviceLinkSink - links: - - 6331 - uid: 246 components: - type: Transform rot: 3.141592653589793 rad pos: 58.5,27.5 parent: 1 - - type: DeviceLinkSink - links: - - 6331 - uid: 247 components: - type: Transform rot: 3.141592653589793 rad pos: 58.5,28.5 parent: 1 - - type: DeviceLinkSink - links: - - 6331 - uid: 248 components: - type: Transform rot: 3.141592653589793 rad pos: 58.5,29.5 parent: 1 - - type: DeviceLinkSink - links: - - 6331 - uid: 812 components: - type: Transform rot: -1.5707963267948966 rad pos: 88.5,1.5 parent: 1 - - type: DeviceLinkSink - links: - - 6332 - uid: 813 components: - type: Transform rot: -1.5707963267948966 rad pos: 87.5,1.5 parent: 1 - - type: DeviceLinkSink - links: - - 6332 - uid: 814 components: - type: Transform rot: -1.5707963267948966 rad pos: 86.5,1.5 parent: 1 - - type: DeviceLinkSink - links: - - 6332 - uid: 815 components: - type: Transform rot: -1.5707963267948966 rad pos: 85.5,1.5 parent: 1 - - type: DeviceLinkSink - links: - - 6332 - uid: 816 components: - type: Transform rot: -1.5707963267948966 rad pos: 84.5,1.5 parent: 1 - - type: DeviceLinkSink - links: - - 6332 - uid: 823 components: - type: Transform rot: 1.5707963267948966 rad pos: 84.5,-2.5 parent: 1 - - type: DeviceLinkSink - links: - - 6332 - uid: 824 components: - type: Transform rot: 1.5707963267948966 rad pos: 85.5,-2.5 parent: 1 - - type: DeviceLinkSink - links: - - 6332 - uid: 825 components: - type: Transform rot: 1.5707963267948966 rad pos: 86.5,-2.5 parent: 1 - - type: DeviceLinkSink - links: - - 6332 - uid: 826 components: - type: Transform rot: 1.5707963267948966 rad pos: 87.5,-2.5 parent: 1 - - type: DeviceLinkSink - links: - - 6332 - uid: 827 components: - type: Transform rot: 1.5707963267948966 rad pos: 88.5,-2.5 parent: 1 - - type: DeviceLinkSink - links: - - 6332 - uid: 902 components: - type: Transform rot: 1.5707963267948966 rad pos: -27.5,0.5 parent: 1 - - type: DeviceLinkSink - links: - - 6334 - uid: 4575 components: - type: Transform rot: 3.141592653589793 rad pos: 16.5,-25.5 parent: 1 - - type: DeviceLinkSink - links: - - 6333 - uid: 4576 components: - type: Transform rot: 3.141592653589793 rad pos: 16.5,-24.5 parent: 1 - - type: DeviceLinkSink - links: - - 6333 - uid: 4577 components: - type: Transform rot: 3.141592653589793 rad pos: 16.5,-23.5 parent: 1 - - type: DeviceLinkSink - links: - - 6333 - uid: 4578 components: - type: Transform rot: 3.141592653589793 rad pos: 16.5,-22.5 parent: 1 - - type: DeviceLinkSink - links: - - 6333 - uid: 4579 components: - type: Transform rot: 3.141592653589793 rad pos: 16.5,-21.5 parent: 1 - - type: DeviceLinkSink - links: - - 6333 - uid: 4586 components: - type: Transform pos: 12.5,-21.5 parent: 1 - - type: DeviceLinkSink - links: - - 6333 - uid: 4587 components: - type: Transform pos: 12.5,-22.5 parent: 1 - - type: DeviceLinkSink - links: - - 6333 - uid: 4588 components: - type: Transform pos: 12.5,-23.5 parent: 1 - - type: DeviceLinkSink - links: - - 6333 - uid: 4589 components: - type: Transform pos: 12.5,-24.5 parent: 1 - - type: DeviceLinkSink - links: - - 6333 - uid: 4590 components: - type: Transform pos: 12.5,-25.5 parent: 1 - - type: DeviceLinkSink - links: - - 6333 - uid: 4592 components: - type: Transform rot: 1.5707963267948966 rad pos: -28.5,0.5 parent: 1 - - type: DeviceLinkSink - links: - - 6334 - uid: 4593 components: - type: Transform rot: 1.5707963267948966 rad pos: -29.5,0.5 parent: 1 - - type: DeviceLinkSink - links: - - 6334 - uid: 4594 components: - type: Transform rot: 1.5707963267948966 rad pos: -30.5,0.5 parent: 1 - - type: DeviceLinkSink - links: - - 6334 - uid: 4595 components: - type: Transform rot: 1.5707963267948966 rad pos: -31.5,0.5 parent: 1 - - type: DeviceLinkSink - links: - - 6334 - uid: 4602 components: - type: Transform rot: -1.5707963267948966 rad pos: -27.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 6334 - uid: 4603 components: - type: Transform rot: -1.5707963267948966 rad pos: -28.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 6334 - uid: 4604 components: - type: Transform rot: -1.5707963267948966 rad pos: -29.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 6334 - uid: 4605 components: - type: Transform rot: -1.5707963267948966 rad pos: -30.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 6334 - uid: 4606 components: - type: Transform rot: -1.5707963267948966 rad pos: -31.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 6334 - uid: 5797 components: - type: Transform pos: -18.5,-3.5 parent: 1 - - type: DeviceLinkSink - links: - - 1537 - uid: 5798 components: - type: Transform pos: -18.5,-4.5 parent: 1 - - type: DeviceLinkSink - links: - - 1537 - proto: CrateFreezer entities: - uid: 1353 @@ -13601,6 +13521,12 @@ entities: rot: 3.141592653589793 rad pos: 73.5,3.5 parent: 1 + - uid: 6419 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 24.5,0.5 + parent: 1 - proto: ExtinguisherCabinetFilled entities: - uid: 5750 @@ -13626,6 +13552,13 @@ entities: - type: Transform pos: 59.5,-4.5 parent: 1 +- proto: FaxMachineNFTradeSTC + entities: + - uid: 2938 + components: + - type: Transform + pos: 26.5,2.5 + parent: 1 - proto: Firelock entities: - uid: 3795 @@ -14520,6 +14453,11 @@ entities: - type: DeviceNetwork deviceLists: - 6082 + - uid: 6421 + components: + - type: Transform + pos: 27.5,0.5 + parent: 1 - proto: FloorDrain entities: - uid: 877 @@ -15756,13 +15694,6 @@ entities: parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 2021 - components: - - type: Transform - pos: 28.5,0.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - uid: 2022 components: - type: Transform @@ -19474,14 +19405,6 @@ entities: parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 5183 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 30.5,1.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - uid: 5184 components: - type: Transform @@ -19626,6 +19549,54 @@ entities: parent: 1 - type: AtmosPipeColor color: '#0055CCFF' + - uid: 6411 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 27.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 6412 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 26.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 6414 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 29.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 6415 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 28.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 6416 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 27.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 6417 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 26.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' - proto: GasPipeTJunction entities: - uid: 264 @@ -19791,6 +19762,14 @@ entities: parent: 1 - type: AtmosPipeColor color: '#0055CCFF' + - uid: 2021 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 28.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' - uid: 2039 components: - type: Transform @@ -19984,6 +19963,14 @@ entities: parent: 1 - type: AtmosPipeColor color: '#990000FF' + - uid: 2618 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 30.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' - uid: 3469 components: - type: Transform @@ -20825,6 +20812,17 @@ entities: - 6080 - type: AtmosPipeColor color: '#0055CCFF' + - uid: 6413 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 25.5,0.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 6083 + - type: AtmosPipeColor + color: '#0055CCFF' - proto: GasVentScrubber entities: - uid: 1948 @@ -21368,6 +21366,17 @@ entities: - 6080 - type: AtmosPipeColor color: '#990000FF' + - uid: 6418 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 25.5,1.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 6083 + - type: AtmosPipeColor + color: '#990000FF' - proto: GasVolumePumpOn entities: - uid: 834 @@ -22034,6 +22043,11 @@ entities: rot: 3.141592653589793 rad pos: 17.5,-23.5 parent: 1 + - uid: 2912 + components: + - type: Transform + pos: 27.5,1.5 + parent: 1 - uid: 3377 components: - type: Transform @@ -22424,6 +22438,11 @@ entities: - type: Transform pos: -7.5,-15.5 parent: 1 + - uid: 5183 + components: + - type: Transform + pos: 27.5,2.5 + parent: 1 - uid: 6073 components: - type: Transform @@ -22909,6 +22928,11 @@ entities: parent: 1 - proto: PottedPlantRandomPlastic entities: + - uid: 2911 + components: + - type: Transform + pos: 24.5,-0.5 + parent: 1 - uid: 6211 components: - type: Transform @@ -23216,8 +23240,8 @@ entities: - uid: 4001 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 28.5,1.5 + rot: -1.5707963267948966 rad + pos: 30.5,-0.5 parent: 1 - uid: 4002 components: @@ -23358,6 +23382,12 @@ entities: - type: Transform pos: 10.5,-14.5 parent: 1 + - uid: 6420 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 25.5,-0.5 + parent: 1 - proto: PoweredlightGreen entities: - uid: 512 @@ -25456,6 +25486,16 @@ entities: rot: 3.141592653589793 rad pos: -29.5,5.5 parent: 1 + - uid: 2948 + components: + - type: Transform + pos: 27.5,1.5 + parent: 1 + - uid: 2949 + components: + - type: Transform + pos: 27.5,2.5 + parent: 1 - uid: 3677 components: - type: Transform @@ -25775,6 +25815,20 @@ entities: rot: 3.141592653589793 rad pos: 11.5,-23.5 parent: 1 +- proto: RubberStampApproved + entities: + - uid: 6405 + components: + - type: Transform + pos: 24.39279,2.547841 + parent: 1 +- proto: RubberStampDenied + entities: + - uid: 6406 + components: + - type: Transform + pos: 24.684456,2.3707576 + parent: 1 - proto: SellOnlyMothershipComputer entities: - uid: 1225 @@ -25847,684 +25901,441 @@ entities: - type: Transform pos: 60.5,-2.5 parent: 1 - - type: DeviceLinkSink - links: - - 5991 - uid: 1208 components: - type: Transform pos: 61.5,-2.5 parent: 1 - - type: DeviceLinkSink - links: - - 5991 - uid: 1209 components: - type: Transform pos: 62.5,-2.5 parent: 1 - - type: DeviceLinkSink - links: - - 5991 - uid: 1210 components: - type: Transform pos: 63.5,-2.5 parent: 1 - - type: DeviceLinkSink - links: - - 5991 - uid: 1211 components: - type: Transform pos: 64.5,-2.5 parent: 1 - - type: DeviceLinkSink - links: - - 5991 - uid: 5992 components: - type: Transform pos: 48.5,26.5 parent: 1 - - type: DeviceLinkSink - links: - - 6006 - uid: 5993 components: - type: Transform pos: 49.5,26.5 parent: 1 - - type: DeviceLinkSink - links: - - 6006 - uid: 5994 components: - type: Transform pos: 50.5,26.5 parent: 1 - - type: DeviceLinkSink - links: - - 6006 - uid: 5995 components: - type: Transform pos: 51.5,26.5 parent: 1 - - type: DeviceLinkSink - links: - - 6006 - uid: 5996 components: - type: Transform pos: 52.5,26.5 parent: 1 - - type: DeviceLinkSink - links: - - 6006 - uid: 5997 components: - type: Transform pos: 60.5,26.5 parent: 1 - - type: DeviceLinkSink - links: - - 6006 - uid: 5998 components: - type: Transform pos: 61.5,26.5 parent: 1 - - type: DeviceLinkSink - links: - - 6006 - uid: 5999 components: - type: Transform pos: 62.5,26.5 parent: 1 - - type: DeviceLinkSink - links: - - 6006 - uid: 6000 components: - type: Transform pos: 63.5,26.5 parent: 1 - - type: DeviceLinkSink - links: - - 6006 - uid: 6001 components: - type: Transform pos: 64.5,26.5 parent: 1 - - type: DeviceLinkSink - links: - - 6006 - uid: 6002 components: - type: Transform rot: -1.5707963267948966 rad pos: 65.5,25.5 parent: 1 - - type: DeviceLinkSink - links: - - 6006 - uid: 6003 components: - type: Transform rot: -1.5707963267948966 rad pos: 65.5,24.5 parent: 1 - - type: DeviceLinkSink - links: - - 6006 - uid: 6004 components: - type: Transform rot: 1.5707963267948966 rad pos: 47.5,25.5 parent: 1 - - type: DeviceLinkSink - links: - - 6006 - uid: 6005 components: - type: Transform rot: 1.5707963267948966 rad pos: 47.5,24.5 parent: 1 - - type: DeviceLinkSink - links: - - 6006 - uid: 6013 components: - type: Transform pos: 83.5,8.5 parent: 1 - - type: DeviceLinkSink - links: - - 6007 - uid: 6014 components: - type: Transform pos: 84.5,8.5 parent: 1 - - type: DeviceLinkSink - links: - - 6007 - uid: 6015 components: - type: Transform pos: 83.5,-9.5 parent: 1 - - type: DeviceLinkSink - links: - - 6007 - uid: 6016 components: - type: Transform pos: 84.5,-9.5 parent: 1 - - type: DeviceLinkSink - links: - - 6007 - uid: 6017 components: - type: Transform rot: -1.5707963267948966 rad pos: 85.5,7.5 parent: 1 - - type: DeviceLinkSink - links: - - 6007 - uid: 6018 components: - type: Transform rot: -1.5707963267948966 rad pos: 85.5,6.5 parent: 1 - - type: DeviceLinkSink - links: - - 6007 - uid: 6019 components: - type: Transform rot: -1.5707963267948966 rad pos: 85.5,5.5 parent: 1 - - type: DeviceLinkSink - links: - - 6007 - uid: 6020 components: - type: Transform rot: -1.5707963267948966 rad pos: 85.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 6007 - uid: 6021 components: - type: Transform rot: -1.5707963267948966 rad pos: 85.5,3.5 parent: 1 - - type: DeviceLinkSink - links: - - 6007 - uid: 6022 components: - type: Transform rot: -1.5707963267948966 rad pos: 85.5,-4.5 parent: 1 - - type: DeviceLinkSink - links: - - 6007 - uid: 6023 components: - type: Transform rot: -1.5707963267948966 rad pos: 85.5,-5.5 parent: 1 - - type: DeviceLinkSink - links: - - 6007 - uid: 6024 components: - type: Transform rot: -1.5707963267948966 rad pos: 85.5,-6.5 parent: 1 - - type: DeviceLinkSink - links: - - 6007 - uid: 6025 components: - type: Transform rot: -1.5707963267948966 rad pos: 85.5,-7.5 parent: 1 - - type: DeviceLinkSink - links: - - 6007 - uid: 6026 components: - type: Transform rot: -1.5707963267948966 rad pos: 85.5,-8.5 parent: 1 - - type: DeviceLinkSink - links: - - 6007 - uid: 6027 components: - type: Transform rot: -1.5707963267948966 rad pos: 77.5,-14.5 parent: 1 - - type: DeviceLinkSink - links: - - 6012 - uid: 6028 components: - type: Transform rot: -1.5707963267948966 rad pos: 77.5,-15.5 parent: 1 - - type: DeviceLinkSink - links: - - 6012 - uid: 6029 components: - type: Transform rot: -1.5707963267948966 rad pos: 77.5,-16.5 parent: 1 - - type: DeviceLinkSink - links: - - 6012 - uid: 6030 components: - type: Transform rot: -1.5707963267948966 rad pos: 77.5,-17.5 parent: 1 - - type: DeviceLinkSink - links: - - 6012 - uid: 6031 components: - type: Transform rot: -1.5707963267948966 rad pos: 77.5,-18.5 parent: 1 - - type: DeviceLinkSink - links: - - 6012 - uid: 6032 components: - type: Transform pos: 62.5,-19.5 parent: 1 - - type: DeviceLinkSink - links: - - 6008 - uid: 6033 components: - type: Transform pos: 61.5,-19.5 parent: 1 - - type: DeviceLinkSink - links: - - 6008 - uid: 6034 components: - type: Transform pos: 60.5,-19.5 parent: 1 - - type: DeviceLinkSink - links: - - 6008 - uid: 6035 components: - type: Transform pos: 59.5,-19.5 parent: 1 - - type: DeviceLinkSink - links: - - 6008 - uid: 6036 components: - type: Transform pos: 57.5,-19.5 parent: 1 - - type: DeviceLinkSink - links: - - 6009 - uid: 6037 components: - type: Transform pos: 56.5,-19.5 parent: 1 - - type: DeviceLinkSink - links: - - 6009 - uid: 6038 components: - type: Transform pos: 55.5,-19.5 parent: 1 - - type: DeviceLinkSink - links: - - 6009 - uid: 6039 components: - type: Transform pos: 52.5,-19.5 parent: 1 - - type: DeviceLinkSink - links: - - 6009 - uid: 6040 components: - type: Transform pos: 51.5,-19.5 parent: 1 - - type: DeviceLinkSink - links: - - 6009 - uid: 6041 components: - type: Transform pos: 50.5,-19.5 parent: 1 - - type: DeviceLinkSink - links: - - 6009 - uid: 6042 components: - type: Transform rot: 1.5707963267948966 rad pos: 49.5,-17.5 parent: 1 - - type: DeviceLinkSink - links: - - 6009 - uid: 6043 components: - type: Transform rot: 1.5707963267948966 rad pos: 49.5,-18.5 parent: 1 - - type: DeviceLinkSink - links: - - 6009 - uid: 6044 components: - type: Transform rot: -1.5707963267948966 rad pos: 23.5,-20.5 parent: 1 - - type: DeviceLinkSink - links: - - 6010 - uid: 6045 components: - type: Transform rot: -1.5707963267948966 rad pos: 23.5,-21.5 parent: 1 - - type: DeviceLinkSink - links: - - 6010 - uid: 6046 components: - type: Transform pos: 22.5,-22.5 parent: 1 - - type: DeviceLinkSink - links: - - 6010 - uid: 6047 components: - type: Transform pos: 21.5,-22.5 parent: 1 - - type: DeviceLinkSink - links: - - 6010 - uid: 6048 components: - type: Transform pos: 20.5,-22.5 parent: 1 - - type: DeviceLinkSink - links: - - 6010 - uid: 6049 components: - type: Transform pos: 19.5,-22.5 parent: 1 - - type: DeviceLinkSink - links: - - 6010 - uid: 6050 components: - type: Transform pos: 18.5,-22.5 parent: 1 - - type: DeviceLinkSink - links: - - 6010 - uid: 6051 components: - type: Transform pos: 10.5,-22.5 parent: 1 - - type: DeviceLinkSink - links: - - 6010 - uid: 6052 components: - type: Transform pos: 9.5,-22.5 parent: 1 - - type: DeviceLinkSink - links: - - 6010 - uid: 6053 components: - type: Transform pos: 8.5,-22.5 parent: 1 - - type: DeviceLinkSink - links: - - 6010 - uid: 6054 components: - type: Transform pos: 7.5,-22.5 parent: 1 - - type: DeviceLinkSink - links: - - 6010 - uid: 6055 components: - type: Transform pos: 6.5,-22.5 parent: 1 - - type: DeviceLinkSink - links: - - 6010 - uid: 6056 components: - type: Transform rot: 1.5707963267948966 rad pos: 5.5,-21.5 parent: 1 - - type: DeviceLinkSink - links: - - 6010 - uid: 6057 components: - type: Transform rot: 1.5707963267948966 rad pos: 5.5,-20.5 parent: 1 - - type: DeviceLinkSink - links: - - 6010 - uid: 6058 components: - type: Transform pos: -27.5,-6.5 parent: 1 - - type: DeviceLinkSink - links: - - 6011 - uid: 6059 components: - type: Transform pos: -26.5,-6.5 parent: 1 - - type: DeviceLinkSink - links: - - 6011 - uid: 6060 components: - type: Transform pos: -27.5,11.5 parent: 1 - - type: DeviceLinkSink - links: - - 6011 - uid: 6061 components: - type: Transform pos: -26.5,11.5 parent: 1 - - type: DeviceLinkSink - links: - - 6011 - uid: 6062 components: - type: Transform rot: 1.5707963267948966 rad pos: -28.5,10.5 parent: 1 - - type: DeviceLinkSink - links: - - 6011 - uid: 6063 components: - type: Transform rot: 1.5707963267948966 rad pos: -28.5,9.5 parent: 1 - - type: DeviceLinkSink - links: - - 6011 - uid: 6064 components: - type: Transform rot: 1.5707963267948966 rad pos: -28.5,8.5 parent: 1 - - type: DeviceLinkSink - links: - - 6011 - uid: 6065 components: - type: Transform rot: 1.5707963267948966 rad pos: -28.5,7.5 parent: 1 - - type: DeviceLinkSink - links: - - 6011 - uid: 6066 components: - type: Transform rot: 1.5707963267948966 rad pos: -28.5,6.5 parent: 1 - - type: DeviceLinkSink - links: - - 6011 - uid: 6067 components: - type: Transform rot: 1.5707963267948966 rad pos: -28.5,-1.5 parent: 1 - - type: DeviceLinkSink - links: - - 6011 - uid: 6068 components: - type: Transform rot: 1.5707963267948966 rad pos: -28.5,-2.5 parent: 1 - - type: DeviceLinkSink - links: - - 6011 - uid: 6069 components: - type: Transform rot: 1.5707963267948966 rad pos: -28.5,-3.5 parent: 1 - - type: DeviceLinkSink - links: - - 6011 - uid: 6070 components: - type: Transform rot: 1.5707963267948966 rad pos: -28.5,-4.5 parent: 1 - - type: DeviceLinkSink - links: - - 6011 - uid: 6071 components: - type: Transform rot: 1.5707963267948966 rad pos: -28.5,-5.5 parent: 1 - - type: DeviceLinkSink - links: - - 6011 - uid: 6075 components: - type: Transform pos: -5.5,-15.5 parent: 1 - - type: DeviceLinkSink - links: - - 6078 - uid: 6076 components: - type: Transform pos: -6.5,-15.5 parent: 1 - - type: DeviceLinkSink - links: - - 6078 - uid: 6077 components: - type: Transform pos: -7.5,-15.5 parent: 1 - - type: DeviceLinkSink - links: - - 6078 - proto: SignalButtonDirectional entities: - uid: 5991 @@ -27780,6 +27591,24 @@ entities: - type: Transform pos: 50.5,-11.5 parent: 1 + - uid: 2619 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 25.5,2.5 + parent: 1 + - uid: 2927 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 24.5,1.5 + parent: 1 + - uid: 2928 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 24.5,2.5 + parent: 1 - uid: 3287 components: - type: Transform @@ -27881,6 +27710,12 @@ entities: rot: -1.5707963267948966 rad pos: -0.5,-3.5 parent: 1 + - uid: 6330 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 26.5,2.5 + parent: 1 - proto: TableStone entities: - uid: 1180 @@ -32444,21 +32279,6 @@ entities: - type: Transform pos: 27.5,-0.5 parent: 1 - - uid: 2618 - components: - - type: Transform - pos: 27.5,0.5 - parent: 1 - - uid: 2619 - components: - - type: Transform - pos: 27.5,1.5 - parent: 1 - - uid: 2620 - components: - - type: Transform - pos: 27.5,2.5 - parent: 1 - uid: 2621 components: - type: Transform @@ -32869,6 +32689,60 @@ entities: - type: Transform pos: 33.5,5.5 parent: 1 + - uid: 2913 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 24.5,-1.5 + parent: 1 + - uid: 2914 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 23.5,-1.5 + parent: 1 + - uid: 2915 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 23.5,-0.5 + parent: 1 + - uid: 2916 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 23.5,0.5 + parent: 1 + - uid: 2923 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 23.5,2.5 + parent: 1 + - uid: 2924 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 23.5,1.5 + parent: 1 + - uid: 2925 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 25.5,-1.5 + parent: 1 + - uid: 2936 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 23.5,3.5 + parent: 1 + - uid: 2937 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 26.5,-1.5 + parent: 1 - uid: 2942 components: - type: Transform @@ -32881,6 +32755,18 @@ entities: rot: 3.141592653589793 rad pos: 26.5,-3.5 parent: 1 + - uid: 2946 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 24.5,3.5 + parent: 1 + - uid: 2947 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 25.5,3.5 + parent: 1 - uid: 2972 components: - type: Transform @@ -36938,36 +36824,6 @@ entities: - type: Transform pos: 23.5,4.5 parent: 1 - - uid: 2911 - components: - - type: Transform - pos: 23.5,3.5 - parent: 1 - - uid: 2912 - components: - - type: Transform - pos: 23.5,2.5 - parent: 1 - - uid: 2913 - components: - - type: Transform - pos: 23.5,1.5 - parent: 1 - - uid: 2914 - components: - - type: Transform - pos: 23.5,0.5 - parent: 1 - - uid: 2915 - components: - - type: Transform - pos: 23.5,-0.5 - parent: 1 - - uid: 2916 - components: - - type: Transform - pos: 23.5,-1.5 - parent: 1 - uid: 2917 components: - type: Transform @@ -36998,36 +36854,6 @@ entities: - type: Transform pos: 24.5,4.5 parent: 1 - - uid: 2923 - components: - - type: Transform - pos: 24.5,3.5 - parent: 1 - - uid: 2924 - components: - - type: Transform - pos: 24.5,2.5 - parent: 1 - - uid: 2925 - components: - - type: Transform - pos: 24.5,1.5 - parent: 1 - - uid: 2926 - components: - - type: Transform - pos: 24.5,0.5 - parent: 1 - - uid: 2927 - components: - - type: Transform - pos: 24.5,-0.5 - parent: 1 - - uid: 2928 - components: - - type: Transform - pos: 24.5,-1.5 - parent: 1 - uid: 2929 components: - type: Transform @@ -37053,36 +36879,6 @@ entities: - type: Transform pos: 25.5,4.5 parent: 1 - - uid: 2935 - components: - - type: Transform - pos: 25.5,3.5 - parent: 1 - - uid: 2936 - components: - - type: Transform - pos: 25.5,2.5 - parent: 1 - - uid: 2937 - components: - - type: Transform - pos: 25.5,1.5 - parent: 1 - - uid: 2938 - components: - - type: Transform - pos: 25.5,0.5 - parent: 1 - - uid: 2939 - components: - - type: Transform - pos: 25.5,-0.5 - parent: 1 - - uid: 2940 - components: - - type: Transform - pos: 25.5,-1.5 - parent: 1 - uid: 2941 components: - type: Transform @@ -37093,31 +36889,6 @@ entities: - type: Transform pos: 26.5,-2.5 parent: 1 - - uid: 2945 - components: - - type: Transform - pos: 26.5,-1.5 - parent: 1 - - uid: 2946 - components: - - type: Transform - pos: 26.5,-0.5 - parent: 1 - - uid: 2947 - components: - - type: Transform - pos: 26.5,0.5 - parent: 1 - - uid: 2948 - components: - - type: Transform - pos: 26.5,1.5 - parent: 1 - - uid: 2949 - components: - - type: Transform - pos: 26.5,2.5 - parent: 1 - uid: 2950 components: - type: Transform @@ -39904,10 +39675,17 @@ entities: parent: 1 - proto: WarpPointNFTrade entities: - - uid: 6330 + - uid: 2939 components: - type: Transform - pos: 59.5,-4.5 + pos: 60.5,-4.5 + parent: 1 +- proto: WaterCooler + entities: + - uid: 2935 + components: + - type: Transform + pos: 26.5,-0.5 parent: 1 - proto: WaterTankHighCapacity entities: diff --git a/Resources/Maps/_NF/Shuttles/BlackMarket/menace.yml b/Resources/Maps/_NF/Shuttles/BlackMarket/menace.yml index 5a9bfb23277..b75161fa2fd 100644 --- a/Resources/Maps/_NF/Shuttles/BlackMarket/menace.yml +++ b/Resources/Maps/_NF/Shuttles/BlackMarket/menace.yml @@ -268,25 +268,30 @@ entities: rot: -1.5707963267948966 rad pos: 7.5,-0.5 parent: 1 -- proto: AtmosDeviceFanTiny +- proto: AtmosDeviceFanDirectional entities: - - uid: 7 + - uid: 4 components: - type: Transform pos: 6.5,-3.5 parent: 1 - - uid: 24 + - uid: 7 components: - type: Transform rot: -1.5707963267948966 rad pos: 4.5,3.5 parent: 1 + - uid: 24 + components: + - type: Transform + pos: 5.5,-3.5 + parent: 1 - uid: 151 components: - type: Transform pos: 0.5,-3.5 parent: 1 - - uid: 163 + - uid: 242 components: - type: Transform pos: -0.5,-3.5 @@ -1087,8 +1092,13 @@ entities: rot: 3.141592653589793 rad pos: 3.5,-2.5 parent: 1 - - type: Thruster - originalPowerLoad: 1500 +- proto: LockerWallMaterialsFuelPlasmaFilled + entities: + - uid: 77 + components: + - type: Transform + pos: 6.5,2.5 + parent: 1 - proto: NetworkConfigurator entities: - uid: 182 @@ -1135,7 +1145,7 @@ entities: parent: 1 - proto: PlasticFlapsAirtightClear entities: - - uid: 4 + - uid: 163 components: - type: Transform pos: 5.5,-3.5 @@ -1154,6 +1164,8 @@ entities: parent: 1 - type: FuelGenerator on: False + - type: MaterialStorageMagnetPickup + magnetEnabled: True - type: Physics bodyType: Static - proto: Poweredlight @@ -1343,13 +1355,6 @@ entities: - type: Transform pos: 3.160936,4.206492 parent: 1 -- proto: SheetPlasma - entities: - - uid: 146 - components: - - type: Transform - pos: 6.544826,1.53125 - parent: 1 - proto: ShuttersNormalOpen entities: - uid: 3 @@ -1357,25 +1362,16 @@ entities: - type: Transform pos: 0.5,-3.5 parent: 1 - - type: DeviceLinkSink - links: - - 157 - uid: 123 components: - type: Transform pos: 6.5,-3.5 parent: 1 - - type: DeviceLinkSink - links: - - 37 - uid: 223 components: - type: Transform pos: 4.5,3.5 parent: 1 - - type: DeviceLinkSink - links: - - 26 - proto: ShuttleGunPirateCannon entities: - uid: 61 @@ -1384,18 +1380,12 @@ entities: rot: 3.141592653589793 rad pos: -0.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 240 - uid: 222 components: - type: Transform rot: 3.141592653589793 rad pos: 2.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 241 - proto: SignalButtonDirectional entities: - uid: 26 @@ -1453,14 +1443,6 @@ entities: 222: - Pressed: Toggle - Pressed: Trigger -- proto: SignSpace - entities: - - uid: 77 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,2.5 - parent: 1 - proto: SpawnPointPirate entities: - uid: 93 @@ -1497,8 +1479,6 @@ entities: - type: Transform pos: 4.5,2.5 parent: 1 - - type: Physics - canCollide: False - proto: Table entities: - uid: 13 @@ -1560,47 +1540,35 @@ entities: rot: 3.141592653589793 rad pos: 2.5,-3.5 parent: 1 - - type: Thruster - originalPowerLoad: 1500 - uid: 122 components: - type: Transform rot: 3.141592653589793 rad pos: 3.5,-3.5 parent: 1 - - type: Thruster - originalPowerLoad: 1500 - uid: 161 components: - type: Transform pos: 7.5,4.5 parent: 1 - - type: Thruster - originalPowerLoad: 1500 - uid: 162 components: - type: Transform rot: 3.141592653589793 rad pos: -2.5,-3.5 parent: 1 - - type: Thruster - originalPowerLoad: 1500 - uid: 180 components: - type: Transform rot: 1.5707963267948966 rad pos: -2.5,-2.5 parent: 1 - - type: Thruster - originalPowerLoad: 1500 - uid: 202 components: - type: Transform rot: -1.5707963267948966 rad pos: 7.5,3.5 parent: 1 - - type: Thruster - originalPowerLoad: 1500 - proto: ToolboxMechanicalFilled entities: - uid: 154 diff --git a/Resources/Maps/_NF/Shuttles/Expedition/anchor.yml b/Resources/Maps/_NF/Shuttles/Expedition/anchor.yml index 0e36b1cb017..66619e85c2d 100644 --- a/Resources/Maps/_NF/Shuttles/Expedition/anchor.yml +++ b/Resources/Maps/_NF/Shuttles/Expedition/anchor.yml @@ -9098,13 +9098,6 @@ entities: rot: -1.5707963267948966 rad pos: 18.5,-15.5 parent: 1 -- proto: IntercomService - entities: - - uid: 1792 - components: - - type: Transform - pos: -4.5,-4.5 - parent: 1 - proto: LampGold entities: - uid: 692 diff --git a/Resources/Maps/_NF/Shuttles/Sr/mailpod.yml b/Resources/Maps/_NF/Shuttles/Sr/mailpod.yml index 01585bb32ae..995836b1a5c 100644 --- a/Resources/Maps/_NF/Shuttles/Sr/mailpod.yml +++ b/Resources/Maps/_NF/Shuttles/Sr/mailpod.yml @@ -118,36 +118,19 @@ entities: data: tiles: 0,0: - 0: 1 - 1: 4402 - 2: 17408 + 0: 4403 + 1: 17408 0,-1: - 1: 12594 - 0: 512 + 0: 13106 -1,0: - 1: 34944 + 0: 34944 0,1: - 2: 4 + 1: 4 -1,-1: - 2: 17476 + 1: 17476 -1,1: - 2: 4 + 1: 4 uniqueMixes: - - volume: 2500 - temperature: 293.15 - moles: - - 21.6852 - - 81.57766 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - volume: 2500 temperature: 293.15 moles: @@ -196,7 +179,7 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,2.5 parent: 1 -- proto: AtmosDeviceFanTiny +- proto: AtmosDeviceFanDirectional entities: - uid: 29 components: @@ -250,31 +233,6 @@ entities: - type: Transform pos: 2.5,2.5 parent: 1 -- proto: BoxMailCapsulePrimed - entities: - - uid: 37 - components: - - type: Transform - parent: 72 - - type: Physics - canCollide: False - - type: InsideEntityStorage - - uid: 105 - components: - - type: Transform - parent: 72 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: BoxPaperOffice - entities: - - uid: 89 - components: - - type: Transform - parent: 99 - - type: Physics - canCollide: False - - type: InsideEntityStorage - proto: CableApcExtension entities: - uid: 63 @@ -359,76 +317,6 @@ entities: rot: 3.141592653589793 rad pos: 0.5,2.5 parent: 1 -- proto: ClosetWall - entities: - - uid: 72 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-1.5 - parent: 1 - - type: EntityStorage - air: - volume: 200 - immutable: False - temperature: 293.14923 - moles: - - 1.8856695 - - 7.0937095 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - type: ContainerContainer - containers: - entity_storage: !type:Container - showEnts: False - occludes: True - ents: - - 9 - - 37 - - 105 - - uid: 99 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,0.5 - parent: 1 - - type: EntityStorage - air: - volume: 200 - immutable: False - temperature: 293.14923 - moles: - - 1.8856695 - - 7.0937095 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - type: ContainerContainer - containers: - entity_storage: !type:Container - showEnts: False - occludes: True - ents: - - 89 - - 92 - - 91 - - 16 - - 93 - proto: ComputerTabletopShuttle entities: - uid: 50 @@ -452,13 +340,18 @@ entities: rot: -1.5707963267948966 rad pos: 2.5,-3.5 parent: 1 - - type: Physics - canCollide: False - type: ContainerContainer containers: board: !type:Container + showEnts: False + occludes: True ents: [] - bank-ATM-cashSlot: !type:ContainerSlot {} + bank-ATM-cashSlot: !type:ContainerSlot + showEnts: False + occludes: True + ent: null + - type: Physics + canCollide: False - type: ItemSlots - proto: DefibrillatorCabinetFilled entities: @@ -657,6 +550,30 @@ entities: - type: Transform pos: -1.5,4.5 parent: 1 +- proto: LockerWallEVAColorMailFilled + entities: + - uid: 95 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,-2.5 + parent: 1 +- proto: LockerWallMaterialsBasic10Filled + entities: + - uid: 9 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,-1.5 + parent: 1 +- proto: LockerWallMaterialsFuelPlasmaFilled + entities: + - uid: 37 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,0.5 + parent: 1 - proto: NitrogenCanister entities: - uid: 109 @@ -677,6 +594,13 @@ entities: parent: 1 - type: Physics bodyType: Static +- proto: PaperOffice + entities: + - uid: 72 + components: + - type: Transform + pos: -0.49241737,3.2409117 + parent: 1 - proto: PlasticFlapsAirtightClear entities: - uid: 27 @@ -693,6 +617,8 @@ entities: parent: 1 - type: FuelGenerator on: False + - type: MaterialStorageMagnetPickup + magnetEnabled: True - type: Physics bodyType: Static - proto: PowerCellRecharger @@ -777,40 +703,6 @@ entities: - type: Transform pos: 1.5,-0.5 parent: 1 -- proto: SheetGlass - entities: - - uid: 93 - components: - - type: Transform - parent: 99 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: SheetPlasma - entities: - - uid: 86 - components: - - type: Transform - pos: -0.5,1.5 - parent: 1 -- proto: SheetPlastic - entities: - - uid: 92 - components: - - type: Transform - parent: 99 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: SheetSteel - entities: - - uid: 91 - components: - - type: Transform - parent: 99 - - type: Physics - canCollide: False - - type: InsideEntityStorage - proto: ShuttersNormalOpen entities: - uid: 79 @@ -818,9 +710,6 @@ entities: - type: Transform pos: 1.5,-3.5 parent: 1 - - type: DeviceLinkSink - links: - - 88 - proto: SignalButtonDirectional entities: - uid: 88 @@ -866,16 +755,6 @@ entities: - type: Transform pos: 2.5,1.5 parent: 1 -- proto: LockerWallEVAColorMailFilled - entities: - - uid: 95 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,-2.5 - parent: 1 - - type: Physics - canCollide: False - proto: Table entities: - uid: 17 @@ -934,10 +813,8 @@ entities: - uid: 16 components: - type: Transform - parent: 99 - - type: Physics - canCollide: False - - type: InsideEntityStorage + pos: -0.4848204,1.8352823 + parent: 1 - proto: WallReinforced entities: - uid: 2 @@ -1014,15 +891,6 @@ entities: - type: Transform pos: 0.5,2.5 parent: 1 -- proto: WeaponMailLake - entities: - - uid: 9 - components: - - type: Transform - parent: 72 - - type: Physics - canCollide: False - - type: InsideEntityStorage - proto: WindoorSecureMailLocked entities: - uid: 41 @@ -1030,9 +898,6 @@ entities: - type: Transform pos: 1.5,-2.5 parent: 1 - - type: DeviceLinkSink - links: - - 88 - uid: 77 components: - type: Transform diff --git a/Resources/Maps/_NF/Shuttles/Sr/parcel.yml b/Resources/Maps/_NF/Shuttles/Sr/parcel.yml index 4f03fabd5ee..efcb2e00f8c 100644 --- a/Resources/Maps/_NF/Shuttles/Sr/parcel.yml +++ b/Resources/Maps/_NF/Shuttles/Sr/parcel.yml @@ -228,9 +228,6 @@ entities: rot: -1.5707963267948966 rad pos: 4.5,3.5 parent: 1 - - type: DeviceLinkSink - links: - - 222 - uid: 10 components: - type: Transform @@ -278,7 +275,7 @@ entities: rot: -1.5707963267948966 rad pos: 7.5,-0.5 parent: 1 -- proto: AtmosDeviceFanTiny +- proto: AtmosDeviceFanDirectional entities: - uid: 7 components: @@ -301,6 +298,11 @@ entities: - type: Transform pos: -0.5,-3.5 parent: 1 + - uid: 225 + components: + - type: Transform + pos: 5.5,-3.5 + parent: 1 - proto: AtmosFixBlockerMarker entities: - uid: 20 @@ -761,41 +763,6 @@ entities: rot: 3.141592653589793 rad pos: 0.5537621,0.6666666 parent: 1 -- proto: ClosetWall - entities: - - uid: 166 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 7.5,0.5 - parent: 1 - - type: EntityStorage - air: - volume: 200 - immutable: False - temperature: 293.14923 - moles: - - 1.7459903 - - 6.568249 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - type: ContainerContainer - containers: - entity_storage: !type:Container - showEnts: False - occludes: True - ents: - - 91 - - 93 - - 92 - proto: ClothingBackpackMessengerMailCarrier entities: - uid: 83 @@ -826,13 +793,18 @@ entities: rot: -1.5707963267948966 rad pos: 7.5,-3.5 parent: 1 - - type: Physics - canCollide: False - type: ContainerContainer containers: board: !type:Container + showEnts: False + occludes: True ents: [] - bank-ATM-cashSlot: !type:ContainerSlot {} + bank-ATM-cashSlot: !type:ContainerSlot + showEnts: False + occludes: True + ent: null + - type: Physics + canCollide: False - type: ItemSlots - uid: 26 components: @@ -840,13 +812,18 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,-3.5 parent: 1 - - type: Physics - canCollide: False - type: ContainerContainer containers: board: !type:Container + showEnts: False + occludes: True ents: [] - bank-ATM-cashSlot: !type:ContainerSlot {} + bank-ATM-cashSlot: !type:ContainerSlot + showEnts: False + occludes: True + ent: null + - type: Physics + canCollide: False - type: ItemSlots - proto: DefibrillatorCabinetFilled entities: @@ -1117,8 +1094,6 @@ entities: rot: 3.141592653589793 rad pos: 3.5,-2.5 parent: 1 - - type: Thruster - originalPowerLoad: 1500 - proto: LockableButtonMailCarrier entities: - uid: 153 @@ -1150,6 +1125,28 @@ entities: linkedPorts: 223: - Pressed: Toggle +- proto: LockerWallEVAColorMailFilled + entities: + - uid: 73 + components: + - type: Transform + pos: 4.5,2.5 + parent: 1 +- proto: LockerWallMaterialsBasic10Filled + entities: + - uid: 36 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 7.5,0.5 + parent: 1 +- proto: LockerWallMaterialsFuelPlasmaFilled + entities: + - uid: 77 + components: + - type: Transform + pos: 6.5,2.5 + parent: 1 - proto: NitrogenCanister entities: - uid: 100 @@ -1191,6 +1188,8 @@ entities: parent: 1 - type: FuelGenerator on: False + - type: MaterialStorageMagnetPickup + magnetEnabled: True - type: Physics bodyType: Static - proto: PowerCellRecharger @@ -1383,40 +1382,6 @@ entities: - type: Transform pos: 6.5,0.5 parent: 1 -- proto: SheetGlass - entities: - - uid: 93 - components: - - type: Transform - parent: 166 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: SheetPlasma - entities: - - uid: 146 - components: - - type: Transform - pos: 6.491864,1.5018094 - parent: 1 -- proto: SheetPlastic - entities: - - uid: 92 - components: - - type: Transform - parent: 166 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: SheetSteel - entities: - - uid: 91 - components: - - type: Transform - parent: 166 - - type: Physics - canCollide: False - - type: InsideEntityStorage - proto: ShuttersNormalOpen entities: - uid: 3 @@ -1424,25 +1389,16 @@ entities: - type: Transform pos: 0.5,-3.5 parent: 1 - - type: DeviceLinkSink - links: - - 153 - uid: 123 components: - type: Transform pos: 6.5,-3.5 parent: 1 - - type: DeviceLinkSink - links: - - 159 - uid: 223 components: - type: Transform pos: 4.5,3.5 parent: 1 - - type: DeviceLinkSink - links: - - 222 - proto: SignMail entities: - uid: 101 @@ -1462,14 +1418,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,4.5 parent: 1 -- proto: SignSpace - entities: - - uid: 77 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,2.5 - parent: 1 - proto: SmallThruster entities: - uid: 61 @@ -1478,16 +1426,12 @@ entities: rot: 1.5707963267948966 rad pos: -2.5,-2.5 parent: 1 - - type: Thruster - originalPowerLoad: 500 - uid: 178 components: - type: Transform rot: -1.5707963267948966 rad pos: 7.5,3.5 parent: 1 - - type: Thruster - originalPowerLoad: 500 - proto: SpawnPointLatejoin entities: - uid: 90 @@ -1504,15 +1448,6 @@ entities: rot: -1.5707963267948966 rad pos: 7.5,1.5 parent: 1 -- proto: LockerWallEVAColorMailFilled - entities: - - uid: 73 - components: - - type: Transform - pos: 4.5,2.5 - parent: 1 - - type: Physics - canCollide: False - proto: Table entities: - uid: 13 @@ -1533,11 +1468,6 @@ entities: rot: 1.5707963267948966 rad pos: -0.5,1.5 parent: 1 - - uid: 36 - components: - - type: Transform - pos: 4.5,1.5 - parent: 1 - uid: 53 components: - type: Transform @@ -1574,31 +1504,23 @@ entities: rot: 3.141592653589793 rad pos: 2.5,-3.5 parent: 1 - - type: Thruster - originalPowerLoad: 1500 - uid: 122 components: - type: Transform rot: 3.141592653589793 rad pos: 3.5,-3.5 parent: 1 - - type: Thruster - originalPowerLoad: 1500 - uid: 161 components: - type: Transform pos: 7.5,4.5 parent: 1 - - type: Thruster - originalPowerLoad: 1500 - uid: 162 components: - type: Transform rot: 3.141592653589793 rad pos: -2.5,-3.5 parent: 1 - - type: Thruster - originalPowerLoad: 1500 - proto: ToolboxMechanicalFilled entities: - uid: 154 diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml index 2aefd0331e1..98e02b73703 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml @@ -163,7 +163,7 @@ - id: ClothingMaskClown - id: BikeHorn - id: ClownPDA - - id: ClothingHeadsetService +# - id: ClothingHeadsetService # Frontier - type: entity parent: ClothingBackpackDuffelSyndicateBundle diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/service.yml b/Resources/Prototypes/Catalog/Fills/Lockers/service.yml index 5b6930ccadc..fdf4dceb3a5 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/service.yml @@ -111,7 +111,6 @@ # - id: ClothingUniformOveralls # Frontier # - id: ClothingHeadHatTrucker # Frontier # prob: 0.1 - - id: ClothingHeadsetService # Frontier - type: entity id: LockerBotanistLoot diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml index 8435da4951b..9a10dcd094a 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml @@ -2,13 +2,14 @@ id: AmmoVendInventory startingInventory: SurvivalKnife: 10 + WeaponBrassKnuckles: 10 # Frontier WeaponLaserPistolNF: 10 # Frontier # WeaponSniperMosin: 10 - WeaponRifleGestio: 10 + WeaponRifleGestio: 10 # Frontier # WeaponSniperRepeater: 10 - WeaponRifleNovaliteC1: 5 + WeaponRifleNovaliteC1: 5 # Frontier WeaponShotgunDoubleBarreled: 10 - WeaponRevolverArgenti: 10 + WeaponRevolverArgenti: 10 # Frontier BoxShotgunSlug: 10 BoxLethalshot: 10 BoxBeanbag: 10 @@ -17,8 +18,8 @@ MagazineBoxLightRifle: 15 MagazineBoxLightRifleRubber: 15 MagazineBoxMagnum: 10 - SpeedLoaderRifleHeavyEmpty: 10 - MagazineNovaliteC1Empty: 10 - MagazineLightRifleLowCapacityEmpty: 10 + SpeedLoaderRifleHeavyEmpty: 10 # Frontier + MagazineNovaliteC1Empty: 10 # Frontier + MagazineLightRifleLowCapacityEmpty: 10 # Frontier emaggedInventory: WeaponPistolViper: 1 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/bardrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/bardrobe.yml index 5e4b0561762..b6d5e4b33b2 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/bardrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/bardrobe.yml @@ -5,7 +5,7 @@ ClothingHeadHatTophat: 2 ClothingEyesHudBeer: 2 ClothingEyesEyepatchHudBeer: 2 - ClothingHeadsetService: 2 +# ClothingHeadsetService: 2 # Frontier ClothingOuterApronBar: 2 ClothingOuterWinterBar: 2 ClothingUniformJumpsuitBartender: 2 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml index e7837cbccc5..30c79801844 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml @@ -28,7 +28,7 @@ ClothingNeckScarfChaplainStole: 3 # Frontier ClothingNeckStoleChaplain: 3 ClothingBeltChaplainSash: 3 # Frontier - ClothingHeadsetService: 4 +# ClothingHeadsetService: 4 # Frontier RubberStampChaplain: 3 Bible: 3 BoxCandle: 2 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefdrobe.yml index eefa26fab88..b42bb3ab536 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefdrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefdrobe.yml @@ -2,7 +2,7 @@ id: ChefDrobeInventory startingInventory: ClothingOuterEVASuitServiceWorker: 2 # Frontier - ClothingHeadsetService: 2 +# ClothingHeadsetService: 2 # Frontier ClothingOuterApronChef: 3 ClothingOuterWinterChef: 2 ClothingOuterJacketChef: 2 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/cigs.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/cigs.yml index 011f632fe6c..710321ded50 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/cigs.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/cigs.yml @@ -10,5 +10,11 @@ PackPaperRollingFilters: 8 CheapLighter: 6 NFAshtray: 4 + SmokingPipe: 4 # Frontier + TobaccoPouchBrownFilled: 2 # Frontier + TobaccoPouchBlueFilled: 2 # Frontier + TobaccoPouchPurpleFilled: 2 # Frontier + contrabandInventory: # Frontier + TobaccoPouchRedFilled: 2 # Frontier emaggedInventory: CigPackSyndicate: 4 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/curadrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/curadrobe.yml index fe332ea52dc..00155d023e8 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/curadrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/curadrobe.yml @@ -13,5 +13,5 @@ ClothingUniformJumpsuitLibrarian: 3 ClothingUniformJumpskirtLibrarian: 3 ClothingShoesBootsLaceup: 2 - ClothingHeadsetService: 2 +# ClothingHeadsetService: 2 # Frontier diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml index 6a3eb63f25c..46b9ae43b8c 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml @@ -3,6 +3,7 @@ startingInventory: ClothingHandsGlovesColorYellow: 10 # Frontier: 6<10 CrowbarYellow: 10 # Frontier: 8<10 + MaintenanceJack: 10 # Frontier Multitool: 10 # Frontier: 4<10 ClothingEyesGlassesMeson: 10 ClothingHeadHatWelding: 6 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml index 0352e6e339f..ef1f676d71a 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml @@ -4,15 +4,16 @@ DiceBag: 6 Paper: 80 d6Dice: 8 - ChessBoard: 4 - BackgammonBoard: 4 - ParchisBoard: 4 - CheckerBoard: 4 + ChessBoard: 2 + BackgammonBoard: 2 + ParchisBoard: 2 + CheckerBoard: 2 ShipBattlemap: 2 SnowBattlemap: 2 SandBattlemap: 2 MoonBattlemap: 2 GrassBattlemap: 2 - PaperCNCSheet: 12 + PaperCNCSheet: 6 MysteryFigureBox: 5 - BooksBag: 5 + BooksBag: 3 + CardBoxBlack: 5 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/hydrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/hydrobe.yml index ceda3f4a8dc..7ee93db4462 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/hydrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/hydrobe.yml @@ -14,7 +14,7 @@ ClothingNeckScarfStripedGreen: 3 ClothingHeadBandBotany: 3 ClothingHeadHatTrucker: 3 # Frontier - ClothingHeadsetService: 3 +# ClothingHeadsetService: 3 # Frontier ClothingOuterWinterHydro: 3 ClothingHandsGlovesLeather: 3 # Frontier ClothingShoesColorBrown: 3 # Frontier diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/janidrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/janidrobe.yml index f52174815de..fb66e98875f 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/janidrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/janidrobe.yml @@ -8,7 +8,7 @@ ClothingShoesColorBlack: 2 ClothingHeadHatPurplesoft: 2 ClothingBeltJanitor: 2 - ClothingHeadsetService: 2 +# ClothingHeadsetService: 2 # Frontier ClothingOuterWinterJani: 2 ClothingShoesBootsWinterJani: 2 #Delta V: Add departmental winter boots ClothingNeckScarfStripedPurple: 3 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/lawdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/lawdrobe.yml index 21a0cb9b9dc..7cc1eed7c83 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/lawdrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/lawdrobe.yml @@ -12,7 +12,7 @@ ClothingUniformJumpsuitLawyerGood: 1 ClothingUniformJumpskirtLawyerGood: 1 ClothingShoesBootsLaceup: 2 - ClothingHeadsetService: 2 +# ClothingHeadsetService: 2 # Frontier ClothingNeckLawyerbadge: 2 RubberStampLawyer: 2 BriefcaseBrown: 2 diff --git a/Resources/Prototypes/DeltaV/tool_qualities.yml b/Resources/Prototypes/DeltaV/tool_qualities.yml new file mode 100644 index 00000000000..d888e8f3f05 --- /dev/null +++ b/Resources/Prototypes/DeltaV/tool_qualities.yml @@ -0,0 +1,6 @@ +- type: tool + id: Axing + name: tool-quality-axing-name + toolName: tool-quality-axing-tool-name + spawn: FireAxe + icon: { sprite: Objects/Weapons/Melee/fireaxe.rsi, state: icon } diff --git a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml index 1cb28b31383..3ba673e3020 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml @@ -255,7 +255,7 @@ # - type: CriminalRecordsHacker # Frontier - type: entity - parent: [ClothingHandsGlovesColorBlack, BaseC2ContrabandUnredeemable] # BaseSecurityEngineeringContraband