From fa61952f51d8f3209dfca9b1cb69674ebedbfec1 Mon Sep 17 00:00:00 2001
From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Date: Fri, 19 Jan 2024 03:02:28 +0100
Subject: [PATCH 01/43] Add trade stations (#23863)
---
Content.Client/Cargo/UI/CargoPalletMenu.xaml | 8 +-
.../Cargo/UI/CargoPalletMenu.xaml.cs | 1 -
.../DestructibleDestructionTest.cs | 4 +-
.../StationCargoOrderDatabaseComponent.cs | 7 +
.../Cargo/Components/TradeStationComponent.cs | 10 +
.../Cargo/Systems/CargoSystem.Orders.cs | 167 +-
.../Cargo/Systems/CargoSystem.Shuttle.cs | 219 +-
.../Cargo/Systems/CargoSystem.Telepad.cs | 4 +-
Content.Server/Cargo/Systems/CargoSystem.cs | 19 +-
.../Shuttles/Components/GridSpawnComponent.cs | 6 +
.../Systems/ShuttleSystem.FasterThanLight.cs | 32 +-
.../Systems/ShuttleSystem.GridFill.cs | 11 +
.../Shuttles/Systems/ShuttleSystem.cs | 1 -
.../Cargo/Components/CargoShuttleComponent.cs | 9 +-
.../en-US/cargo/cargo-console-component.ftl | 2 +
Resources/Maps/Shuttles/trading_outpost.yml | 3498 +++++++++--------
.../Prototypes/Entities/Stations/base.yml | 9 +-
17 files changed, 2111 insertions(+), 1896 deletions(-)
create mode 100644 Content.Server/Cargo/Components/TradeStationComponent.cs
diff --git a/Content.Client/Cargo/UI/CargoPalletMenu.xaml b/Content.Client/Cargo/UI/CargoPalletMenu.xaml
index 489c6cb8f61..d791c9ce3af 100644
--- a/Content.Client/Cargo/UI/CargoPalletMenu.xaml
+++ b/Content.Client/Cargo/UI/CargoPalletMenu.xaml
@@ -1,9 +1,9 @@
-
+ MinSize="300 150"
+ Title="{Loc 'cargo-pallet-console-menu-title'}">
+
diff --git a/Content.Client/Cargo/UI/CargoPalletMenu.xaml.cs b/Content.Client/Cargo/UI/CargoPalletMenu.xaml.cs
index c46ecf562d6..3ac0117dc70 100644
--- a/Content.Client/Cargo/UI/CargoPalletMenu.xaml.cs
+++ b/Content.Client/Cargo/UI/CargoPalletMenu.xaml.cs
@@ -17,7 +17,6 @@ public CargoPalletMenu()
RobustXamlLoader.Load(this);
SellButton.OnPressed += OnSellPressed;
AppraiseButton.OnPressed += OnAppraisePressed;
- Title = Loc.GetString("cargo-pallet-console-menu-title");
}
public void SetAppraisal(int amount)
diff --git a/Content.IntegrationTests/Tests/Destructible/DestructibleDestructionTest.cs b/Content.IntegrationTests/Tests/Destructible/DestructibleDestructionTest.cs
index 0255afa50e9..e14a8264678 100644
--- a/Content.IntegrationTests/Tests/Destructible/DestructibleDestructionTest.cs
+++ b/Content.IntegrationTests/Tests/Destructible/DestructibleDestructionTest.cs
@@ -67,7 +67,7 @@ await server.WaitAssertion(() =>
Assert.That(spawnEntitiesBehavior.Spawn.Values.Single(), Is.EqualTo(new MinMax { Min = 1, Max = 1 }));
});
- var entitiesInRange = sEntityManager.System().GetEntitiesInRange(coordinates, 2);
+ var entitiesInRange = sEntityManager.System().GetEntitiesInRange(coordinates, 3, LookupFlags.All | LookupFlags.Approximate);
var found = false;
foreach (var entity in entitiesInRange)
@@ -86,7 +86,7 @@ await server.WaitAssertion(() =>
break;
}
- Assert.That(found, Is.True);
+ Assert.That(found, Is.True, $"Unable to find {SpawnedEntityId} nearby for destructible test; found {entitiesInRange.Count} entities.");
});
await pair.CleanReturnAsync();
}
diff --git a/Content.Server/Cargo/Components/StationCargoOrderDatabaseComponent.cs b/Content.Server/Cargo/Components/StationCargoOrderDatabaseComponent.cs
index 6c19dbc4a2a..c30db08bbe5 100644
--- a/Content.Server/Cargo/Components/StationCargoOrderDatabaseComponent.cs
+++ b/Content.Server/Cargo/Components/StationCargoOrderDatabaseComponent.cs
@@ -1,5 +1,6 @@
using Content.Shared.Cargo;
using Content.Shared.Cargo.Prototypes;
+using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Cargo.Components;
@@ -30,4 +31,10 @@ public sealed partial class StationCargoOrderDatabaseComponent : Component
///
[DataField("shuttle")]
public EntityUid? Shuttle;
+
+ ///
+ /// The paper-type prototype to spawn with the order information.
+ ///
+ [DataField]
+ public EntProtoId PrinterOutput = "PaperCargoInvoice";
}
diff --git a/Content.Server/Cargo/Components/TradeStationComponent.cs b/Content.Server/Cargo/Components/TradeStationComponent.cs
new file mode 100644
index 00000000000..0422470cc90
--- /dev/null
+++ b/Content.Server/Cargo/Components/TradeStationComponent.cs
@@ -0,0 +1,10 @@
+namespace Content.Server.Cargo.Components;
+
+///
+/// Target for approved orders to spawn at.
+///
+[RegisterComponent]
+public sealed partial class TradeStationComponent : Component
+{
+
+}
diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
index 3a062bae0a0..4c763362b3e 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
@@ -2,6 +2,7 @@
using Content.Server.Cargo.Components;
using Content.Server.Labels.Components;
using Content.Server.Paper;
+using Content.Server.Station.Components;
using Content.Shared.Cargo;
using Content.Shared.Cargo.BUI;
using Content.Shared.Cargo.Components;
@@ -12,6 +13,7 @@
using Robust.Shared.Map;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
+using Robust.Shared.Random;
using Robust.Shared.Utility;
namespace Content.Server.Cargo.Systems
@@ -110,10 +112,12 @@ private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent com
return;
}
- var bankAccount = GetBankAccount(uid, component);
+ var station = _station.GetOwningStation(uid);
// No station to deduct from.
- if (!TryGetOrderDatabase(uid, out var dbUid, out var orderDatabase, component) || bankAccount == null)
+ if (!TryComp(station, out StationBankAccountComponent? bank) ||
+ !TryComp(station, out StationDataComponent? stationData) ||
+ !TryGetOrderDatabase(station, out var orderDatabase))
{
ConsolePopup(args.Session, Loc.GetString("cargo-console-station-not-found"));
PlayDenySound(uid, component);
@@ -159,32 +163,82 @@ private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent com
var cost = order.Price * order.OrderQuantity;
// Not enough balance
- if (cost > bankAccount.Balance)
+ if (cost > bank.Balance)
{
ConsolePopup(args.Session, Loc.GetString("cargo-console-insufficient-funds", ("cost", cost)));
PlayDenySound(uid, component);
return;
}
+ // No slots at the trade station
+ _listEnts.Clear();
+ GetTradeStations(stationData, ref _listEnts);
+ EntityUid? tradeDestination = null;
+
+ // Try to fulfill from any station where possible, if the pad is not occupied.
+ foreach (var trade in _listEnts)
+ {
+ var tradePads = GetCargoPallets(trade);
+ _random.Shuffle(tradePads);
+
+ var freePads = GetFreeCargoPallets(trade, tradePads);
+
+ foreach (var pad in freePads)
+ {
+ var coordinates = new EntityCoordinates(trade, pad.Transform.LocalPosition);
+
+ if (FulfillOrder(order, coordinates, orderDatabase.PrinterOutput))
+ {
+ tradeDestination = trade;
+ break;
+ }
+ }
+
+ if (tradeDestination != null)
+ break;
+ }
+
+ if (tradeDestination == null)
+ {
+ ConsolePopup(args.Session, Loc.GetString("cargo-console-unfulfilled"));
+ PlayDenySound(uid, component);
+ return;
+ }
+
_idCardSystem.TryFindIdCard(player, out var idCard);
// ReSharper disable once ConditionalAccessQualifierIsNonNullableAccordingToAPIContract
order.SetApproverData(idCard.Comp?.FullName, idCard.Comp?.JobTitle);
- _audio.PlayPvs(_audio.GetSound(component.ConfirmSound), uid);
+ _audio.PlayPvs(component.ConfirmSound, uid);
+
+ ConsolePopup(args.Session, Loc.GetString("cargo-console-trade-station", ("destination", MetaData(tradeDestination.Value).EntityName)));
// Log order approval
_adminLogger.Add(LogType.Action, LogImpact.Low,
- $"{ToPrettyString(player):user} approved order [orderId:{order.OrderId}, quantity:{order.OrderQuantity}, product:{order.ProductId}, requester:{order.Requester}, reason:{order.Reason}] with balance at {bankAccount.Balance}");
+ $"{ToPrettyString(player):user} approved order [orderId:{order.OrderId}, quantity:{order.OrderQuantity}, product:{order.ProductId}, requester:{order.Requester}, reason:{order.Reason}] with balance at {bank.Balance}");
+
+ DeductFunds(bank, cost);
+ UpdateOrders(station.Value, orderDatabase);
+ }
+
+ private void GetTradeStations(StationDataComponent data, ref List ents)
+ {
+ foreach (var gridUid in data.Grids)
+ {
+ if (!_tradeQuery.HasComponent(gridUid))
+ continue;
- DeductFunds(bankAccount, cost);
- UpdateOrders(dbUid!.Value, orderDatabase);
+ ents.Add(gridUid);
+ }
}
private void OnRemoveOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, CargoConsoleRemoveOrderMessage args)
{
- if (!TryGetOrderDatabase(uid, out var dbUid, out var orderDatabase, component))
+ var station = _station.GetOwningStation(uid);
+
+ if (!TryGetOrderDatabase(station, out var orderDatabase))
return;
- RemoveOrder(dbUid!.Value, args.OrderId, orderDatabase);
+ RemoveOrder(station.Value, args.OrderId, orderDatabase);
}
private void OnAddOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, CargoConsoleAddOrderMessage args)
@@ -195,11 +249,9 @@ private void OnAddOrderMessage(EntityUid uid, CargoOrderConsoleComponent compone
if (args.Amount <= 0)
return;
- var bank = GetBankAccount(uid, component);
- if (bank == null)
- return;
+ var stationUid = _station.GetOwningStation(uid);
- if (!TryGetOrderDatabase(uid, out var dbUid, out var orderDatabase, component))
+ if (!TryGetOrderDatabase(stationUid, out var orderDatabase))
return;
if (!_protoMan.TryIndex(args.CargoProductId, out var product))
@@ -213,7 +265,7 @@ private void OnAddOrderMessage(EntityUid uid, CargoOrderConsoleComponent compone
var data = GetOrderData(args, product, GenerateOrderId(orderDatabase));
- if (!TryAddOrder(dbUid!.Value, data, orderDatabase))
+ if (!TryAddOrder(stationUid.Value, data, orderDatabase))
{
PlayDenySound(uid, component);
return;
@@ -362,10 +414,10 @@ public void RemoveOrder(EntityUid dbUid, int index, StationCargoOrderDatabaseCom
public void ClearOrders(StationCargoOrderDatabaseComponent component)
{
- if (component.Orders.Count == 0) return;
+ if (component.Orders.Count == 0)
+ return;
component.Orders.Clear();
- Dirty(component);
}
private static bool PopFrontOrder(StationCargoOrderDatabaseComponent orderDB, [NotNullWhen(true)] out CargoOrderData? orderOut)
@@ -388,64 +440,63 @@ private static bool PopFrontOrder(StationCargoOrderDatabaseComponent orderDB, [N
return true;
}
- private bool FulfillOrder(StationCargoOrderDatabaseComponent orderDB, EntityCoordinates whereToPutIt,
- string? paperPrototypeToPrint)
+ ///
+ /// Tries to fulfill the next outstanding order.
+ ///
+ private bool FulfillNextOrder(StationCargoOrderDatabaseComponent orderDB, EntityCoordinates spawn, string? paperProto)
{
- if (PopFrontOrder(orderDB, out var order))
- {
- // Create the item itself
- var item = Spawn(order.ProductId, whereToPutIt);
+ if (!PopFrontOrder(orderDB, out var order))
+ return false;
+
+ return FulfillOrder(order, spawn, paperProto);
+ }
+
+ ///
+ /// Fulfills the specified cargo order and spawns paper attached to it.
+ ///
+ private bool FulfillOrder(CargoOrderData order, EntityCoordinates spawn, string? paperProto)
+ {
+ // Create the item itself
+ var item = Spawn(order.ProductId, spawn);
- // Create a sheet of paper to write the order details on
- var printed = EntityManager.SpawnEntity(paperPrototypeToPrint, whereToPutIt);
- if (TryComp(printed, out var paper))
+ // Create a sheet of paper to write the order details on
+ var printed = EntityManager.SpawnEntity(paperProto, spawn);
+ if (TryComp(printed, out var paper))
+ {
+ // fill in the order data
+ var val = Loc.GetString("cargo-console-paper-print-name", ("orderNumber", order.OrderId));
+ _metaSystem.SetEntityName(printed, val);
+
+ _paperSystem.SetContent(printed, Loc.GetString(
+ "cargo-console-paper-print-text",
+ ("orderNumber", order.OrderId),
+ ("itemName", MetaData(item).EntityName),
+ ("requester", order.Requester),
+ ("reason", order.Reason),
+ ("approver", order.Approver ?? string.Empty)),
+ paper);
+
+ // attempt to attach the label to the item
+ if (TryComp(item, out var label))
{
- // fill in the order data
- var val = Loc.GetString("cargo-console-paper-print-name", ("orderNumber", order.OrderId));
- _metaSystem.SetEntityName(printed, val);
-
- _paperSystem.SetContent(printed, Loc.GetString(
- "cargo-console-paper-print-text",
- ("orderNumber", order.OrderId),
- ("itemName", MetaData(item).EntityName),
- ("requester", order.Requester),
- ("reason", order.Reason),
- ("approver", order.Approver ?? string.Empty)),
- paper);
-
- // attempt to attach the label to the item
- if (TryComp(item, out var label))
- {
- _slots.TryInsert(item, label.LabelSlot, printed, null);
- }
+ _slots.TryInsert(item, label.LabelSlot, printed, null);
}
-
- return true;
}
- return false;
+ return true;
+
}
private void DeductFunds(StationBankAccountComponent component, int amount)
{
component.Balance = Math.Max(0, component.Balance - amount);
- Dirty(component);
}
#region Station
- private StationBankAccountComponent? GetBankAccount(EntityUid uid, CargoOrderConsoleComponent _)
- {
- var station = _station.GetOwningStation(uid);
-
- TryComp(station, out var bankComponent);
- return bankComponent;
- }
-
- private bool TryGetOrderDatabase(EntityUid uid, [MaybeNullWhen(false)] out EntityUid? dbUid, [MaybeNullWhen(false)] out StationCargoOrderDatabaseComponent dbComp, CargoOrderConsoleComponent _)
+ private bool TryGetOrderDatabase([NotNullWhen(true)] EntityUid? stationUid, [MaybeNullWhen(false)] out StationCargoOrderDatabaseComponent dbComp)
{
- dbUid = _station.GetOwningStation(uid);
- return TryComp(dbUid, out dbComp);
+ return TryComp(stationUid, out dbComp);
}
#endregion
diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
index eb7d80e4761..8a661c8896d 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
@@ -1,39 +1,27 @@
-using System.Linq;
using Content.Server.Cargo.Components;
-using Content.Server.GameTicking.Events;
-using Content.Server.Shuttles.Components;
-using Content.Server.Shuttles.Events;
using Content.Shared.Stacks;
using Content.Shared.Cargo;
using Content.Shared.Cargo.BUI;
using Content.Shared.Cargo.Components;
using Content.Shared.Cargo.Events;
-using Content.Shared.CCVar;
using Content.Shared.GameTicking;
-using Content.Shared.Whitelist;
-using Robust.Server.GameObjects;
using Robust.Shared.Map;
using Robust.Shared.Random;
-using Robust.Shared.Utility;
-using Content.Shared.Coordinates;
-using Content.Shared.Mobs;
-using Content.Shared.Mobs.Components;
+using Robust.Shared.Audio;
namespace Content.Server.Cargo.Systems;
public sealed partial class CargoSystem
{
/*
- * Handles cargo shuttle mechanics.
+ * Handles cargo shuttle / trade mechanics.
*/
- public MapId? CargoMap { get; private set; }
+ private static readonly SoundPathSpecifier ApproveSound = new("/Audio/Effects/Cargo/ping.ogg");
private void InitializeShuttle()
{
- SubscribeLocalEvent(OnCargoFTLStarted);
- SubscribeLocalEvent(OnCargoFTLCompleted);
- SubscribeLocalEvent(OnCargoFTLTag);
+ SubscribeLocalEvent(OnTradeSplit);
SubscribeLocalEvent(OnCargoShuttleConsoleStartup);
@@ -42,32 +30,6 @@ private void InitializeShuttle()
SubscribeLocalEvent(OnPalletUIOpen);
SubscribeLocalEvent(OnRoundRestart);
- SubscribeLocalEvent(OnRoundStart);
-
- _cfgManager.OnValueChanged(CCVars.GridFill, SetGridFill);
- }
-
- private void ShutdownShuttle()
- {
- _cfgManager.UnsubValueChanged(CCVars.GridFill, SetGridFill);
- }
-
- private void SetGridFill(bool obj)
- {
- if (obj)
- {
- SetupCargoShuttle();
- }
- }
-
- private void OnCargoFTLTag(EntityUid uid, CargoShuttleComponent component, ref FTLTagEvent args)
- {
- if (args.Handled)
- return;
-
- // Just saves mappers forgetting.
- args.Handled = true;
- args.Tag = "DockCargo";
}
#region Console
@@ -156,6 +118,15 @@ private void UpdateShuttleState(EntityUid uid, EntityUid? station = null)
#endregion
+ private void OnTradeSplit(EntityUid uid, TradeStationComponent component, ref GridSplitEvent args)
+ {
+ // If the trade station gets bombed it's still a trade station.
+ foreach (var gridUid in args.NewGrids)
+ {
+ EnsureComp(gridUid);
+ }
+ }
+
#region Shuttle
///
@@ -206,9 +177,9 @@ private int GetCargoSpace(EntityUid gridUid)
return space;
}
- private List<(EntityUid Entity, CargoPalletComponent Component)> GetCargoPallets(EntityUid gridUid)
+ private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets(EntityUid gridUid)
{
- var pads = new List<(EntityUid, CargoPalletComponent)>();
+ _pads.Clear();
var query = AllEntityQuery();
while (query.MoveNext(out var uid, out var comp, out var compXform))
@@ -219,23 +190,43 @@ private int GetCargoSpace(EntityUid gridUid)
continue;
}
- pads.Add((uid, comp));
+ _pads.Add((uid, comp, compXform));
}
- return pads;
+ return _pads;
+ }
+
+ private IEnumerable<(EntityUid Entity, CargoPalletComponent Component, TransformComponent Transform)>
+ GetFreeCargoPallets(EntityUid gridUid,
+ List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent Transform)> pallets)
+ {
+ _setEnts.Clear();
+
+ foreach (var pallet in pallets)
+ {
+ var aabb = _lookup.GetAABBNoContainer(pallet.Entity, pallet.Transform.LocalPosition, pallet.Transform.LocalRotation);
+
+ if (_lookup.AnyLocalEntitiesIntersecting(gridUid, aabb, LookupFlags.Dynamic))
+ continue;
+
+ yield return pallet;
+ }
}
#endregion
#region Station
- private void SellPallets(EntityUid gridUid, EntityUid? station, out double amount)
+ private bool SellPallets(EntityUid gridUid, EntityUid? station, out double amount)
{
station ??= _station.GetOwningStation(gridUid);
GetPalletGoods(gridUid, out var toSell, out amount);
Log.Debug($"Cargo sold {toSell.Count} entities for {amount}");
+ if (toSell.Count == 0)
+ return false;
+
if (station != null)
{
var ev = new EntitySoldEvent(station.Value, toSell);
@@ -246,6 +237,8 @@ private void SellPallets(EntityUid gridUid, EntityUid? station, out double amoun
{
Del(ent);
}
+
+ return true;
}
private void GetPalletGoods(EntityUid gridUid, out HashSet toSell, out double amount)
@@ -253,10 +246,15 @@ private void GetPalletGoods(EntityUid gridUid, out HashSet toSell, ou
amount = 0;
toSell = new HashSet();
- foreach (var (palletUid, _) in GetCargoPallets(gridUid))
+ foreach (var (palletUid, _, _) in GetCargoPallets(gridUid))
{
// Containers should already get the sell price of their children so can skip those.
- foreach (var ent in _lookup.GetEntitiesIntersecting(palletUid, LookupFlags.Dynamic | LookupFlags.Sundries | LookupFlags.Approximate))
+ _setEnts.Clear();
+
+ _lookup.GetEntitiesIntersecting(palletUid, _setEnts,
+ LookupFlags.Dynamic | LookupFlags.Sundries);
+
+ foreach (var ent in _setEnts)
{
// Dont sell:
// - anything already being sold
@@ -304,21 +302,6 @@ private bool CanSell(EntityUid uid, TransformComponent xform)
return true;
}
- private void AddCargoContents(EntityUid shuttleUid, CargoShuttleComponent shuttle, StationCargoOrderDatabaseComponent orderDatabase)
- {
- var xformQuery = GetEntityQuery();
-
- var pads = GetCargoPallets(shuttleUid);
- while (pads.Count > 0)
- {
- var coordinates = new EntityCoordinates(shuttleUid, xformQuery.GetComponent(_random.PickAndTake(pads).Entity).LocalPosition);
- if (!FulfillOrder(orderDatabase, coordinates, shuttle.PrinterOutput))
- {
- break;
- }
- }
- }
-
private void OnPalletSale(EntityUid uid, CargoPalletConsoleComponent component, CargoPalletSellMessage args)
{
var player = args.Session.AttachedEntity;
@@ -327,57 +310,22 @@ private void OnPalletSale(EntityUid uid, CargoPalletConsoleComponent component,
return;
var bui = _uiSystem.GetUi(uid, CargoPalletConsoleUiKey.Sale);
- if (Transform(uid).GridUid is not EntityUid gridUid)
+ var xform = Transform(uid);
+
+ if (xform.GridUid is not EntityUid gridUid)
{
_uiSystem.SetUiState(bui,
new CargoPalletConsoleInterfaceState(0, 0, false));
return;
}
- // Delta-V change, on sale, add cash to the stations bank account instead of throwing it on the floor
- var stationUid = _station.GetOwningStation(uid);
-
- if (TryComp(stationUid, out var bank))
- {
- SellPallets(gridUid, null, out var amount);
- bank.Balance += (int) amount;
- }
- // End of Delta-V change
-
- UpdatePalletConsoleInterface(uid);
- }
-
- private void OnCargoFTLStarted(EntityUid uid, CargoShuttleComponent component, ref FTLStartedEvent args)
- {
- var stationUid = _station.GetOwningStation(uid);
-
- // Called
- if (CargoMap == null ||
- args.FromMapUid != _mapManager.GetMapEntityId(CargoMap.Value) ||
- !TryComp(stationUid, out var orderDatabase))
- {
- return;
- }
-
- AddCargoContents(uid, component, orderDatabase);
- UpdateOrders(stationUid!.Value, orderDatabase);
- UpdateCargoShuttleConsoles(uid, component);
- }
-
- private void OnCargoFTLCompleted(EntityUid uid, CargoShuttleComponent component, ref FTLCompletedEvent args)
- {
- var xform = Transform(uid);
- // Recalled
- if (xform.MapID != CargoMap)
+ if (!SellPallets(gridUid, null, out var price))
return;
- var stationUid = _station.GetOwningStation(uid);
-
- if (TryComp(stationUid, out var bank))
- {
- SellPallets(uid, stationUid, out var amount);
- bank.Balance += (int) amount;
- }
+ var stackPrototype = _protoMan.Index(component.CashType);
+ _stack.Spawn((int) price, stackPrototype, xform.Coordinates);
+ _audio.PlayPvs(ApproveSound, uid);
+ UpdatePalletConsoleInterface(uid);
}
#endregion
@@ -385,63 +333,6 @@ private void OnCargoFTLCompleted(EntityUid uid, CargoShuttleComponent component,
private void OnRoundRestart(RoundRestartCleanupEvent ev)
{
Reset();
- CleanupCargoShuttle();
- }
-
- private void OnRoundStart(RoundStartingEvent ev)
- {
- if (_cfgManager.GetCVar(CCVars.GridFill))
- SetupCargoShuttle();
- }
-
- private void CleanupCargoShuttle()
- {
- if (CargoMap == null || !_mapManager.MapExists(CargoMap.Value))
- {
- CargoMap = null;
- DebugTools.Assert(!EntityQuery().Any());
- return;
- }
-
- _mapManager.DeleteMap(CargoMap.Value);
- CargoMap = null;
-
- // Shuttle may not have been in the cargo dimension (e.g. on the station map) so need to delete.
- var query = AllEntityQuery();
-
- while (query.MoveNext(out var uid, out var _))
- {
- if (TryComp(uid, out var station))
- {
- station.Shuttle = null;
- }
-
- QueueDel(uid);
- }
- }
-
- private void SetupCargoShuttle()
- {
- if (CargoMap != null && _mapManager.MapExists(CargoMap.Value))
- {
- return;
- }
-
- // It gets mapinit which is okay... buuutt we still want it paused to avoid power draining.
- CargoMap = _mapManager.CreateMap();
- var mapUid = _mapManager.GetMapEntityId(CargoMap.Value);
- var ftl = EnsureComp(_mapManager.GetMapEntityId(CargoMap.Value));
- ftl.Whitelist = new EntityWhitelist()
- {
- Components = new[]
- {
- _factory.GetComponentName(typeof(CargoShuttleComponent))
- }
- };
-
- _metaSystem.SetEntityName(mapUid, $"Trading post {_random.Next(1000):000}");
-
- _console.RefreshShuttleConsoles();
}
}
diff --git a/Content.Server/Cargo/Systems/CargoSystem.Telepad.cs b/Content.Server/Cargo/Systems/CargoSystem.Telepad.cs
index 698d324a801..42aabf2578e 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.Telepad.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.Telepad.cs
@@ -61,10 +61,10 @@ private void UpdateTelepad(float frameTime)
}
var xform = Transform(uid);
- if (FulfillOrder(orderDatabase, xform.Coordinates, comp.PrinterOutput))
+ if (FulfillNextOrder(orderDatabase, xform.Coordinates, comp.PrinterOutput))
{
_audio.PlayPvs(_audio.GetSound(comp.TeleportSound), uid, AudioParams.Default.WithVolume(-8f));
- UpdateOrders(station!.Value, orderDatabase);
+ UpdateOrders(station.Value, orderDatabase);
comp.CurrentState = CargoTelepadState.Teleporting;
_appearance.SetData(uid, CargoTelepadVisuals.State, CargoTelepadState.Teleporting, appearance);
diff --git a/Content.Server/Cargo/Systems/CargoSystem.cs b/Content.Server/Cargo/Systems/CargoSystem.cs
index fb6d949e7f4..d4be68efc85 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.cs
@@ -15,8 +15,6 @@
using JetBrains.Annotations;
using Robust.Server.GameObjects;
using Robust.Shared.Audio.Systems;
-using Robust.Shared.Configuration;
-using Robust.Shared.Map;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
using Robust.Shared.Random;
@@ -26,9 +24,6 @@ namespace Content.Server.Cargo.Systems;
public sealed partial class CargoSystem : SharedCargoSystem
{
[Dependency] private readonly IGameTiming _timing = default!;
- [Dependency] private readonly IComponentFactory _factory = default!;
- [Dependency] private readonly IConfigurationManager _cfgManager = default!;
- [Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly IPrototypeManager _protoMan = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
@@ -42,6 +37,7 @@ public sealed partial class CargoSystem : SharedCargoSystem
[Dependency] private readonly PricingSystem _pricing = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly SharedTransformSystem _xformSystem = default!;
[Dependency] private readonly ShuttleConsoleSystem _console = default!;
[Dependency] private readonly StackSystem _stack = default!;
[Dependency] private readonly StationSystem _station = default!;
@@ -51,6 +47,11 @@ public sealed partial class CargoSystem : SharedCargoSystem
private EntityQuery _xformQuery;
private EntityQuery _blacklistQuery;
private EntityQuery _mobQuery;
+ private EntityQuery _tradeQuery;
+
+ private HashSet _setEnts = new();
+ private List _listEnts = new();
+ private List<(EntityUid, CargoPalletComponent, TransformComponent)> _pads = new();
public override void Initialize()
{
@@ -59,6 +60,7 @@ public override void Initialize()
_xformQuery = GetEntityQuery();
_blacklistQuery = GetEntityQuery();
_mobQuery = GetEntityQuery();
+ _tradeQuery = GetEntityQuery();
InitializeConsole();
InitializeShuttle();
@@ -66,13 +68,6 @@ public override void Initialize()
InitializeBounty();
}
- public override void Shutdown()
- {
- base.Shutdown();
- ShutdownShuttle();
- CleanupCargoShuttle();
- }
-
public override void Update(float frameTime)
{
base.Update(frameTime);
diff --git a/Content.Server/Shuttles/Components/GridSpawnComponent.cs b/Content.Server/Shuttles/Components/GridSpawnComponent.cs
index 1ddfb8c2442..5f0fa7dd624 100644
--- a/Content.Server/Shuttles/Components/GridSpawnComponent.cs
+++ b/Content.Server/Shuttles/Components/GridSpawnComponent.cs
@@ -1,4 +1,5 @@
using Content.Server.Shuttles.Systems;
+using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Server.Shuttles.Components;
@@ -23,6 +24,11 @@ public record struct GridSpawnGroup
public int MinCount = 1;
public int MaxCount = 1;
+ ///
+ /// Components to be added to any spawned grids.
+ ///
+ public ComponentRegistry AddComponents = new();
+
///
/// Hide the IFF label of the grid.
///
diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs
index c0299d1f725..d976b634d5b 100644
--- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs
+++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs
@@ -235,6 +235,12 @@ private bool TrySetupFTL(EntityUid uid, ShuttleComponent shuttle, [NotNullWhen(t
component.State = FTLState.Starting;
var audio = _audio.PlayPvs(_startupSound, uid);
audio.Value.Component.Flags |= AudioFlags.GridAudio;
+
+ if (_physicsQuery.TryGetComponent(uid, out var gridPhysics))
+ {
+ _transform.SetLocalPosition(audio.Value.Entity, gridPhysics.LocalCenter);
+ }
+
// Make sure the map is setup before we leave to avoid pop-in (e.g. parallax).
SetupHyperspace();
return true;
@@ -260,6 +266,7 @@ private void UpdateHyperspace(float frameTime)
{
// Startup time has elapsed and in hyperspace.
case FTLState.Starting:
+ {
DoTheDinosaur(xform);
comp.State = FTLState.Travelling;
@@ -268,7 +275,8 @@ private void UpdateHyperspace(float frameTime)
var fromRotation = _transform.GetWorldRotation(xform);
var width = Comp(uid).LocalAABB.Width;
- xform.Coordinates = new EntityCoordinates(_mapManager.GetMapEntityId(_hyperSpaceMap!.Value), new Vector2(_index + width / 2f, 0f));
+ xform.Coordinates = new EntityCoordinates(_mapManager.GetMapEntityId(_hyperSpaceMap!.Value),
+ new Vector2(_index + width / 2f, 0f));
xform.LocalRotation = Angle.Zero;
_index += width + Buffer;
comp.Accumulator += comp.TravelTime - DefaultArrivalTime;
@@ -285,7 +293,9 @@ private void UpdateHyperspace(float frameTime)
SetDockBolts(uid, true);
_console.RefreshShuttleConsoles(uid);
- var target = comp.TargetUid != null ? new EntityCoordinates(comp.TargetUid.Value, Vector2.Zero) : comp.TargetCoordinates;
+ var target = comp.TargetUid != null
+ ? new EntityCoordinates(comp.TargetUid.Value, Vector2.Zero)
+ : comp.TargetCoordinates;
var ev = new FTLStartedEvent(uid, target, fromMapUid, fromMatrix, fromRotation);
RaiseLocalEvent(uid, ref ev, true);
@@ -293,8 +303,15 @@ private void UpdateHyperspace(float frameTime)
var wowdio = _audio.PlayPvs(comp.TravelSound, uid);
comp.TravelStream = wowdio?.Entity;
if (wowdio?.Component != null)
+ {
wowdio.Value.Component.Flags |= AudioFlags.GridAudio;
+ if (_physicsQuery.TryGetComponent(uid, out var gridPhysics))
+ {
+ _transform.SetLocalPosition(wowdio.Value.Entity, gridPhysics.LocalCenter);
+ }
+ }
+ }
break;
// Arriving, play effects
case FTLState.Travelling:
@@ -313,6 +330,7 @@ private void UpdateHyperspace(float frameTime)
break;
// Arrived
case FTLState.Arriving:
+ {
DoTheDinosaur(xform);
SetDockBolts(uid, false);
SetDocks(uid, true);
@@ -383,6 +401,12 @@ private void UpdateHyperspace(float frameTime)
comp.TravelStream = _audio.Stop(comp.TravelStream);
var audio = _audio.PlayPvs(_arrivalSound, uid);
audio.Value.Component.Flags |= AudioFlags.GridAudio;
+ // TODO: Shitcode til engine fix
+
+ if (_physicsQuery.TryGetComponent(uid, out var gridPhysics))
+ {
+ _transform.SetLocalPosition(audio.Value.Entity, gridPhysics.LocalCenter);
+ }
if (TryComp(uid, out var dest))
{
@@ -397,6 +421,7 @@ private void UpdateHyperspace(float frameTime)
var ftlEvent = new FTLCompletedEvent(uid, _mapManager.GetMapEntityId(mapId));
RaiseLocalEvent(uid, ref ftlEvent, true);
+ }
break;
case FTLState.Cooldown:
RemComp(uid);
@@ -711,6 +736,9 @@ private void Smimsh(EntityUid uid, FixturesComponent? manager = null, MapGridCom
continue;
var aabb = fixture.Shape.ComputeAABB(transform, 0);
+
+ // Shift it slightly
+ aabb = aabb.Translated(-grid.TileSizeHalfVector);
// Create a small border around it.
aabb = aabb.Enlarged(0.2f);
aabbs.Add(aabb);
diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.GridFill.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.GridFill.cs
index 38c566aa51a..f87d80736cc 100644
--- a/Content.Server/Shuttles/Systems/ShuttleSystem.GridFill.cs
+++ b/Content.Server/Shuttles/Systems/ShuttleSystem.GridFill.cs
@@ -151,6 +151,17 @@ private void GridSpawns(EntityUid uid, GridSpawnComponent component)
var name = path.FilenameWithoutExtension;
_metadata.SetEntityName(ent[0], name);
}
+
+ foreach (var compReg in group.AddComponents.Values)
+ {
+ var compType = compReg.Component.GetType();
+
+ if (HasComp(ent[0], compType))
+ continue;
+
+ var comp = _factory.GetComponent(compType);
+ AddComp(ent[0], comp, true);
+ }
}
else
{
diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.cs
index ed6e8820a4f..5f11ce25a4b 100644
--- a/Content.Server/Shuttles/Systems/ShuttleSystem.cs
+++ b/Content.Server/Shuttles/Systems/ShuttleSystem.cs
@@ -39,7 +39,6 @@ public sealed partial class ShuttleSystem : SharedShuttleSystem
[Dependency] private readonly MapLoaderSystem _loader = default!;
[Dependency] private readonly MetaDataSystem _metadata = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
- [Dependency] private readonly SharedMapSystem _maps = default!;
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly ShuttleConsoleSystem _console = default!;
diff --git a/Content.Shared/Cargo/Components/CargoShuttleComponent.cs b/Content.Shared/Cargo/Components/CargoShuttleComponent.cs
index eaa78ce8d38..388e213943c 100644
--- a/Content.Shared/Cargo/Components/CargoShuttleComponent.cs
+++ b/Content.Shared/Cargo/Components/CargoShuttleComponent.cs
@@ -10,10 +10,7 @@ namespace Content.Shared.Cargo.Components;
[RegisterComponent, NetworkedComponent, Access(typeof(SharedCargoSystem))]
public sealed partial class CargoShuttleComponent : Component
{
- ///
- /// The paper-type prototype to spawn with the order information.
- ///
- [DataField("printerOutput", customTypeSerializer: typeof(PrototypeIdSerializer))]
- public string PrinterOutput = "PaperCargoInvoice";
-
+ /*
+ * Still needed for drone console for now.
+ */
}
diff --git a/Resources/Locale/en-US/cargo/cargo-console-component.ftl b/Resources/Locale/en-US/cargo/cargo-console-component.ftl
index fcdb23dda9f..b56f4730ccd 100644
--- a/Resources/Locale/en-US/cargo/cargo-console-component.ftl
+++ b/Resources/Locale/en-US/cargo/cargo-console-component.ftl
@@ -28,6 +28,8 @@ cargo-console-invalid-product = Invalid product ID
cargo-console-too-many = Too many approved orders
cargo-console-snip-snip = Order trimmed to capacity
cargo-console-insufficient-funds = Insufficient funds (require {$cost})
+cargo-console-unfulfilled = No room to fulfill order
+cargo-console-trade-station = Sent to {$destination}
cargo-console-paper-print-name = Order #{$orderNumber}
cargo-console-paper-print-text =
diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml
index 56d16dc90d7..2d81ada37b8 100644
--- a/Resources/Maps/Shuttles/trading_outpost.yml
+++ b/Resources/Maps/Shuttles/trading_outpost.yml
@@ -3,84 +3,73 @@ meta:
postmapinit: false
tilemap:
0: Space
- 26: FloorDark
- 30: FloorDarkMini
- 31: FloorDarkMono
- 34: FloorDarkPavementVertical
- 46: FloorGrassJungle
- 91: FloorSteelMono
- 92: FloorSteelOffset
- 96: FloorTechMaint2
- 97: FloorTechMaint3
- 109: FloorWood
- 110: FloorWoodTile
- 111: Lattice
- 112: Plating
+ 29: FloorDark
+ 33: FloorDarkMini
+ 34: FloorDarkMono
+ 37: FloorDarkPavementVertical
+ 49: FloorGrassJungle
+ 100: FloorSteelMono
+ 101: FloorSteelOffset
+ 105: FloorTechMaint2
+ 106: FloorTechMaint3
+ 118: FloorWood
+ 119: FloorWoodTile
+ 120: Lattice
+ 121: Plating
entities:
- proto: ""
entities:
- - uid: 1
- components:
- - name: map 20
- type: MetaData
- - type: Transform
- - type: Map
- - type: PhysicsMap
- - type: GridTree
- - type: MovedGrids
- - type: Broadphase
- - type: OccluderTree
- - type: LoadedMap
- uid: 2
components:
- - name: grid
- type: MetaData
- - pos: -2.9375,-1.625
- parent: 1
- type: Transform
- - chunks:
+ - type: MetaData
+ name: Automated Trade Station
+ - type: Transform
+ pos: -2.9375,-1.625
+ parent: invalid
+ - type: MapGrid
+ chunks:
0,0:
ind: 0,0
- tiles: XAAAAAAAHwAAAAAAHwAAAAAAHwAAAAABXAAAAAAAcAAAAAAAXAAAAAAAHwAAAAADHwAAAAADHwAAAAADXAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAHwAAAAADIgAAAAABcAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABYAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAHwAAAAADcAAAAAAAHwAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAHwAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAbQAAAAAAbgAAAAACbgAAAAADbgAAAAADLgAAAAAALgAAAAAALgAAAAAAbgAAAAAAbgAAAAABbgAAAAADbQAAAAADcAAAAAAAHwAAAAACcAAAAAAAAAAAAAAAAAAAAAAAbQAAAAAAbgAAAAADbgAAAAAAbgAAAAADbQAAAAADbQAAAAABbQAAAAADbgAAAAABbgAAAAABbgAAAAACbQAAAAAAHwAAAAAAIgAAAAACcAAAAAAAAAAAAAAAAAAAAAAAbQAAAAACbQAAAAABbQAAAAABbQAAAAABbQAAAAABbQAAAAAAbQAAAAADbQAAAAADbQAAAAAAbQAAAAACbQAAAAACcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: ZQAAAAAAIgAAAAAAIgAAAAAAIgAAAAABZQAAAAAAeQAAAAAAZQAAAAAAIgAAAAADIgAAAAADIgAAAAADZQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAIgAAAAADJQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAIgAAAAABaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAIgAAAAADeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdwAAAAACdwAAAAADdwAAAAADMQAAAAAAMQAAAAAAMQAAAAAAdwAAAAAAdwAAAAABdwAAAAADdgAAAAADeQAAAAAAIgAAAAACeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdwAAAAADdwAAAAAAdwAAAAADdgAAAAADdgAAAAABdgAAAAADdwAAAAABdwAAAAABdwAAAAACdgAAAAAAIgAAAAAAJQAAAAACeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAACdgAAAAABdgAAAAABdgAAAAABdgAAAAABdgAAAAAAdgAAAAADdgAAAAADdgAAAAAAdgAAAAACdgAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
0,-1:
ind: 0,-1
- tiles: HgAAAAAAHgAAAAAAHgAAAAADHgAAAAAAGgAAAAACcAAAAAAAcAAAAAAAGgAAAAABGgAAAAAAGgAAAAABHwAAAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAbwAAAAAAbwAAAAAAbwAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAbwAAAAAAbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAHwAAAAADYAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAYAAAAAAAHwAAAAABcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAXAAAAAAAcAAAAAAAXAAAAAAAHwAAAAABHwAAAAADHwAAAAABXAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAHwAAAAACHwAAAAADHwAAAAABYAAAAAAAcAAAAAAAYAAAAAAAHwAAAAAAHwAAAAACHwAAAAADXAAAAAAAcAAAAAAAbwAAAAAAbwAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAHwAAAAAAHwAAAAACHwAAAAABYAAAAAAAcAAAAAAAYAAAAAAAHwAAAAAAHwAAAAABHwAAAAABXAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAWwAAAAABWwAAAAADYQAAAAADYQAAAAADYAAAAAAAcAAAAAAAYAAAAAAAYQAAAAACYQAAAAADWwAAAAACWwAAAAADcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAHwAAAAADHwAAAAACHwAAAAABYAAAAAAAcAAAAAAAYAAAAAAAHwAAAAAAHwAAAAACHwAAAAACXAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAHwAAAAABHwAAAAAAHwAAAAABYAAAAAAAcAAAAAAAYAAAAAAAHwAAAAADHwAAAAAAHwAAAAACXAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAHwAAAAABHwAAAAAAHwAAAAADYAAAAAAAcAAAAAAAYAAAAAAAHwAAAAAAHwAAAAABHwAAAAAAXAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAWwAAAAACYQAAAAACYQAAAAABYAAAAAAAcAAAAAAAYAAAAAAAYQAAAAABYQAAAAADWwAAAAABWwAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAHwAAAAAAHwAAAAACHwAAAAADYAAAAAAAcAAAAAAAYAAAAAAAHwAAAAAAHwAAAAABHwAAAAAAXAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAHwAAAAADHwAAAAADHwAAAAAAYAAAAAAAcAAAAAAAYAAAAAAAHwAAAAABHwAAAAADHwAAAAAAXAAAAAAAcAAAAAAAbwAAAAAAbwAAAAAAAAAAAAAAAAAAAAAA
+ tiles: IQAAAAAAIQAAAAAAIQAAAAADIQAAAAAAHQAAAAACeQAAAAAAeQAAAAAAHQAAAAABHQAAAAAAHQAAAAABIgAAAAACeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAADaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAIgAAAAABeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAZQAAAAAAeQAAAAAAZQAAAAAAIgAAAAABIgAAAAADIgAAAAABZQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAACIgAAAAADIgAAAAABaQAAAAAAeQAAAAAAaQAAAAAAIgAAAAAAIgAAAAACIgAAAAADZQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAAAIgAAAAACIgAAAAABaQAAAAAAeQAAAAAAaQAAAAAAIgAAAAAAIgAAAAABIgAAAAABZQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAABZAAAAAADagAAAAADagAAAAADaQAAAAAAeQAAAAAAaQAAAAAAagAAAAACagAAAAADZAAAAAACZAAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAADIgAAAAACIgAAAAABaQAAAAAAeQAAAAAAaQAAAAAAIgAAAAAAIgAAAAACIgAAAAACZQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAABIgAAAAAAIgAAAAABaQAAAAAAeQAAAAAAaQAAAAAAIgAAAAADIgAAAAAAIgAAAAACZQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAABIgAAAAAAIgAAAAADaQAAAAAAeQAAAAAAaQAAAAAAIgAAAAAAIgAAAAABIgAAAAAAZQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAZAAAAAACagAAAAACagAAAAABaQAAAAAAeQAAAAAAaQAAAAAAagAAAAABagAAAAADZAAAAAABZAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAAAIgAAAAACIgAAAAADaQAAAAAAeQAAAAAAaQAAAAAAIgAAAAAAIgAAAAABIgAAAAAAZQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAADIgAAAAADIgAAAAAAaQAAAAAAeQAAAAAAaQAAAAAAIgAAAAABIgAAAAADIgAAAAAAZQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA
version: 6
-1,0:
ind: -1,0
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAIgAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAHwAAAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAHwAAAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAHwAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAIgAAAAACHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAACeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAACeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAACIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
-1,-1:
ind: -1,-1
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAAAAbwAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAAAAbwAAAAAAcAAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAA
version: 6
0,-2:
ind: 0,-2
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAHgAAAAABHgAAAAABHgAAAAAAGgAAAAABGgAAAAADGgAAAAACGgAAAAABGgAAAAACGgAAAAACcAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAHgAAAAADHgAAAAABHgAAAAABGgAAAAABGgAAAAAAGgAAAAADGgAAAAACGgAAAAABGgAAAAABHwAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIQAAAAABIQAAAAABIQAAAAAAHQAAAAABHQAAAAADHQAAAAACHQAAAAABHQAAAAACHQAAAAACeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAAAAIQAAAAADIQAAAAABIQAAAAABHQAAAAABHQAAAAAAHQAAAAADHQAAAAACHQAAAAABHQAAAAABIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
-1,-2:
ind: -1,-2
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAA
version: 6
- type: MapGrid
- type: Broadphase
- - bodyStatus: InAir
+ - type: Physics
+ bodyStatus: InAir
angularDamping: 0.05
linearDamping: 0.05
fixedRotation: False
bodyType: Dynamic
- type: Physics
- - fixtures: {}
- type: Fixtures
+ - type: Fixtures
+ fixtures: {}
- type: OccluderTree
- type: SpreaderGrid
- type: Shuttle
- type: GridPathfinding
- - gravityShakeSound: !type:SoundPathSpecifier
+ - type: Gravity
+ gravityShakeSound: !type:SoundPathSpecifier
path: /Audio/Effects/alert.ogg
- type: Gravity
- - chunkCollection:
+ - type: DecalGrid
+ chunkCollection:
version: 2
nodes:
- node:
@@ -291,8 +280,8 @@ entities:
22: 4,5
23: 10,4
24: 10,5
- type: DecalGrid
- - version: 2
+ - type: GridAtmosphere
+ version: 2
data:
tiles:
0,0:
@@ -411,27 +400,18 @@ entities:
- 0
- 0
chunkSize: 4
- type: GridAtmosphere
- type: GasTileOverlay
- type: RadiationGridResistance
- proto: AirAlarm
entities:
- uid: 802
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -0.5,-4.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 793
- - 411
- - 400
- - 410
- - 402
- - 790
- - 789
- type: DeviceNetwork
- - devices:
+ - type: DeviceList
+ devices:
- 793
- 411
- 400
@@ -439,14 +419,16 @@ entities:
- 402
- 790
- 789
- type: DeviceList
+ - type: AtmosDevice
+ joinedGrid: 2
- uid: 803
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 11.5,-4.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
+ - type: DeviceList
+ devices:
- 794
- 402
- 410
@@ -454,23 +436,16 @@ entities:
- 411
- 789
- 790
- type: DeviceNetwork
- - devices:
- - 794
- - 402
- - 410
- - 400
- - 411
- - 789
- - 790
- type: DeviceList
+ - type: AtmosDevice
+ joinedGrid: 2
- uid: 805
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 11.5,4.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
+ - type: DeviceList
+ devices:
- 796
- 409
- 403
@@ -478,23 +453,16 @@ entities:
- 408
- 783
- 782
- type: DeviceNetwork
- - devices:
- - 796
- - 409
- - 403
- - 401
- - 408
- - 783
- - 782
- type: DeviceList
+ - type: AtmosDevice
+ joinedGrid: 2
- uid: 806
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -0.5,4.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
+ - type: DeviceList
+ devices:
- 795
- 408
- 401
@@ -502,3473 +470,3520 @@ entities:
- 409
- 783
- 782
- type: DeviceNetwork
- - devices:
- - 795
- - 408
- - 401
- - 403
- - 409
- - 783
- - 782
- type: DeviceList
+ - type: AtmosDevice
+ joinedGrid: 2
- proto: AirCanister
entities:
- uid: 387
components:
- - pos: 4.5,-15.5
+ - type: Transform
+ pos: 4.5,-15.5
parent: 2
- type: Transform
+ - type: AtmosDevice
+ joinedGrid: 2
- proto: AirlockCargoGlassLocked
entities:
- uid: 248
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -0.5,5.5
parent: 2
- type: Transform
- uid: 249
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 11.5,5.5
parent: 2
- type: Transform
- proto: AirlockCargoLocked
entities:
- uid: 246
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -0.5,1.5
parent: 2
- type: Transform
- uid: 247
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 11.5,1.5
parent: 2
- type: Transform
- proto: AirlockExternalGlass
entities:
- uid: 582
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -0.5,-5.5
parent: 2
- type: Transform
- uid: 583
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -0.5,-3.5
parent: 2
- type: Transform
- uid: 584
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 11.5,-5.5
parent: 2
- type: Transform
- uid: 585
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 11.5,-3.5
parent: 2
- type: Transform
- proto: AirlockGlassShuttle
entities:
- uid: 586
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: -2.5,-5.5
parent: 2
- type: Transform
- uid: 587
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: -2.5,-3.5
parent: 2
- type: Transform
- uid: 588
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 13.5,-5.5
parent: 2
- type: Transform
- uid: 589
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 13.5,-3.5
parent: 2
- type: Transform
- proto: AirSensor
entities:
- uid: 793
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 0.5,-4.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 802
- type: DeviceNetwork
- uid: 794
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 10.5,-4.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 803
- type: DeviceNetwork
- uid: 795
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 0.5,4.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 806
- type: DeviceNetwork
- uid: 796
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 10.5,4.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 805
- type: DeviceNetwork
- proto: APCBasic
entities:
- uid: 596
components:
- - pos: 1.5,-14.5
+ - type: Transform
+ pos: 1.5,-14.5
parent: 2
- type: Transform
- uid: 597
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -0.5,0.5
parent: 2
- type: Transform
- proto: CableApcExtension
entities:
- uid: 222
components:
- - pos: 11.5,1.5
+ - type: Transform
+ pos: 11.5,1.5
parent: 2
- type: Transform
- uid: 260
components:
- - pos: 12.5,1.5
+ - type: Transform
+ pos: 12.5,1.5
parent: 2
- type: Transform
- uid: 283
components:
- - pos: 6.5,5.5
+ - type: Transform
+ pos: 6.5,5.5
parent: 2
- type: Transform
- uid: 305
components:
- - pos: 12.5,5.5
+ - type: Transform
+ pos: 12.5,5.5
parent: 2
- type: Transform
- uid: 308
components:
- - pos: -0.5,1.5
+ - type: Transform
+ pos: -0.5,1.5
parent: 2
- type: Transform
- uid: 309
components:
- - pos: -1.5,1.5
+ - type: Transform
+ pos: -1.5,1.5
parent: 2
- type: Transform
- uid: 310
components:
- - pos: 8.5,5.5
+ - type: Transform
+ pos: 8.5,5.5
parent: 2
- type: Transform
- uid: 319
components:
- - pos: -1.5,5.5
+ - type: Transform
+ pos: -1.5,5.5
parent: 2
- type: Transform
- uid: 320
components:
- - pos: 2.5,5.5
+ - type: Transform
+ pos: 2.5,5.5
parent: 2
- type: Transform
- uid: 324
components:
- - pos: -1.5,2.5
+ - type: Transform
+ pos: -1.5,2.5
+ parent: 2
+ - uid: 515
+ components:
+ - type: Transform
+ pos: 1.5,-4.5
+ parent: 2
+ - uid: 516
+ components:
+ - type: Transform
+ pos: 2.5,-4.5
+ parent: 2
+ - uid: 517
+ components:
+ - type: Transform
+ pos: 3.5,-4.5
+ parent: 2
+ - uid: 527
+ components:
+ - type: Transform
+ pos: 9.5,-4.5
+ parent: 2
+ - uid: 528
+ components:
+ - type: Transform
+ pos: 8.5,-4.5
+ parent: 2
+ - uid: 529
+ components:
+ - type: Transform
+ pos: 7.5,-4.5
parent: 2
- type: Transform
- uid: 638
components:
- - pos: 1.5,-14.5
+ - type: Transform
+ pos: 1.5,-14.5
parent: 2
- type: Transform
- uid: 639
components:
- - pos: 1.5,-15.5
+ - type: Transform
+ pos: 1.5,-15.5
parent: 2
- type: Transform
- uid: 640
components:
- - pos: 2.5,-17.5
+ - type: Transform
+ pos: 2.5,-17.5
parent: 2
- type: Transform
- uid: 641
components:
- - pos: 2.5,-16.5
+ - type: Transform
+ pos: 2.5,-16.5
parent: 2
- type: Transform
- uid: 642
components:
- - pos: 3.5,-16.5
+ - type: Transform
+ pos: 3.5,-16.5
parent: 2
- type: Transform
- uid: 643
components:
- - pos: 4.5,-16.5
+ - type: Transform
+ pos: 4.5,-16.5
parent: 2
- type: Transform
- uid: 644
components:
- - pos: 5.5,-16.5
+ - type: Transform
+ pos: 5.5,-16.5
parent: 2
- type: Transform
- uid: 645
components:
- - pos: 6.5,-16.5
+ - type: Transform
+ pos: 6.5,-16.5
parent: 2
- type: Transform
- uid: 646
components:
- - pos: 7.5,-16.5
+ - type: Transform
+ pos: 7.5,-16.5
parent: 2
- type: Transform
- uid: 647
components:
- - pos: 8.5,-16.5
+ - type: Transform
+ pos: 8.5,-16.5
parent: 2
- type: Transform
- uid: 648
components:
- - pos: 9.5,-16.5
+ - type: Transform
+ pos: 9.5,-16.5
parent: 2
- type: Transform
- uid: 649
components:
- - pos: 10.5,-16.5
+ - type: Transform
+ pos: 10.5,-16.5
parent: 2
- type: Transform
- uid: 650
components:
- - pos: 10.5,-15.5
+ - type: Transform
+ pos: 10.5,-15.5
parent: 2
- type: Transform
- uid: 651
components:
- - pos: 8.5,-15.5
+ - type: Transform
+ pos: 8.5,-15.5
parent: 2
- type: Transform
- uid: 652
components:
- - pos: 8.5,-14.5
+ - type: Transform
+ pos: 8.5,-14.5
parent: 2
- type: Transform
- uid: 653
components:
- - pos: 8.5,-13.5
+ - type: Transform
+ pos: 8.5,-13.5
parent: 2
- type: Transform
- uid: 654
components:
- - pos: 2.5,-13.5
+ - type: Transform
+ pos: 2.5,-13.5
parent: 2
- type: Transform
- uid: 655
components:
- - pos: 2.5,-14.5
+ - type: Transform
+ pos: 2.5,-14.5
parent: 2
- type: Transform
- uid: 656
components:
- - pos: 2.5,-15.5
+ - type: Transform
+ pos: 2.5,-15.5
parent: 2
- type: Transform
- uid: 657
components:
- - pos: 2.5,-12.5
+ - type: Transform
+ pos: 2.5,-12.5
parent: 2
- type: Transform
- uid: 658
components:
- - pos: 8.5,-12.5
+ - type: Transform
+ pos: 8.5,-12.5
parent: 2
- type: Transform
- uid: 659
components:
- - pos: 1.5,-17.5
+ - type: Transform
+ pos: 1.5,-17.5
parent: 2
- type: Transform
- uid: 660
components:
- - pos: -0.5,0.5
+ - type: Transform
+ pos: -0.5,0.5
parent: 2
- type: Transform
- uid: 661
components:
- - pos: 0.5,0.5
+ - type: Transform
+ pos: 0.5,0.5
parent: 2
- type: Transform
- uid: 662
components:
- - pos: 0.5,-0.5
+ - type: Transform
+ pos: 0.5,-0.5
parent: 2
- type: Transform
- uid: 663
components:
- - pos: 0.5,2.5
+ - type: Transform
+ pos: 0.5,2.5
parent: 2
- type: Transform
- uid: 664
components:
- - pos: 1.5,2.5
+ - type: Transform
+ pos: 1.5,2.5
parent: 2
- type: Transform
- uid: 665
components:
- - pos: 2.5,2.5
+ - type: Transform
+ pos: 2.5,2.5
parent: 2
- type: Transform
- uid: 666
components:
- - pos: 3.5,2.5
+ - type: Transform
+ pos: 3.5,2.5
parent: 2
- type: Transform
- uid: 667
components:
- - pos: 5.5,2.5
+ - type: Transform
+ pos: 5.5,2.5
parent: 2
- type: Transform
- uid: 668
components:
- - pos: 4.5,2.5
+ - type: Transform
+ pos: 4.5,2.5
parent: 2
- type: Transform
- uid: 669
components:
- - pos: 6.5,2.5
+ - type: Transform
+ pos: 6.5,2.5
parent: 2
- type: Transform
- uid: 670
components:
- - pos: 7.5,2.5
+ - type: Transform
+ pos: 7.5,2.5
parent: 2
- type: Transform
- uid: 671
components:
- - pos: 8.5,2.5
+ - type: Transform
+ pos: 8.5,2.5
parent: 2
- type: Transform
- uid: 672
components:
- - pos: 9.5,2.5
+ - type: Transform
+ pos: 9.5,2.5
parent: 2
- type: Transform
- uid: 673
components:
- - pos: 0.5,-1.5
+ - type: Transform
+ pos: 0.5,-1.5
parent: 2
- type: Transform
- uid: 674
components:
- - pos: 0.5,1.5
+ - type: Transform
+ pos: 0.5,1.5
parent: 2
- type: Transform
- uid: 675
components:
- - pos: 10.5,2.5
+ - type: Transform
+ pos: 10.5,2.5
parent: 2
- type: Transform
- uid: 676
components:
- - pos: 10.5,1.5
+ - type: Transform
+ pos: 10.5,1.5
parent: 2
- type: Transform
- uid: 677
components:
- - pos: 10.5,0.5
+ - type: Transform
+ pos: 10.5,0.5
parent: 2
- type: Transform
- uid: 678
components:
- - pos: 10.5,-0.5
+ - type: Transform
+ pos: 10.5,-0.5
parent: 2
- type: Transform
- uid: 679
components:
- - pos: 10.5,-1.5
+ - type: Transform
+ pos: 10.5,-1.5
parent: 2
- type: Transform
- uid: 680
components:
- - pos: 10.5,-2.5
+ - type: Transform
+ pos: 10.5,-2.5
parent: 2
- type: Transform
- uid: 681
components:
- - pos: 10.5,-3.5
+ - type: Transform
+ pos: 10.5,-3.5
parent: 2
- type: Transform
- uid: 682
components:
- - pos: 10.5,-4.5
+ - type: Transform
+ pos: 10.5,-4.5
parent: 2
- type: Transform
- uid: 683
components:
- - pos: 10.5,-5.5
+ - type: Transform
+ pos: 10.5,-5.5
parent: 2
- type: Transform
- uid: 684
components:
- - pos: 10.5,-6.5
+ - type: Transform
+ pos: 10.5,-6.5
parent: 2
- type: Transform
- uid: 685
components:
- - pos: 10.5,-7.5
+ - type: Transform
+ pos: 10.5,-7.5
parent: 2
- type: Transform
- uid: 686
components:
- - pos: 10.5,-8.5
+ - type: Transform
+ pos: 10.5,-8.5
parent: 2
- type: Transform
- uid: 687
components:
- - pos: 10.5,-9.5
+ - type: Transform
+ pos: 10.5,-9.5
parent: 2
- type: Transform
- uid: 688
components:
- - pos: 10.5,-10.5
+ - type: Transform
+ pos: 10.5,-10.5
parent: 2
- type: Transform
- uid: 689
components:
- - pos: 9.5,-10.5
+ - type: Transform
+ pos: 9.5,-10.5
parent: 2
- type: Transform
- uid: 690
components:
- - pos: 8.5,-10.5
+ - type: Transform
+ pos: 8.5,-10.5
parent: 2
- type: Transform
- uid: 691
components:
- - pos: 7.5,-10.5
+ - type: Transform
+ pos: 7.5,-10.5
parent: 2
- type: Transform
- uid: 692
components:
- - pos: 6.5,-10.5
+ - type: Transform
+ pos: 6.5,-10.5
parent: 2
- type: Transform
- uid: 693
components:
- - pos: 5.5,-10.5
+ - type: Transform
+ pos: 5.5,-10.5
parent: 2
- type: Transform
- uid: 694
components:
- - pos: 4.5,-10.5
+ - type: Transform
+ pos: 4.5,-10.5
parent: 2
- type: Transform
- uid: 695
components:
- - pos: 3.5,-10.5
+ - type: Transform
+ pos: 3.5,-10.5
parent: 2
- type: Transform
- uid: 696
components:
- - pos: 2.5,-10.5
+ - type: Transform
+ pos: 2.5,-10.5
parent: 2
- type: Transform
- uid: 697
components:
- - pos: 1.5,-10.5
+ - type: Transform
+ pos: 1.5,-10.5
parent: 2
- type: Transform
- uid: 698
components:
- - pos: 0.5,-10.5
+ - type: Transform
+ pos: 0.5,-10.5
parent: 2
- type: Transform
- uid: 699
components:
- - pos: 0.5,-9.5
+ - type: Transform
+ pos: 0.5,-9.5
parent: 2
- type: Transform
- uid: 700
components:
- - pos: 0.5,-8.5
+ - type: Transform
+ pos: 0.5,-8.5
parent: 2
- type: Transform
- uid: 701
components:
- - pos: 0.5,-7.5
+ - type: Transform
+ pos: 0.5,-7.5
parent: 2
- type: Transform
- uid: 702
components:
- - pos: 0.5,-6.5
+ - type: Transform
+ pos: 0.5,-6.5
parent: 2
- type: Transform
- uid: 703
components:
- - pos: 0.5,-5.5
+ - type: Transform
+ pos: 0.5,-5.5
parent: 2
- type: Transform
- uid: 704
components:
- - pos: 0.5,-4.5
+ - type: Transform
+ pos: 0.5,-4.5
parent: 2
- type: Transform
- uid: 705
components:
- - pos: 0.5,-3.5
+ - type: Transform
+ pos: 0.5,-3.5
parent: 2
- type: Transform
- uid: 706
components:
- - pos: 0.5,-2.5
+ - type: Transform
+ pos: 0.5,-2.5
parent: 2
- type: Transform
- uid: 707
components:
- - pos: 1.5,-0.5
+ - type: Transform
+ pos: 1.5,-0.5
parent: 2
- type: Transform
- uid: 708
components:
- - pos: 2.5,-0.5
+ - type: Transform
+ pos: 2.5,-0.5
parent: 2
- type: Transform
- uid: 709
components:
- - pos: 3.5,-0.5
+ - type: Transform
+ pos: 3.5,-0.5
parent: 2
- type: Transform
- uid: 710
components:
- - pos: 4.5,-0.5
+ - type: Transform
+ pos: 4.5,-0.5
parent: 2
- type: Transform
- uid: 711
components:
- - pos: 4.5,-8.5
+ - type: Transform
+ pos: 4.5,-8.5
parent: 2
- type: Transform
- uid: 712
components:
- - pos: 3.5,-8.5
+ - type: Transform
+ pos: 3.5,-8.5
parent: 2
- type: Transform
- uid: 713
components:
- - pos: 2.5,-8.5
+ - type: Transform
+ pos: 2.5,-8.5
parent: 2
- type: Transform
- uid: 714
components:
- - pos: 1.5,-8.5
+ - type: Transform
+ pos: 1.5,-8.5
parent: 2
- type: Transform
- uid: 715
components:
- - pos: 6.5,-8.5
+ - type: Transform
+ pos: 6.5,-8.5
parent: 2
- type: Transform
- uid: 716
components:
- - pos: 7.5,-8.5
+ - type: Transform
+ pos: 7.5,-8.5
parent: 2
- type: Transform
- uid: 717
components:
- - pos: 8.5,-8.5
+ - type: Transform
+ pos: 8.5,-8.5
parent: 2
- type: Transform
- uid: 718
components:
- - pos: 9.5,-8.5
+ - type: Transform
+ pos: 9.5,-8.5
parent: 2
- type: Transform
- uid: 719
components:
- - pos: 9.5,-0.5
+ - type: Transform
+ pos: 9.5,-0.5
parent: 2
- type: Transform
- uid: 720
components:
- - pos: 8.5,-0.5
+ - type: Transform
+ pos: 8.5,-0.5
parent: 2
- type: Transform
- uid: 721
components:
- - pos: 7.5,-0.5
+ - type: Transform
+ pos: 7.5,-0.5
parent: 2
- type: Transform
- uid: 722
components:
- - pos: 6.5,-0.5
+ - type: Transform
+ pos: 6.5,-0.5
parent: 2
- type: Transform
- uid: 723
components:
- - pos: 11.5,-3.5
+ - type: Transform
+ pos: 11.5,-3.5
parent: 2
- type: Transform
- uid: 724
components:
- - pos: 12.5,-3.5
+ - type: Transform
+ pos: 12.5,-3.5
parent: 2
- type: Transform
- uid: 725
components:
- - pos: 13.5,-3.5
+ - type: Transform
+ pos: 13.5,-3.5
parent: 2
- type: Transform
- uid: 726
components:
- - pos: 13.5,-5.5
+ - type: Transform
+ pos: 13.5,-5.5
parent: 2
- type: Transform
- uid: 727
components:
- - pos: 12.5,-5.5
+ - type: Transform
+ pos: 12.5,-5.5
parent: 2
- type: Transform
- uid: 728
components:
- - pos: 11.5,-5.5
+ - type: Transform
+ pos: 11.5,-5.5
parent: 2
- type: Transform
- uid: 729
components:
- - pos: -0.5,-5.5
+ - type: Transform
+ pos: -0.5,-5.5
parent: 2
- type: Transform
- uid: 730
components:
- - pos: -1.5,-5.5
+ - type: Transform
+ pos: -1.5,-5.5
parent: 2
- type: Transform
- uid: 731
components:
- - pos: -2.5,-5.5
+ - type: Transform
+ pos: -2.5,-5.5
parent: 2
- type: Transform
- uid: 732
components:
- - pos: -0.5,-3.5
+ - type: Transform
+ pos: -0.5,-3.5
parent: 2
- type: Transform
- uid: 733
components:
- - pos: -1.5,-3.5
+ - type: Transform
+ pos: -1.5,-3.5
parent: 2
- type: Transform
- uid: 734
components:
- - pos: -2.5,-3.5
+ - type: Transform
+ pos: -2.5,-3.5
parent: 2
- type: Transform
- uid: 739
components:
- - pos: 7.5,5.5
+ - type: Transform
+ pos: 7.5,5.5
parent: 2
- type: Transform
- uid: 740
components:
- - pos: 5.5,5.5
+ - type: Transform
+ pos: 5.5,5.5
parent: 2
- type: Transform
- uid: 741
components:
- - pos: 4.5,5.5
+ - type: Transform
+ pos: 4.5,5.5
parent: 2
- type: Transform
- uid: 742
components:
- - pos: 3.5,5.5
+ - type: Transform
+ pos: 3.5,5.5
parent: 2
- type: Transform
- uid: 744
components:
- - pos: 1.5,5.5
+ - type: Transform
+ pos: 1.5,5.5
parent: 2
- type: Transform
- uid: 745
components:
- - pos: 0.5,5.5
+ - type: Transform
+ pos: 0.5,5.5
parent: 2
- type: Transform
- uid: 747
components:
- - pos: 9.5,5.5
+ - type: Transform
+ pos: 9.5,5.5
parent: 2
- type: Transform
- uid: 748
components:
- - pos: 10.5,5.5
+ - type: Transform
+ pos: 10.5,5.5
parent: 2
- type: Transform
- uid: 749
components:
- - pos: 11.5,5.5
+ - type: Transform
+ pos: 11.5,5.5
parent: 2
- type: Transform
- uid: 751
components:
- - pos: 12.5,4.5
+ - type: Transform
+ pos: 12.5,4.5
parent: 2
- type: Transform
- uid: 752
components:
- - pos: 12.5,3.5
+ - type: Transform
+ pos: 12.5,3.5
parent: 2
- type: Transform
- uid: 753
components:
- - pos: 12.5,2.5
+ - type: Transform
+ pos: 12.5,2.5
parent: 2
- type: Transform
- uid: 757
components:
- - pos: -1.5,3.5
+ - type: Transform
+ pos: -1.5,3.5
parent: 2
- type: Transform
- uid: 758
components:
- - pos: -1.5,4.5
+ - type: Transform
+ pos: -1.5,4.5
parent: 2
- type: Transform
- uid: 760
components:
- - pos: -0.5,5.5
+ - type: Transform
+ pos: -0.5,5.5
parent: 2
- type: Transform
- proto: CableHV
entities:
- uid: 591
components:
- - pos: 2.5,-17.5
+ - type: Transform
+ pos: 2.5,-17.5
parent: 2
- type: Transform
- uid: 592
components:
- - pos: 1.5,-17.5
+ - type: Transform
+ pos: 1.5,-17.5
parent: 2
- type: Transform
- uid: 593
components:
- - pos: 3.5,-17.5
+ - type: Transform
+ pos: 3.5,-17.5
parent: 2
- type: Transform
- uid: 594
components:
- - pos: 3.5,-16.5
+ - type: Transform
+ pos: 3.5,-16.5
parent: 2
- type: Transform
- uid: 595
components:
- - pos: 3.5,-15.5
+ - type: Transform
+ pos: 3.5,-15.5
parent: 2
- type: Transform
- proto: CableMV
entities:
- uid: 599
components:
- - pos: 3.5,-15.5
+ - type: Transform
+ pos: 3.5,-15.5
parent: 2
- type: Transform
- uid: 600
components:
- - pos: 2.5,-15.5
+ - type: Transform
+ pos: 2.5,-15.5
parent: 2
- type: Transform
- uid: 601
components:
- - pos: -0.5,0.5
+ - type: Transform
+ pos: -0.5,0.5
parent: 2
- type: Transform
- uid: 602
components:
- - pos: 1.5,-14.5
+ - type: Transform
+ pos: 1.5,-14.5
parent: 2
- type: Transform
- uid: 603
components:
- - pos: 2.5,-14.5
+ - type: Transform
+ pos: 2.5,-14.5
parent: 2
- type: Transform
- uid: 604
components:
- - pos: 2.5,-13.5
+ - type: Transform
+ pos: 2.5,-13.5
parent: 2
- type: Transform
- uid: 605
components:
- - pos: 2.5,-12.5
+ - type: Transform
+ pos: 2.5,-12.5
parent: 2
- type: Transform
- uid: 606
components:
- - pos: 2.5,-11.5
+ - type: Transform
+ pos: 2.5,-11.5
parent: 2
- type: Transform
- uid: 607
components:
- - pos: 1.5,1.5
+ - type: Transform
+ pos: 1.5,1.5
parent: 2
- type: Transform
- uid: 608
components:
- - pos: 2.5,1.5
+ - type: Transform
+ pos: 2.5,1.5
parent: 2
- type: Transform
- uid: 609
components:
- - pos: 2.5,0.5
+ - type: Transform
+ pos: 2.5,0.5
parent: 2
- type: Transform
- uid: 610
components:
- - pos: 2.5,-0.5
+ - type: Transform
+ pos: 2.5,-0.5
parent: 2
- type: Transform
- uid: 611
components:
- - pos: 2.5,-1.5
+ - type: Transform
+ pos: 2.5,-1.5
parent: 2
- type: Transform
- uid: 612
components:
- - pos: 2.5,-2.5
+ - type: Transform
+ pos: 2.5,-2.5
parent: 2
- type: Transform
- uid: 613
components:
- - pos: 2.5,-3.5
+ - type: Transform
+ pos: 2.5,-3.5
parent: 2
- type: Transform
- uid: 614
components:
- - pos: 2.5,-4.5
+ - type: Transform
+ pos: 2.5,-4.5
parent: 2
- type: Transform
- uid: 615
components:
- - pos: 2.5,-5.5
+ - type: Transform
+ pos: 2.5,-5.5
parent: 2
- type: Transform
- uid: 616
components:
- - pos: 2.5,-6.5
+ - type: Transform
+ pos: 2.5,-6.5
parent: 2
- type: Transform
- uid: 617
components:
- - pos: 2.5,-7.5
+ - type: Transform
+ pos: 2.5,-7.5
parent: 2
- type: Transform
- uid: 618
components:
- - pos: 2.5,-8.5
+ - type: Transform
+ pos: 2.5,-8.5
parent: 2
- type: Transform
- uid: 619
components:
- - pos: 2.5,-9.5
+ - type: Transform
+ pos: 2.5,-9.5
parent: 2
- type: Transform
- uid: 620
components:
- - pos: 2.5,-10.5
+ - type: Transform
+ pos: 2.5,-10.5
parent: 2
- type: Transform
- uid: 621
components:
- - pos: 0.5,1.5
+ - type: Transform
+ pos: 0.5,1.5
parent: 2
- type: Transform
- uid: 622
components:
- - pos: -0.5,1.5
+ - type: Transform
+ pos: -0.5,1.5
parent: 2
- type: Transform
- uid: 628
components:
- - pos: -0.5,5.5
+ - type: Transform
+ pos: -0.5,5.5
parent: 2
- type: Transform
- uid: 629
components:
- - pos: 0.5,5.5
+ - type: Transform
+ pos: 0.5,5.5
parent: 2
- type: Transform
- uid: 630
components:
- - pos: 1.5,5.5
+ - type: Transform
+ pos: 1.5,5.5
parent: 2
- type: Transform
- uid: 633
components:
- - pos: 6.5,6.5
+ - type: Transform
+ pos: 6.5,6.5
parent: 2
- type: Transform
- uid: 634
components:
- - pos: 6.5,5.5
+ - type: Transform
+ pos: 6.5,5.5
parent: 2
- type: Transform
- uid: 635
components:
- - pos: 5.5,5.5
+ - type: Transform
+ pos: 5.5,5.5
parent: 2
- type: Transform
- uid: 636
components:
- - pos: 4.5,5.5
+ - type: Transform
+ pos: 4.5,5.5
parent: 2
- type: Transform
- uid: 637
components:
- - pos: 3.5,5.5
+ - type: Transform
+ pos: 3.5,5.5
parent: 2
- type: Transform
- proto: CableTerminal
entities:
- uid: 590
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 2.5,-17.5
parent: 2
- type: Transform
- proto: CargoPallet
entities:
- uid: 20
components:
- - pos: 7.5,0.5
+ - type: Transform
+ pos: 7.5,0.5
parent: 2
- type: Transform
- uid: 21
components:
- - pos: 8.5,0.5
+ - type: Transform
+ pos: 8.5,0.5
parent: 2
- type: Transform
- uid: 22
components:
- - pos: 9.5,0.5
+ - type: Transform
+ pos: 9.5,0.5
parent: 2
- type: Transform
- uid: 23
components:
- - pos: 9.5,-0.5
+ - type: Transform
+ pos: 9.5,-0.5
parent: 2
- type: Transform
- uid: 24
components:
- - pos: 8.5,-0.5
+ - type: Transform
+ pos: 8.5,-0.5
parent: 2
- type: Transform
- uid: 25
components:
- - pos: 7.5,-0.5
+ - type: Transform
+ pos: 7.5,-0.5
parent: 2
- type: Transform
- uid: 26
components:
- - pos: 7.5,-1.5
+ - type: Transform
+ pos: 7.5,-1.5
parent: 2
- type: Transform
- uid: 27
components:
- - pos: 8.5,-1.5
+ - type: Transform
+ pos: 8.5,-1.5
parent: 2
- type: Transform
- uid: 28
components:
- - pos: 9.5,-1.5
+ - type: Transform
+ pos: 9.5,-1.5
parent: 2
- type: Transform
- uid: 29
components:
- - pos: 9.5,-8.5
+ - type: Transform
+ pos: 9.5,-8.5
parent: 2
- type: Transform
- uid: 30
components:
- - pos: 8.5,-8.5
+ - type: Transform
+ pos: 8.5,-8.5
parent: 2
- type: Transform
- uid: 31
components:
- - pos: 7.5,-8.5
+ - type: Transform
+ pos: 7.5,-8.5
parent: 2
- type: Transform
- uid: 32
components:
- - pos: 2.5,-7.5
+ - type: Transform
+ pos: 2.5,-7.5
parent: 2
- type: Transform
- uid: 33
components:
- - pos: 7.5,-7.5
+ - type: Transform
+ pos: 7.5,-7.5
parent: 2
- type: Transform
- uid: 34
components:
- - pos: 1.5,-8.5
+ - type: Transform
+ pos: 1.5,-8.5
parent: 2
- type: Transform
- uid: 35
components:
- - pos: 8.5,-7.5
+ - type: Transform
+ pos: 8.5,-7.5
parent: 2
- type: Transform
- uid: 36
components:
- - pos: 1.5,-7.5
+ - type: Transform
+ pos: 1.5,-7.5
parent: 2
- type: Transform
- uid: 37
components:
- - pos: 9.5,-7.5
+ - type: Transform
+ pos: 9.5,-7.5
parent: 2
- type: Transform
- uid: 38
components:
- - pos: 7.5,-3.5
+ - type: Transform
+ pos: 7.5,-3.5
parent: 2
- type: Transform
- uid: 39
components:
- - pos: 7.5,-4.5
+ - type: Transform
+ pos: 7.5,-4.5
parent: 2
- type: Transform
- uid: 40
components:
- - pos: 7.5,-5.5
+ - type: Transform
+ pos: 7.5,-5.5
parent: 2
- type: Transform
- uid: 41
components:
- - pos: 8.5,-5.5
+ - type: Transform
+ pos: 8.5,-5.5
parent: 2
- type: Transform
- uid: 42
components:
- - pos: 8.5,-3.5
+ - type: Transform
+ pos: 8.5,-3.5
parent: 2
- type: Transform
- uid: 43
components:
- - pos: 8.5,-4.5
+ - type: Transform
+ pos: 8.5,-4.5
parent: 2
- type: Transform
- uid: 44
components:
- - pos: 9.5,-3.5
+ - type: Transform
+ pos: 9.5,-3.5
parent: 2
- type: Transform
- uid: 45
components:
- - pos: 9.5,-4.5
+ - type: Transform
+ pos: 9.5,-4.5
parent: 2
- type: Transform
- uid: 46
components:
- - pos: 9.5,-5.5
+ - type: Transform
+ pos: 9.5,-5.5
parent: 2
- type: Transform
- uid: 47
components:
- - pos: 9.5,-9.5
+ - type: Transform
+ pos: 9.5,-9.5
parent: 2
- type: Transform
- uid: 48
components:
- - pos: 8.5,-9.5
+ - type: Transform
+ pos: 8.5,-9.5
parent: 2
- type: Transform
- uid: 49
components:
- - pos: 7.5,-9.5
+ - type: Transform
+ pos: 7.5,-9.5
parent: 2
- type: Transform
- uid: 50
components:
- - pos: 3.5,-7.5
+ - type: Transform
+ pos: 3.5,-7.5
parent: 2
- type: Transform
- uid: 51
components:
- - pos: 3.5,-9.5
+ - type: Transform
+ pos: 3.5,-9.5
parent: 2
- type: Transform
- uid: 52
components:
- - pos: 3.5,-8.5
+ - type: Transform
+ pos: 3.5,-8.5
parent: 2
- type: Transform
- uid: 53
components:
- - pos: 3.5,-3.5
+ - type: Transform
+ pos: 3.5,-3.5
parent: 2
- type: Transform
- uid: 54
components:
- - pos: 3.5,-5.5
+ - type: Transform
+ pos: 3.5,-5.5
parent: 2
- type: Transform
- uid: 55
components:
- - pos: 3.5,-4.5
+ - type: Transform
+ pos: 3.5,-4.5
parent: 2
- type: Transform
- uid: 56
components:
- - pos: 3.5,-1.5
+ - type: Transform
+ pos: 3.5,-1.5
parent: 2
- type: Transform
- uid: 57
components:
- - pos: 2.5,-8.5
+ - type: Transform
+ pos: 2.5,-8.5
parent: 2
- type: Transform
- uid: 58
components:
- - pos: 3.5,-0.5
+ - type: Transform
+ pos: 3.5,-0.5
parent: 2
- type: Transform
- uid: 59
components:
- - pos: 3.5,0.5
+ - type: Transform
+ pos: 3.5,0.5
parent: 2
- type: Transform
- uid: 60
components:
- - pos: 1.5,-9.5
+ - type: Transform
+ pos: 1.5,-9.5
parent: 2
- type: Transform
- uid: 61
components:
- - pos: 2.5,-9.5
+ - type: Transform
+ pos: 2.5,-9.5
parent: 2
- type: Transform
- uid: 62
components:
- - pos: 2.5,-5.5
+ - type: Transform
+ pos: 2.5,-5.5
parent: 2
- type: Transform
- uid: 63
components:
- - pos: 1.5,-5.5
+ - type: Transform
+ pos: 1.5,-5.5
parent: 2
- type: Transform
- uid: 64
components:
- - pos: 1.5,-4.5
+ - type: Transform
+ pos: 1.5,-4.5
parent: 2
- type: Transform
- uid: 65
components:
- - pos: 2.5,-4.5
+ - type: Transform
+ pos: 2.5,-4.5
parent: 2
- type: Transform
- uid: 66
components:
- - pos: 2.5,-3.5
+ - type: Transform
+ pos: 2.5,-3.5
parent: 2
- type: Transform
- uid: 67
components:
- - pos: 1.5,-3.5
+ - type: Transform
+ pos: 1.5,-3.5
parent: 2
- type: Transform
- uid: 68
components:
- - pos: 2.5,-1.5
+ - type: Transform
+ pos: 2.5,-1.5
parent: 2
- type: Transform
- uid: 69
components:
- - pos: 1.5,-1.5
+ - type: Transform
+ pos: 1.5,-1.5
parent: 2
- type: Transform
- uid: 70
components:
- - pos: 1.5,-0.5
+ - type: Transform
+ pos: 1.5,-0.5
parent: 2
- type: Transform
- uid: 71
components:
- - pos: 2.5,-0.5
+ - type: Transform
+ pos: 2.5,-0.5
parent: 2
- type: Transform
- uid: 72
components:
- - pos: 2.5,0.5
+ - type: Transform
+ pos: 2.5,0.5
parent: 2
- type: Transform
- uid: 73
components:
- - pos: 1.5,0.5
+ - type: Transform
+ pos: 1.5,0.5
parent: 2
- type: Transform
- proto: CarpetBlack
entities:
- uid: 265
components:
- - pos: 3.5,5.5
+ - type: Transform
+ pos: 3.5,5.5
parent: 2
- type: Transform
- uid: 266
components:
- - pos: 3.5,6.5
+ - type: Transform
+ pos: 3.5,6.5
parent: 2
- type: Transform
- uid: 267
components:
- - pos: 4.5,6.5
+ - type: Transform
+ pos: 4.5,6.5
parent: 2
- type: Transform
- uid: 268
components:
- - pos: 5.5,6.5
+ - type: Transform
+ pos: 5.5,6.5
parent: 2
- type: Transform
- uid: 269
components:
- - pos: 6.5,6.5
+ - type: Transform
+ pos: 6.5,6.5
parent: 2
- type: Transform
- uid: 270
components:
- - pos: 7.5,6.5
+ - type: Transform
+ pos: 7.5,6.5
parent: 2
- type: Transform
- uid: 271
components:
- - pos: 7.5,5.5
+ - type: Transform
+ pos: 7.5,5.5
parent: 2
- type: Transform
- uid: 272
components:
- - pos: 6.5,5.5
+ - type: Transform
+ pos: 6.5,5.5
parent: 2
- type: Transform
- uid: 273
components:
- - pos: 5.5,5.5
+ - type: Transform
+ pos: 5.5,5.5
parent: 2
- type: Transform
- uid: 274
components:
- - pos: 4.5,5.5
+ - type: Transform
+ pos: 4.5,5.5
parent: 2
- type: Transform
- uid: 275
components:
- - pos: 1.5,5.5
+ - type: Transform
+ pos: 1.5,5.5
parent: 2
- type: Transform
- uid: 276
components:
- - pos: 1.5,6.5
+ - type: Transform
+ pos: 1.5,6.5
parent: 2
- type: Transform
- uid: 277
components:
- - pos: 0.5,6.5
+ - type: Transform
+ pos: 0.5,6.5
parent: 2
- type: Transform
- uid: 278
components:
- - pos: 0.5,5.5
+ - type: Transform
+ pos: 0.5,5.5
parent: 2
- type: Transform
- uid: 279
components:
- - pos: 9.5,6.5
+ - type: Transform
+ pos: 9.5,6.5
parent: 2
- type: Transform
- uid: 280
components:
- - pos: 9.5,5.5
+ - type: Transform
+ pos: 9.5,5.5
parent: 2
- type: Transform
- uid: 281
components:
- - pos: 10.5,5.5
+ - type: Transform
+ pos: 10.5,5.5
parent: 2
- type: Transform
- uid: 282
components:
- - pos: 10.5,6.5
+ - type: Transform
+ pos: 10.5,6.5
parent: 2
- type: Transform
- proto: CarpetOrange
entities:
- uid: 374
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 9.5,-15.5
parent: 2
- type: Transform
- uid: 375
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 8.5,-15.5
parent: 2
- type: Transform
- uid: 376
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 7.5,-15.5
parent: 2
- type: Transform
- uid: 377
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 7.5,-16.5
parent: 2
- type: Transform
- uid: 378
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 8.5,-16.5
parent: 2
- type: Transform
- uid: 379
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 9.5,-16.5
parent: 2
- type: Transform
- proto: Catwalk
entities:
- uid: 294
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 12.5,4.5
parent: 2
- type: Transform
- uid: 295
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 12.5,3.5
parent: 2
- type: Transform
- uid: 296
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 12.5,2.5
parent: 2
- type: Transform
- uid: 297
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -1.5,4.5
parent: 2
- type: Transform
- uid: 298
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -1.5,3.5
parent: 2
- type: Transform
- uid: 299
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -1.5,2.5
parent: 2
- type: Transform
- uid: 313
components:
- - pos: -1.5,-3.5
+ - type: Transform
+ pos: -1.5,-3.5
parent: 2
- type: Transform
- uid: 560
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -1.5,-5.5
parent: 2
- type: Transform
- uid: 562
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 12.5,-3.5
parent: 2
- type: Transform
- uid: 563
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 12.5,-5.5
parent: 2
- type: Transform
- proto: Chair
entities:
- uid: 94
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 7.5,-11.5
parent: 2
- type: Transform
- uid: 99
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 3.5,-11.5
parent: 2
- type: Transform
- uid: 138
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 4.5,-11.5
parent: 2
- type: Transform
- uid: 143
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 6.5,-11.5
parent: 2
- type: Transform
- uid: 226
components:
- - pos: 8.5,2.5
+ - type: Transform
+ pos: 8.5,2.5
parent: 2
- type: Transform
- uid: 227
components:
- - pos: 7.5,2.5
+ - type: Transform
+ pos: 7.5,2.5
parent: 2
- type: Transform
- uid: 394
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-11.5
parent: 2
- type: Transform
- uid: 395
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 8.5,-11.5
parent: 2
- type: Transform
- uid: 396
components:
- - pos: 2.5,2.5
+ - type: Transform
+ pos: 2.5,2.5
parent: 2
- type: Transform
- uid: 405
components:
- - pos: 3.5,2.5
+ - type: Transform
+ pos: 3.5,2.5
parent: 2
- type: Transform
- uid: 406
components:
- - pos: 4.5,2.5
+ - type: Transform
+ pos: 4.5,2.5
parent: 2
- type: Transform
- uid: 407
components:
- - pos: 6.5,2.5
+ - type: Transform
+ pos: 6.5,2.5
parent: 2
- type: Transform
- proto: ChairPilotSeat
entities:
- uid: 372
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 10.5,-16.5
parent: 2
- type: Transform
- uid: 373
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 10.5,-15.5
parent: 2
- type: Transform
- proto: ChairWood
entities:
- uid: 253
components:
- - pos: 2.5,5.5
+ - type: Transform
+ pos: 2.5,5.5
parent: 2
- type: Transform
- uid: 254
components:
- - pos: 7.5,5.5
+ - type: Transform
+ pos: 7.5,5.5
parent: 2
- type: Transform
- uid: 255
components:
- - pos: 3.5,5.5
+ - type: Transform
+ pos: 3.5,5.5
parent: 2
- type: Transform
- uid: 258
components:
- - pos: 1.5,5.5
+ - type: Transform
+ pos: 1.5,5.5
parent: 2
- type: Transform
- uid: 263
components:
- - pos: 8.5,5.5
+ - type: Transform
+ pos: 8.5,5.5
parent: 2
- type: Transform
- uid: 264
components:
- - pos: 9.5,5.5
+ - type: Transform
+ pos: 9.5,5.5
parent: 2
- type: Transform
- proto: ClosetEmergencyFilledRandom
entities:
- uid: 354
components:
- - pos: 0.5,2.5
+ - type: Transform
+ pos: 0.5,2.5
parent: 2
- type: Transform
- proto: ClosetFireFilled
entities:
- uid: 355
components:
- - pos: 10.5,2.5
+ - type: Transform
+ pos: 10.5,2.5
+ parent: 2
+- proto: ComputerPalletConsole
+ entities:
+ - uid: 1
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 4.5,-4.5
+ parent: 2
+ missingComponents:
+ - Anchorable
+ - uid: 514
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 6.5,-4.5
parent: 2
- type: Transform
+ missingComponents:
+ - Anchorable
- proto: ConveyorBelt
entities:
- uid: 81
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -0.5,-2.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 365
- type: DeviceLinkSink
- uid: 82
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -0.5,-6.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 366
- type: DeviceLinkSink
- uid: 108
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 12.5,-2.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 393
- type: DeviceLinkSink
- uid: 110
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -2.5,-2.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 365
- type: DeviceLinkSink
- uid: 329
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -1.5,-6.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 366
- type: DeviceLinkSink
- uid: 330
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 13.5,-6.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 404
- type: DeviceLinkSink
- uid: 331
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 11.5,-6.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 404
- type: DeviceLinkSink
- uid: 335
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 12.5,-6.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 404
- type: DeviceLinkSink
- uid: 337
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 11.5,-2.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 393
- type: DeviceLinkSink
- uid: 338
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -2.5,-6.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 366
- type: DeviceLinkSink
- uid: 339
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -1.5,-2.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 365
- type: DeviceLinkSink
- uid: 340
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 13.5,-2.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 393
- type: DeviceLinkSink
- uid: 359
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 10.5,-2.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 393
- type: DeviceLinkSink
- uid: 362
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 10.5,-6.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 404
- type: DeviceLinkSink
- uid: 363
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 0.5,-2.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 365
- type: DeviceLinkSink
- uid: 364
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 0.5,-6.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 366
- type: DeviceLinkSink
- proto: ExtinguisherCabinetFilled
entities:
- uid: 360
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 5.5,0.5
parent: 2
- type: Transform
- uid: 361
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 5.5,-9.5
parent: 2
- type: Transform
- proto: Firelock
entities:
- uid: 789
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: -0.5,1.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 803
- - 802
- type: DeviceNetwork
- uid: 790
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 11.5,1.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 803
- - 802
- type: DeviceNetwork
- proto: FirelockEdge
entities:
- uid: 786
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 4.5,-16.5
parent: 2
- type: Transform
- proto: FirelockGlass
entities:
- uid: 782
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 11.5,5.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 806
- - 805
- type: DeviceNetwork
- uid: 783
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -0.5,5.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 806
- - 805
- type: DeviceNetwork
- proto: GasOutletInjector
entities:
- uid: 386
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 5.5,-15.5
parent: 2
- type: Transform
+ - type: AtmosDevice
+ joinedGrid: 2
- proto: GasPassiveVent
entities:
- uid: 397
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 6.5,-15.5
parent: 2
- type: Transform
+ - type: AtmosDevice
+ joinedGrid: 2
- uid: 414
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 5.5,-13.5
parent: 2
- type: Transform
+ - type: AtmosDevice
+ joinedGrid: 2
- proto: GasPipeBend
entities:
- uid: 316
components:
- - pos: 7.5,6.5
+ - type: Transform
+ pos: 7.5,6.5
parent: 2
- type: Transform
- uid: 317
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 7.5,4.5
parent: 2
- type: Transform
- uid: 318
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 3.5,4.5
parent: 2
- type: Transform
- uid: 322
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 3.5,6.5
parent: 2
- type: Transform
- uid: 434
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-17.5
parent: 2
- type: Transform
- uid: 457
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 7.5,-11.5
parent: 2
- type: Transform
- uid: 458
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 7.5,-8.5
parent: 2
- type: Transform
- uid: 475
components:
- - pos: 3.5,-8.5
+ - type: Transform
+ pos: 3.5,-8.5
parent: 2
- type: Transform
- uid: 476
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 3.5,-10.5
parent: 2
- type: Transform
- uid: 486
components:
- - pos: 2.5,1.5
+ - type: Transform
+ pos: 2.5,1.5
parent: 2
- type: Transform
- uid: 487
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -1.5,1.5
parent: 2
- type: Transform
- uid: 488
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -1.5,5.5
parent: 2
- type: Transform
- uid: 489
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 8.5,1.5
parent: 2
- type: Transform
- uid: 490
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 12.5,1.5
parent: 2
- type: Transform
- uid: 491
components:
- - pos: 12.5,5.5
+ - type: Transform
+ pos: 12.5,5.5
parent: 2
- type: Transform
- uid: 512
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 1.5,4.5
parent: 2
- type: Transform
- uid: 520
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 9.5,4.5
parent: 2
- type: Transform
- uid: 522
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,5.5
parent: 2
- type: Transform
- proto: GasPipeStraight
entities:
- uid: 223
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 5.5,6.5
parent: 2
- type: Transform
- uid: 241
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 6.5,6.5
parent: 2
- type: Transform
- uid: 250
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 4.5,6.5
parent: 2
- type: Transform
- uid: 284
components:
- - pos: 7.5,5.5
+ - type: Transform
+ pos: 7.5,5.5
parent: 2
- type: Transform
- uid: 321
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 7.5,5.5
parent: 2
- type: Transform
- uid: 323
components:
- - pos: 3.5,5.5
+ - type: Transform
+ pos: 3.5,5.5
parent: 2
- type: Transform
- uid: 417
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 8.5,-14.5
parent: 2
- type: Transform
- uid: 418
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 8.5,-13.5
parent: 2
- type: Transform
- uid: 419
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 8.5,-12.5
parent: 2
- type: Transform
- uid: 420
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 8.5,-11.5
parent: 2
- type: Transform
- uid: 421
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 7.5,-16.5
parent: 2
- type: Transform
- uid: 422
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 6.5,-16.5
parent: 2
- type: Transform
- uid: 423
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 5.5,-16.5
parent: 2
- type: Transform
- uid: 424
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 4.5,-16.5
parent: 2
- type: Transform
- uid: 425
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 3.5,-16.5
parent: 2
- type: Transform
- uid: 426
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 2.5,-16.5
parent: 2
- type: Transform
- uid: 428
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 7.5,-15.5
parent: 2
- type: Transform
- uid: 430
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-14.5
parent: 2
- type: Transform
- uid: 431
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-13.5
parent: 2
- type: Transform
- uid: 432
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-12.5
parent: 2
- type: Transform
- uid: 435
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-16.5
parent: 2
- type: Transform
- uid: 436
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 3.5,-17.5
parent: 2
- type: Transform
- uid: 437
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 4.5,-17.5
parent: 2
- type: Transform
- uid: 438
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 5.5,-17.5
parent: 2
- type: Transform
- uid: 439
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 6.5,-17.5
parent: 2
- type: Transform
- uid: 442
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 1.5,-0.5
parent: 2
- type: Transform
- uid: 443
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-1.5
parent: 2
- type: Transform
- uid: 444
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-2.5
parent: 2
- type: Transform
- uid: 445
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-3.5
parent: 2
- type: Transform
- uid: 446
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-4.5
parent: 2
- type: Transform
- uid: 447
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-5.5
parent: 2
- type: Transform
- uid: 448
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-6.5
parent: 2
- type: Transform
- uid: 449
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-7.5
parent: 2
- type: Transform
- uid: 450
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-8.5
parent: 2
- type: Transform
- uid: 451
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-9.5
parent: 2
- type: Transform
- uid: 452
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-10.5
parent: 2
- type: Transform
- uid: 453
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 4.5,-11.5
parent: 2
- type: Transform
- uid: 454
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 3.5,-11.5
parent: 2
- type: Transform
- uid: 455
components:
- - pos: 5.5,-12.5
+ - type: Transform
+ pos: 5.5,-12.5
parent: 2
- type: Transform
- uid: 456
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 6.5,-11.5
parent: 2
- type: Transform
- uid: 459
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 8.5,-8.5
parent: 2
- type: Transform
- uid: 460
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 9.5,-8.5
parent: 2
- type: Transform
- uid: 461
components:
- - pos: 7.5,-10.5
+ - type: Transform
+ pos: 7.5,-10.5
parent: 2
- type: Transform
- uid: 462
components:
- - pos: 7.5,-9.5
+ - type: Transform
+ pos: 7.5,-9.5
parent: 2
- type: Transform
- uid: 464
components:
- - pos: 8.5,-9.5
+ - type: Transform
+ pos: 8.5,-9.5
parent: 2
- type: Transform
- uid: 465
components:
- - pos: 8.5,-8.5
+ - type: Transform
+ pos: 8.5,-8.5
parent: 2
- type: Transform
- uid: 466
components:
- - pos: 8.5,-7.5
+ - type: Transform
+ pos: 8.5,-7.5
parent: 2
- type: Transform
- uid: 467
components:
- - pos: 8.5,-6.5
+ - type: Transform
+ pos: 8.5,-6.5
parent: 2
- type: Transform
- uid: 468
components:
- - pos: 8.5,-5.5
+ - type: Transform
+ pos: 8.5,-5.5
parent: 2
- type: Transform
- uid: 469
components:
- - pos: 8.5,-4.5
+ - type: Transform
+ pos: 8.5,-4.5
parent: 2
- type: Transform
- uid: 470
components:
- - pos: 8.5,-3.5
+ - type: Transform
+ pos: 8.5,-3.5
parent: 2
- type: Transform
- uid: 471
components:
- - pos: 8.5,-2.5
+ - type: Transform
+ pos: 8.5,-2.5
parent: 2
- type: Transform
- uid: 472
components:
- - pos: 8.5,-1.5
+ - type: Transform
+ pos: 8.5,-1.5
parent: 2
- type: Transform
- uid: 473
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 9.5,-0.5
parent: 2
- type: Transform
- uid: 477
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 1.5,-8.5
parent: 2
- type: Transform
- uid: 478
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 2.5,-8.5
parent: 2
- type: Transform
- uid: 479
components:
- - pos: 3.5,-9.5
+ - type: Transform
+ pos: 3.5,-9.5
parent: 2
- type: Transform
- uid: 480
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 4.5,-10.5
parent: 2
- type: Transform
- uid: 481
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 6.5,-10.5
parent: 2
- type: Transform
- uid: 482
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 5.5,-10.5
parent: 2
- type: Transform
- uid: 483
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 7.5,-10.5
parent: 2
- type: Transform
- uid: 484
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,0.5
parent: 2
- type: Transform
- uid: 485
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 8.5,0.5
parent: 2
- type: Transform
- uid: 492
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 9.5,1.5
parent: 2
- type: Transform
- uid: 493
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 10.5,1.5
parent: 2
- type: Transform
- uid: 494
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 11.5,1.5
parent: 2
- type: Transform
- uid: 495
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 1.5,1.5
parent: 2
- type: Transform
- uid: 496
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 0.5,1.5
parent: 2
- type: Transform
- uid: 497
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: -0.5,1.5
parent: 2
- type: Transform
- uid: 498
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -1.5,2.5
parent: 2
- type: Transform
- uid: 499
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -1.5,3.5
parent: 2
- type: Transform
- uid: 500
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -1.5,4.5
parent: 2
- type: Transform
- uid: 501
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -0.5,5.5
parent: 2
- type: Transform
- uid: 502
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 0.5,5.5
parent: 2
- type: Transform
- uid: 503
components:
- - pos: 12.5,4.5
+ - type: Transform
+ pos: 12.5,4.5
parent: 2
- type: Transform
- uid: 504
components:
- - pos: 12.5,3.5
+ - type: Transform
+ pos: 12.5,3.5
parent: 2
- type: Transform
- uid: 505
components:
- - pos: 12.5,2.5
+ - type: Transform
+ pos: 12.5,2.5
parent: 2
- type: Transform
- uid: 506
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 11.5,5.5
parent: 2
- type: Transform
- uid: 507
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 10.5,5.5
parent: 2
- type: Transform
- uid: 508
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 9.5,5.5
parent: 2
- type: Transform
- uid: 511
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 0.5,5.5
parent: 2
- type: Transform
- uid: 513
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 2.5,4.5
parent: 2
- type: Transform
- uid: 519
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 8.5,4.5
parent: 2
- type: Transform
- uid: 521
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 9.5,5.5
parent: 2
- type: Transform
- uid: 523
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 3.5,5.5
parent: 2
- type: Transform
- uid: 524
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 4.5,5.5
parent: 2
- type: Transform
- uid: 525
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 5.5,5.5
parent: 2
- type: Transform
- uid: 526
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 6.5,5.5
parent: 2
- type: Transform
- proto: GasPipeTJunction
entities:
- uid: 415
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 8.5,-16.5
parent: 2
- type: Transform
- uid: 416
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 8.5,-15.5
parent: 2
- type: Transform
- uid: 429
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 2.5,-15.5
parent: 2
- type: Transform
- uid: 433
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 2.5,-11.5
parent: 2
- type: Transform
- uid: 440
components:
- - pos: 5.5,-11.5
+ - type: Transform
+ pos: 5.5,-11.5
parent: 2
- type: Transform
- uid: 441
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 2.5,-0.5
parent: 2
- type: Transform
- uid: 463
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 8.5,-10.5
parent: 2
- type: Transform
- uid: 474
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 8.5,-0.5
parent: 2
- type: Transform
- uid: 509
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 8.5,5.5
parent: 2
- type: Transform
- uid: 510
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 1.5,5.5
parent: 2
- type: Transform
- proto: GasPort
entities:
- uid: 427
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 4.5,-15.5
parent: 2
- type: Transform
+ - type: AtmosDevice
+ joinedGrid: 2
- proto: GasVentPump
entities:
- uid: 398
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 8.5,-17.5
parent: 2
- type: Transform
+ - type: AtmosDevice
+ joinedGrid: 2
- uid: 400
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 0.5,-8.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 803
- - 802
- type: DeviceNetwork
+ - type: AtmosDevice
+ joinedGrid: 2
- uid: 401
components:
- - pos: 2.5,6.5
+ - type: Transform
+ pos: 2.5,6.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 806
- - 805
- type: DeviceNetwork
+ - type: AtmosDevice
+ joinedGrid: 2
- uid: 402
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 10.5,-0.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 803
- - 802
- type: DeviceNetwork
+ - type: AtmosDevice
+ joinedGrid: 2
- uid: 403
components:
- - pos: 8.5,6.5
+ - type: Transform
+ pos: 8.5,6.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 806
- - 805
- type: DeviceNetwork
+ - type: AtmosDevice
+ joinedGrid: 2
- uid: 412
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 1.5,-16.5
parent: 2
- type: Transform
+ - type: AtmosDevice
+ joinedGrid: 2
- proto: GasVentScrubber
entities:
- uid: 399
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 1.5,-15.5
parent: 2
- type: Transform
+ - type: AtmosDevice
+ joinedGrid: 2
- uid: 408
components:
- - pos: 1.5,6.5
+ - type: Transform
+ pos: 1.5,6.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 806
- - 805
- type: DeviceNetwork
+ - type: AtmosDevice
+ joinedGrid: 2
- uid: 409
components:
- - pos: 9.5,6.5
+ - type: Transform
+ pos: 9.5,6.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 806
- - 805
- type: DeviceNetwork
+ - type: AtmosDevice
+ joinedGrid: 2
- uid: 410
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 10.5,-8.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 803
- - 802
- type: DeviceNetwork
+ - type: AtmosDevice
+ joinedGrid: 2
- uid: 411
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 0.5,-0.5
parent: 2
- type: Transform
- - ShutdownSubscribers:
- - 803
- - 802
- type: DeviceNetwork
+ - type: AtmosDevice
+ joinedGrid: 2
- uid: 413
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 7.5,-17.5
parent: 2
- type: Transform
+ - type: AtmosDevice
+ joinedGrid: 2
- proto: GeneratorRTG
entities:
- uid: 367
components:
- - pos: 1.5,-17.5
+ - type: Transform
+ pos: 1.5,-17.5
parent: 2
- type: Transform
- uid: 368
components:
- - pos: 2.5,-17.5
+ - type: Transform
+ pos: 2.5,-17.5
parent: 2
- type: Transform
- proto: GravityGeneratorMini
entities:
- uid: 382
components:
- - pos: 0.5,-16.5
+ - type: Transform
+ pos: 0.5,-16.5
parent: 2
- type: Transform
- proto: Grille
entities:
- uid: 14
components:
- - pos: 5.5,-1.5
+ - type: Transform
+ pos: 5.5,-1.5
parent: 2
- type: Transform
- uid: 15
components:
- - pos: 5.5,-2.5
+ - type: Transform
+ pos: 5.5,-2.5
parent: 2
- type: Transform
- uid: 16
components:
- - pos: 5.5,-3.5
+ - type: Transform
+ pos: 5.5,-3.5
parent: 2
- type: Transform
- uid: 17
components:
- - pos: 5.5,-4.5
+ - type: Transform
+ pos: 5.5,-4.5
parent: 2
- type: Transform
- uid: 18
components:
- - pos: 5.5,-5.5
+ - type: Transform
+ pos: 5.5,-5.5
parent: 2
- type: Transform
- uid: 19
components:
- - pos: 5.5,-6.5
+ - type: Transform
+ pos: 5.5,-6.5
parent: 2
- type: Transform
- uid: 75
components:
- - pos: 5.5,-7.5
+ - type: Transform
+ pos: 5.5,-7.5
parent: 2
- type: Transform
- uid: 146
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 1.5,3.5
parent: 2
- type: Transform
- uid: 147
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,3.5
parent: 2
- type: Transform
- uid: 148
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 3.5,3.5
parent: 2
- type: Transform
- uid: 149
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 7.5,3.5
parent: 2
- type: Transform
- uid: 150
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 8.5,3.5
parent: 2
- type: Transform
- uid: 151
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 9.5,3.5
parent: 2
- type: Transform
- uid: 153
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -2.5,5.5
parent: 2
- type: Transform
- uid: 162
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 13.5,3.5
parent: 2
- type: Transform
- uid: 163
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 13.5,2.5
parent: 2
- type: Transform
- uid: 164
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 13.5,1.5
parent: 2
- type: Transform
- uid: 166
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 12.5,0.5
parent: 2
- type: Transform
- uid: 167
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -1.5,0.5
parent: 2
- type: Transform
- uid: 168
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -2.5,4.5
parent: 2
- type: Transform
- uid: 169
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -2.5,1.5
parent: 2
- type: Transform
- uid: 170
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -2.5,2.5
parent: 2
- type: Transform
- uid: 171
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -2.5,3.5
parent: 2
- type: Transform
- uid: 194
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 1.5,-13.5
parent: 2
- type: Transform
- uid: 195
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 3.5,-13.5
parent: 2
- type: Transform
- uid: 196
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 7.5,-13.5
parent: 2
- type: Transform
- uid: 197
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 9.5,-13.5
parent: 2
- type: Transform
- uid: 224
components:
- - pos: 8.5,-13.5
+ - type: Transform
+ pos: 8.5,-13.5
parent: 2
- type: Transform
- uid: 225
components:
- - pos: 2.5,-13.5
+ - type: Transform
+ pos: 2.5,-13.5
parent: 2
- type: Transform
- uid: 228
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 13.5,4.5
parent: 2
- type: Transform
- uid: 229
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 13.5,5.5
parent: 2
- type: Transform
- uid: 303
components:
- - pos: 4.5,7.5
+ - type: Transform
+ pos: 4.5,7.5
parent: 2
- type: Transform
- uid: 304
components:
- - pos: 3.5,7.5
+ - type: Transform
+ pos: 3.5,7.5
parent: 2
- type: Transform
- uid: 306
components:
- - pos: 6.5,7.5
+ - type: Transform
+ pos: 6.5,7.5
parent: 2
- type: Transform
- uid: 307
components:
- - pos: 5.5,7.5
+ - type: Transform
+ pos: 5.5,7.5
parent: 2
- type: Transform
- uid: 312
components:
- - pos: 7.5,7.5
+ - type: Transform
+ pos: 7.5,7.5
parent: 2
- type: Transform
- uid: 349
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -1.5,-1.5
parent: 2
- type: Transform
- uid: 350
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -1.5,-7.5
parent: 2
- type: Transform
- uid: 351
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 12.5,-7.5
parent: 2
- type: Transform
- uid: 352
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 12.5,-1.5
parent: 2
- type: Transform
- uid: 569
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -1.5,-4.5
parent: 2
- type: Transform
- uid: 572
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 12.5,-4.5
parent: 2
- type: Transform
- proto: Gyroscope
entities:
- uid: 383
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 0.5,-15.5
parent: 2
- type: Transform
- proto: LiquidNitrogenCanister
entities:
- uid: 385
components:
- - pos: 5.5,-17.5
+ - type: Transform
+ pos: 5.5,-17.5
parent: 2
- type: Transform
+ - type: AtmosDevice
+ joinedGrid: 2
- proto: LiquidOxygenCanister
entities:
- uid: 384
components:
- - pos: 4.5,-17.5
+ - type: Transform
+ pos: 4.5,-17.5
parent: 2
- type: Transform
+ - type: AtmosDevice
+ joinedGrid: 2
- proto: PlasmaReinforcedWindowDirectional
entities:
- uid: 388
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 5.5,-15.5
parent: 2
- type: Transform
- uid: 389
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 6.5,-15.5
parent: 2
- type: Transform
- uid: 390
components:
- - pos: 6.5,-15.5
+ - type: Transform
+ pos: 6.5,-15.5
parent: 2
- type: Transform
- uid: 391
components:
- - pos: 5.5,-15.5
+ - type: Transform
+ pos: 5.5,-15.5
parent: 2
- type: Transform
- proto: PlasticFlapsAirtightClear
entities:
- uid: 84
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 13.5,-6.5
parent: 2
- type: Transform
- uid: 86
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: -0.5,-2.5
parent: 2
- type: Transform
- uid: 112
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 11.5,-6.5
parent: 2
- type: Transform
- uid: 328
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -2.5,-2.5
parent: 2
- type: Transform
- uid: 332
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: -0.5,-6.5
parent: 2
- type: Transform
- uid: 333
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -2.5,-6.5
parent: 2
- type: Transform
- uid: 334
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 13.5,-2.5
parent: 2
- type: Transform
- uid: 336
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 11.5,-2.5
parent: 2
- type: Transform
- proto: PottedPlantRandom
entities:
- uid: 139
components:
- - pos: 1.5,-11.5
+ - type: Transform
+ pos: 1.5,-11.5
parent: 2
- type: Transform
- uid: 140
components:
- - pos: 9.5,-11.5
+ - type: Transform
+ pos: 9.5,-11.5
parent: 2
- type: Transform
- uid: 218
components:
- - pos: 1.5,2.5
+ - type: Transform
+ pos: 1.5,2.5
parent: 2
- type: Transform
- uid: 238
components:
- - pos: 9.5,2.5
+ - type: Transform
+ pos: 9.5,2.5
parent: 2
- type: Transform
- uid: 314
components:
- - pos: 0.5,4.5
+ - type: Transform
+ pos: 0.5,4.5
parent: 2
- type: Transform
- uid: 315
components:
- - pos: 10.5,4.5
+ - type: Transform
+ pos: 10.5,4.5
parent: 2
- type: Transform
- uid: 392
components:
- - pos: 9.5,-17.5
+ - type: Transform
+ pos: 9.5,-17.5
parent: 2
- type: Transform
- proto: Poweredlight
entities:
- uid: 119
components:
- - rot: -1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 4.5,-0.5
parent: 2
- type: Transform
- uid: 120
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 6.5,-0.5
parent: 2
- type: Transform
- uid: 121
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 6.5,-8.5
parent: 2
- type: Transform
- uid: 122
components:
- - rot: -1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 4.5,-8.5
parent: 2
- type: Transform
- uid: 123
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 5.5,-11.5
parent: 2
- type: Transform
- uid: 124
components:
- - pos: 5.5,2.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 5.5,2.5
parent: 2
- type: Transform
- uid: 216
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-17.5
parent: 2
- type: Transform
- uid: 219
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 8.5,-17.5
parent: 2
- type: Transform
- uid: 231
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 0.5,6.5
parent: 2
- type: Transform
- uid: 232
components:
- - rot: -1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 10.5,6.5
parent: 2
- type: Transform
- uid: 233
components:
- - rot: -1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: -1.5,3.5
parent: 2
- type: Transform
- uid: 234
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 12.5,3.5
parent: 2
- type: Transform
- proto: PoweredSmallLight
entities:
- uid: 259
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -1.5,-3.5
parent: 2
- type: Transform
- uid: 574
components:
- - pos: -1.5,-5.5
+ - type: Transform
+ pos: -1.5,-5.5
parent: 2
- type: Transform
- uid: 580
components:
- - pos: 12.5,-5.5
+ - type: Transform
+ pos: 12.5,-5.5
parent: 2
- type: Transform
- uid: 581
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 12.5,-3.5
parent: 2
- type: Transform
- proto: Railing
entities:
- uid: 286
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 1.5,4.5
parent: 2
- type: Transform
- uid: 287
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 3.5,4.5
parent: 2
- type: Transform
- uid: 288
components:
- - rot: -1.5707963267948966 rad
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 7.5,4.5
parent: 2
- type: Transform
- uid: 289
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 9.5,4.5
parent: 2
- type: Transform
- uid: 325
components:
- - pos: 6.5,5.5
+ - type: Transform
+ pos: 6.5,5.5
parent: 2
- type: Transform
- uid: 326
components:
- - pos: 4.5,5.5
+ - type: Transform
+ pos: 4.5,5.5
parent: 2
- type: Transform
- uid: 327
components:
- - pos: 5.5,5.5
+ - type: Transform
+ pos: 5.5,5.5
parent: 2
- type: Transform
- proto: RailingCornerSmall
entities:
- uid: 290
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 3.5,5.5
parent: 2
- type: Transform
- uid: 291
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 9.5,5.5
parent: 2
- type: Transform
- uid: 292
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 7.5,5.5
parent: 2
- type: Transform
- uid: 293
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 1.5,5.5
parent: 2
- type: Transform
- proto: RandomPosterLegit
entities:
- uid: 518
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 3.5,-14.5
parent: 2
- type: Transform
- uid: 545
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 0.5,3.5
parent: 2
- type: Transform
- uid: 546
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 10.5,3.5
parent: 2
- type: Transform
- uid: 547
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 10.5,-11.5
parent: 2
- type: Transform
- uid: 548
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 0.5,-11.5
parent: 2
- type: Transform
- uid: 549
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 9.5,7.5
parent: 2
- type: Transform
- uid: 550
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 1.5,7.5
parent: 2
- type: Transform
- uid: 551
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 7.5,-14.5
parent: 2
- type: Transform
- proto: ReinforcedWindow
entities:
- uid: 3
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 13.5,4.5
parent: 2
- type: Transform
- uid: 7
components:
- - pos: 5.5,-7.5
+ - type: Transform
+ pos: 5.5,-7.5
parent: 2
- type: Transform
- uid: 8
components:
- - pos: 5.5,-1.5
+ - type: Transform
+ pos: 5.5,-1.5
parent: 2
- type: Transform
- uid: 9
components:
- - pos: 5.5,-2.5
+ - type: Transform
+ pos: 5.5,-2.5
parent: 2
- type: Transform
- uid: 10
components:
- - pos: 5.5,-3.5
+ - type: Transform
+ pos: 5.5,-3.5
parent: 2
- type: Transform
- uid: 11
components:
- - pos: 5.5,-4.5
+ - type: Transform
+ pos: 5.5,-4.5
parent: 2
- type: Transform
- uid: 12
components:
- - pos: 5.5,-5.5
+ - type: Transform
+ pos: 5.5,-5.5
parent: 2
- type: Transform
- uid: 13
components:
- - pos: 5.5,-6.5
+ - type: Transform
+ pos: 5.5,-6.5
parent: 2
- type: Transform
- uid: 77
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 7.5,-13.5
parent: 2
- type: Transform
- uid: 100
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 1.5,-13.5
parent: 2
- type: Transform
- uid: 127
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 9.5,3.5
parent: 2
- type: Transform
- uid: 128
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 8.5,3.5
parent: 2
- type: Transform
- uid: 129
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 7.5,3.5
parent: 2
- type: Transform
- uid: 133
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 3.5,3.5
parent: 2
- type: Transform
- uid: 134
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,3.5
parent: 2
- type: Transform
- uid: 135
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 1.5,3.5
parent: 2
- type: Transform
- uid: 142
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 9.5,-13.5
parent: 2
- type: Transform
- uid: 152
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -1.5,0.5
parent: 2
- type: Transform
- uid: 154
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -2.5,1.5
parent: 2
- type: Transform
- uid: 155
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -2.5,3.5
parent: 2
- type: Transform
- uid: 156
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -2.5,2.5
parent: 2
- type: Transform
- uid: 157
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 12.5,0.5
parent: 2
- type: Transform
- uid: 158
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 13.5,5.5
parent: 2
- type: Transform
- uid: 159
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 13.5,1.5
parent: 2
- type: Transform
- uid: 160
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 13.5,2.5
parent: 2
- type: Transform
- uid: 161
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 13.5,3.5
parent: 2
- type: Transform
- uid: 165
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -2.5,5.5
parent: 2
- type: Transform
- uid: 182
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -2.5,4.5
parent: 2
- type: Transform
- uid: 185
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 3.5,-13.5
parent: 2
- type: Transform
- uid: 285
components:
- - pos: 3.5,7.5
+ - type: Transform
+ pos: 3.5,7.5
parent: 2
- type: Transform
- uid: 300
components:
- - pos: 5.5,7.5
+ - type: Transform
+ pos: 5.5,7.5
parent: 2
- type: Transform
- uid: 301
components:
- - pos: 6.5,7.5
+ - type: Transform
+ pos: 6.5,7.5
parent: 2
- type: Transform
- uid: 302
components:
- - pos: 7.5,7.5
+ - type: Transform
+ pos: 7.5,7.5
parent: 2
- type: Transform
- uid: 311
components:
- - pos: 4.5,7.5
+ - type: Transform
+ pos: 4.5,7.5
parent: 2
- type: Transform
- uid: 353
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -1.5,-1.5
parent: 2
- type: Transform
- uid: 356
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -1.5,-7.5
parent: 2
- type: Transform
- uid: 357
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 12.5,-7.5
parent: 2
- type: Transform
- uid: 358
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 12.5,-1.5
parent: 2
- type: Transform
- uid: 555
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -1.5,-4.5
parent: 2
- type: Transform
- uid: 558
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 12.5,-4.5
parent: 2
- type: Transform
- proto: ShuttersNormalOpen
entities:
- uid: 808
components:
- - pos: 1.5,3.5
+ - type: Transform
+ pos: 1.5,3.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 807
- type: DeviceLinkSink
- uid: 809
components:
- - pos: 2.5,3.5
+ - type: Transform
+ pos: 2.5,3.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 807
- type: DeviceLinkSink
- uid: 810
components:
- - pos: 3.5,3.5
+ - type: Transform
+ pos: 3.5,3.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 807
- type: DeviceLinkSink
- uid: 811
components:
- - pos: 7.5,3.5
+ - type: Transform
+ pos: 7.5,3.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 807
- type: DeviceLinkSink
- uid: 812
components:
- - pos: 8.5,3.5
+ - type: Transform
+ pos: 8.5,3.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 807
- type: DeviceLinkSink
- uid: 813
components:
- - pos: 9.5,3.5
+ - type: Transform
+ pos: 9.5,3.5
parent: 2
- type: Transform
- - links:
+ - type: DeviceLinkSink
+ links:
- 807
- type: DeviceLinkSink
- proto: SignalButton
entities:
- uid: 807
components:
- - pos: 0.5,7.5
+ - type: Transform
+ pos: 0.5,7.5
parent: 2
- type: Transform
- - linkedPorts:
+ - type: DeviceLinkSource
+ linkedPorts:
808:
- Pressed: Toggle
809:
@@ -3981,107 +3996,107 @@ entities:
- Pressed: Toggle
813:
- Pressed: Toggle
- type: DeviceLinkSource
- proto: SignSecureMed
entities:
- uid: 144
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 5.5,-8.5
parent: 2
- type: Transform
- uid: 145
components:
- - rot: 3.141592653589793 rad
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 5.5,-0.5
parent: 2
- type: Transform
- proto: SignSpace
entities:
- uid: 341
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -0.5,-1.5
parent: 2
- type: Transform
- uid: 342
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 11.5,-1.5
parent: 2
- type: Transform
- uid: 343
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 11.5,-7.5
parent: 2
- type: Transform
- uid: 344
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -0.5,-7.5
parent: 2
- type: Transform
- proto: SMESBasic
entities:
- uid: 380
components:
- - pos: 3.5,-17.5
+ - type: Transform
+ pos: 3.5,-17.5
parent: 2
- type: Transform
- proto: SubstationBasic
entities:
- uid: 381
components:
- - pos: 3.5,-15.5
+ - type: Transform
+ pos: 3.5,-15.5
parent: 2
- type: Transform
- proto: TableCounterWood
entities:
- uid: 251
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 2.5,4.5
parent: 2
- type: Transform
- uid: 252
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 1.5,4.5
parent: 2
- type: Transform
- uid: 256
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 3.5,4.5
parent: 2
- type: Transform
- uid: 257
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 7.5,4.5
parent: 2
- type: Transform
- uid: 261
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 9.5,4.5
parent: 2
- type: Transform
- uid: 262
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 8.5,4.5
parent: 2
- type: Transform
- proto: TwoWayLever
entities:
- uid: 365
components:
- - pos: 0.5,-3.5
+ - type: Transform
+ pos: 0.5,-3.5
parent: 2
- type: Transform
- - linkedPorts:
+ - type: DeviceLinkSource
+ linkedPorts:
363:
- Left: Forward
- Right: Reverse
@@ -4098,13 +4113,13 @@ entities:
- Left: Forward
- Right: Reverse
- Middle: Off
- type: DeviceLinkSource
- uid: 366
components:
- - pos: 0.5,-5.5
+ - type: Transform
+ pos: 0.5,-5.5
parent: 2
- type: Transform
- - linkedPorts:
+ - type: DeviceLinkSource
+ linkedPorts:
364:
- Left: Forward
- Right: Reverse
@@ -4121,13 +4136,13 @@ entities:
- Left: Forward
- Right: Reverse
- Middle: Off
- type: DeviceLinkSource
- uid: 393
components:
- - pos: 10.5,-3.5
+ - type: Transform
+ pos: 10.5,-3.5
parent: 2
- type: Transform
- - linkedPorts:
+ - type: DeviceLinkSource
+ linkedPorts:
359:
- Left: Forward
- Right: Reverse
@@ -4144,13 +4159,13 @@ entities:
- Left: Forward
- Right: Reverse
- Middle: Off
- type: DeviceLinkSource
- uid: 404
components:
- - pos: 10.5,-5.5
+ - type: Transform
+ pos: 10.5,-5.5
parent: 2
- type: Transform
- - linkedPorts:
+ - type: DeviceLinkSource
+ linkedPorts:
362:
- Left: Forward
- Right: Reverse
@@ -4167,584 +4182,783 @@ entities:
- Left: Forward
- Right: Reverse
- Middle: Off
- type: DeviceLinkSource
- proto: WallReinforced
entities:
- uid: 4
components:
- - pos: 5.5,0.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 5.5,0.5
parent: 2
- type: Transform
- uid: 5
components:
- - pos: 5.5,-0.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 5.5,-0.5
parent: 2
- type: Transform
- uid: 6
components:
- - pos: 5.5,-8.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 5.5,-8.5
parent: 2
- type: Transform
- uid: 74
components:
- - pos: 5.5,-9.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 5.5,-9.5
parent: 2
- type: Transform
- uid: 76
components:
- - pos: 11.5,2.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 11.5,2.5
parent: 2
- type: Transform
- uid: 78
components:
- - pos: 11.5,0.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 11.5,0.5
parent: 2
- type: Transform
- uid: 79
components:
- - pos: 11.5,-0.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 11.5,-0.5
parent: 2
- type: Transform
- uid: 80
components:
- - pos: 11.5,-1.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 11.5,-1.5
parent: 2
- type: Transform
- uid: 83
components:
- - pos: 11.5,-4.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 11.5,-4.5
parent: 2
- type: Transform
- uid: 85
components:
- - pos: 11.5,-7.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 11.5,-7.5
parent: 2
- type: Transform
- uid: 87
components:
- - pos: 11.5,-8.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 11.5,-8.5
parent: 2
- type: Transform
- uid: 88
components:
- - pos: 11.5,-9.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 11.5,-9.5
parent: 2
- type: Transform
- uid: 89
components:
- - pos: 11.5,-10.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 11.5,-10.5
parent: 2
- type: Transform
- uid: 90
components:
- - pos: 11.5,-11.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 11.5,-11.5
parent: 2
- type: Transform
- uid: 91
components:
- - pos: 10.5,-11.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 10.5,-11.5
parent: 2
- type: Transform
- uid: 92
components:
- - pos: 10.5,-12.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 10.5,-12.5
parent: 2
- type: Transform
- uid: 93
components:
- - pos: 9.5,-12.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 9.5,-12.5
parent: 2
- type: Transform
- uid: 95
components:
- - pos: 7.5,-12.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 7.5,-12.5
parent: 2
- type: Transform
- uid: 96
components:
- - pos: 6.5,-12.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 6.5,-12.5
parent: 2
- type: Transform
- uid: 97
components:
- - pos: 5.5,-12.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 5.5,-12.5
parent: 2
- type: Transform
- uid: 98
components:
- - pos: 4.5,-12.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 4.5,-12.5
parent: 2
- type: Transform
- uid: 101
components:
- - pos: 1.5,-12.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 1.5,-12.5
parent: 2
- type: Transform
- uid: 102
components:
- - pos: 0.5,-12.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 0.5,-12.5
parent: 2
- type: Transform
- uid: 103
components:
- - pos: 0.5,-11.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 0.5,-11.5
parent: 2
- type: Transform
- uid: 104
components:
- - pos: -0.5,-11.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: -0.5,-11.5
parent: 2
- type: Transform
- uid: 105
components:
- - pos: -0.5,-10.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: -0.5,-10.5
parent: 2
- type: Transform
- uid: 106
components:
- - pos: -0.5,-8.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: -0.5,-8.5
parent: 2
- type: Transform
- uid: 107
components:
- - pos: -0.5,-7.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: -0.5,-7.5
parent: 2
- type: Transform
- uid: 109
components:
- - pos: -0.5,-9.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: -0.5,-9.5
parent: 2
- type: Transform
- uid: 111
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 13.5,-4.5
parent: 2
- type: Transform
- uid: 113
components:
- - pos: -0.5,-4.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: -0.5,-4.5
parent: 2
- type: Transform
- uid: 114
components:
- - pos: -0.5,-1.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: -0.5,-1.5
parent: 2
- type: Transform
- uid: 115
components:
- - pos: -0.5,-0.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: -0.5,-0.5
parent: 2
- type: Transform
- uid: 116
components:
- - pos: -0.5,0.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: -0.5,0.5
parent: 2
- type: Transform
- uid: 117
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 3.5,-12.5
parent: 2
- type: Transform
- uid: 118
components:
- - pos: -0.5,2.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: -0.5,2.5
parent: 2
- type: Transform
- uid: 125
components:
- - pos: 11.5,3.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 11.5,3.5
parent: 2
- type: Transform
- uid: 126
components:
- - pos: 10.5,3.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 10.5,3.5
parent: 2
- type: Transform
- uid: 130
components:
- - pos: 6.5,3.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 6.5,3.5
parent: 2
- type: Transform
- uid: 131
components:
- - pos: 5.5,3.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 5.5,3.5
parent: 2
- type: Transform
- uid: 132
components:
- - pos: 4.5,3.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 4.5,3.5
parent: 2
- type: Transform
- uid: 136
components:
- - pos: 0.5,3.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 0.5,3.5
parent: 2
- type: Transform
- uid: 137
components:
- - pos: -0.5,3.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: -0.5,3.5
parent: 2
- type: Transform
- uid: 141
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 3.5,-14.5
parent: 2
- type: Transform
- uid: 172
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -2.5,0.5
parent: 2
- type: Transform
- uid: 173
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 13.5,0.5
parent: 2
- type: Transform
- uid: 174
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -0.5,4.5
parent: 2
- type: Transform
- uid: 175
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 13.5,6.5
parent: 2
- type: Transform
- uid: 176
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 12.5,6.5
parent: 2
- type: Transform
- uid: 177
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 11.5,6.5
parent: 2
- type: Transform
- uid: 178
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 11.5,4.5
parent: 2
- type: Transform
- uid: 179
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -0.5,6.5
parent: 2
- type: Transform
- uid: 180
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -1.5,6.5
parent: 2
- type: Transform
- uid: 181
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -2.5,6.5
parent: 2
- type: Transform
- uid: 183
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 0.5,-14.5
parent: 2
- type: Transform
- uid: 184
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 1.5,-14.5
parent: 2
- type: Transform
- uid: 186
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 4.5,-14.5
parent: 2
- type: Transform
- uid: 187
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 5.5,-14.5
parent: 2
- type: Transform
- uid: 188
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 6.5,-14.5
parent: 2
- type: Transform
- uid: 189
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 7.5,-14.5
parent: 2
- type: Transform
- uid: 190
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 11.5,-14.5
parent: 2
- type: Transform
- uid: 191
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 10.5,-14.5
parent: 2
- type: Transform
- uid: 192
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 9.5,-14.5
parent: 2
- type: Transform
- uid: 193
components:
- - pos: 2.5,-12.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 2.5,-12.5
parent: 2
- type: Transform
- uid: 198
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -0.5,-14.5
parent: 2
- type: Transform
- uid: 199
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -0.5,-15.5
parent: 2
- type: Transform
- uid: 200
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -0.5,-16.5
parent: 2
- type: Transform
- uid: 201
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -0.5,-17.5
parent: 2
- type: Transform
- uid: 202
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 1.5,-18.5
parent: 2
- type: Transform
- uid: 203
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 2.5,-18.5
parent: 2
- type: Transform
- uid: 204
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 3.5,-18.5
parent: 2
- type: Transform
- uid: 205
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 4.5,-18.5
parent: 2
- type: Transform
- uid: 206
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 5.5,-18.5
parent: 2
- type: Transform
- uid: 207
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 6.5,-18.5
parent: 2
- type: Transform
- uid: 208
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 7.5,-18.5
parent: 2
- type: Transform
- uid: 209
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 8.5,-18.5
parent: 2
- type: Transform
- uid: 210
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 9.5,-18.5
parent: 2
- type: Transform
- uid: 211
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 10.5,-18.5
parent: 2
- type: Transform
- uid: 212
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 10.5,-17.5
parent: 2
- type: Transform
- uid: 213
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 11.5,-17.5
parent: 2
- type: Transform
- uid: 214
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 11.5,-16.5
parent: 2
- type: Transform
- uid: 215
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 11.5,-15.5
parent: 2
- type: Transform
- uid: 217
components:
- - pos: 8.5,-12.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 8.5,-12.5
parent: 2
- type: Transform
- uid: 220
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 0.5,-18.5
parent: 2
- type: Transform
- uid: 221
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: 0.5,-17.5
parent: 2
- type: Transform
- uid: 230
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -0.5,7.5
parent: 2
- type: Transform
- uid: 235
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 0.5,7.5
parent: 2
- type: Transform
- uid: 236
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 1.5,7.5
parent: 2
- type: Transform
- uid: 237
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 2.5,7.5
parent: 2
- type: Transform
- uid: 239
components:
- - pos: 8.5,-14.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 8.5,-14.5
parent: 2
- type: Transform
- uid: 240
components:
- - pos: 2.5,-14.5
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 2.5,-14.5
parent: 2
- type: Transform
- uid: 242
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 8.5,7.5
parent: 2
- type: Transform
- uid: 243
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 9.5,7.5
parent: 2
- type: Transform
- uid: 244
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 10.5,7.5
parent: 2
- type: Transform
- uid: 245
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 11.5,7.5
parent: 2
- type: Transform
- uid: 345
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 13.5,-7.5
parent: 2
- type: Transform
- uid: 346
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -2.5,-7.5
parent: 2
- type: Transform
- uid: 347
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: -2.5,-1.5
parent: 2
- type: Transform
- uid: 348
components:
- - rot: 1.5707963267948966 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 13.5,-1.5
parent: 2
- type: Transform
- uid: 553
components:
- - rot: 3.141592653589793 rad
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: 3.141592653589793 rad
pos: -2.5,-4.5
parent: 2
- type: Transform
- proto: WindoorSecureEngineeringLocked
entities:
- uid: 371
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 3.5,-16.5
parent: 2
- type: Transform
- proto: WindowReinforcedDirectional
entities:
- uid: 369
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 3.5,-15.5
parent: 2
- type: Transform
- uid: 370
components:
- - rot: 1.5707963267948966 rad
+ - type: Transform
+ rot: 1.5707963267948966 rad
pos: 3.5,-17.5
parent: 2
- type: Transform
...
diff --git a/Resources/Prototypes/Entities/Stations/base.yml b/Resources/Prototypes/Entities/Stations/base.yml
index ecb3c373e66..933c7c6e195 100644
--- a/Resources/Prototypes/Entities/Stations/base.yml
+++ b/Resources/Prototypes/Entities/Stations/base.yml
@@ -46,9 +46,16 @@
path: /Maps/Shuttles/cargo.yml
- type: GridSpawn
groups:
+ trade:
+ addComponents:
+ - type: ProtectedGrid
+ - type: TradeStation
+ paths:
+ - /Maps/Shuttles/trading_outpost.yml
# mining:
# paths:
# - /Maps/Shuttles/mining.yml
+ # Spawn last
ruins:
hide: true
nameGrid: true
@@ -64,8 +71,6 @@
- /Maps/Ruins/DeltaV/whiteship_ancient.yml #Delta V - Move to DV folder
- /Maps/Ruins/DeltaV/whiteship_bluespacejumper.yml #Delta V - Move to DV folder
-
-
- type: entity
id: BaseStationShuttlesCore
abstract: true
From 76d06416ab963cd487037e664e30a4853a73dbac Mon Sep 17 00:00:00 2001
From: Debug <49997488+DebugOk@users.noreply.github.com>
Date: Fri, 8 Mar 2024 12:13:48 +0100
Subject: [PATCH 02/43] Modify trade station for Delta
---
.../Cargo/Systems/CargoSystem.Orders.cs | 10 +-
.../Cargo/Systems/CargoSystem.Shuttle.cs | 107 +++++++++++++++++-
Content.Server/Cargo/Systems/CargoSystem.cs | 6 +
.../Prototypes/Entities/Stations/base.yml | 12 +-
4 files changed, 124 insertions(+), 11 deletions(-)
diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
index 4c763362b3e..3b1a55ed4f7 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
@@ -222,12 +222,14 @@ private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent com
private void GetTradeStations(StationDataComponent data, ref List ents)
{
- foreach (var gridUid in data.Grids)
+ var tradeStationQuery = AllEntityQuery(); // We *could* cache this, but I don't know where it'd go
+
+ while (tradeStationQuery.MoveNext(out var uid, out _))
{
- if (!_tradeQuery.HasComponent(gridUid))
- continue;
+ //if (!_tradeQuery.HasComponent(uid))
+ // continue;
- ents.Add(gridUid);
+ ents.Add(uid);
}
}
diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
index 8a661c8896d..04dd9edeb47 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
@@ -1,13 +1,24 @@
+using System.Linq;
using Content.Server.Cargo.Components;
+using Content.Server.GameTicking.Events;
+using Content.Server.Shuttles.Components;
+using Content.Server.Station.Systems;
using Content.Shared.Stacks;
using Content.Shared.Cargo;
using Content.Shared.Cargo.BUI;
using Content.Shared.Cargo.Components;
using Content.Shared.Cargo.Events;
+using Content.Shared.CCVar;
using Content.Shared.GameTicking;
+using Content.Shared.Shuttles.Components;
+using Content.Shared.Tiles;
+using Content.Shared.Whitelist;
+using Robust.Server.Maps;
using Robust.Shared.Map;
using Robust.Shared.Random;
using Robust.Shared.Audio;
+using Robust.Shared.Physics.Components;
+using Robust.Shared.Utility;
namespace Content.Server.Cargo.Systems;
@@ -17,6 +28,8 @@ public sealed partial class CargoSystem
* Handles cargo shuttle / trade mechanics.
*/
+ public MapId? CargoMap { get; private set; }
+
private static readonly SoundPathSpecifier ApproveSound = new("/Audio/Effects/Cargo/ping.ogg");
private void InitializeShuttle()
@@ -30,6 +43,17 @@ private void InitializeShuttle()
SubscribeLocalEvent(OnPalletUIOpen);
SubscribeLocalEvent(OnRoundRestart);
+ SubscribeLocalEvent(OnStationInitialize);
+
+ Subs.CVar(_cfgManager, CCVars.GridFill, SetGridFill);
+ }
+
+ private void SetGridFill(bool obj)
+ {
+ if (obj)
+ {
+ SetupTradePost();
+ }
}
#region Console
@@ -332,7 +356,88 @@ private void OnPalletSale(EntityUid uid, CargoPalletConsoleComponent component,
private void OnRoundRestart(RoundRestartCleanupEvent ev)
{
- Reset();
+ CleanupTradeStation();
+ }
+
+ private void OnStationInitialize(StationInitializedEvent args)
+ {
+ if (!HasComp(args.Station)) // No cargo, L
+ return;
+
+ if (_cfgManager.GetCVar(CCVars.GridFill))
+ SetupTradePost();
+ }
+
+ private void CleanupTradeStation()
+ {
+ if (CargoMap == null || !_mapManager.MapExists(CargoMap.Value))
+ {
+ CargoMap = null;
+ DebugTools.Assert(!EntityQuery().Any());
+ return;
+ }
+
+ _mapManager.DeleteMap(CargoMap.Value);
+ CargoMap = null;
+
+ // Shuttle may not have been in the cargo dimension (e.g. on the station map) so need to delete.
+ var query = AllEntityQuery();
+
+ while (query.MoveNext(out var uid, out var _))
+ {
+ if (TryComp(uid, out var station))
+ {
+ station.Shuttle = null;
+ }
+
+ QueueDel(uid);
+ }
+ }
+
+ private void SetupTradePost()
+ {
+ if (CargoMap != null && _mapManager.MapExists(CargoMap.Value))
+ {
+ return;
+ }
+
+ // It gets mapinit which is okay... buuutt we still want it paused to avoid power draining.
+ CargoMap = _mapManager.CreateMap();
+
+ var options = new MapLoadOptions
+ {
+ LoadMap = true,
+ };
+
+ _mapLoader.TryLoad((MapId) CargoMap, "/Maps/Shuttles/trading_outpost.yml", out var rootUids, options); // Oh boy oh boy, hardcoded paths!
+
+ // If this fails to load for whatever reason, cargo is fucked
+ if (rootUids == null || !rootUids.Any())
+ return;
+
+ foreach (var grid in rootUids)
+ {
+ EnsureComp(grid);
+ EnsureComp(grid);
+
+ var shuttleComponent = EnsureComp(grid);
+ shuttleComponent.AngularDamping = 10000;
+ shuttleComponent.LinearDamping = 10000; // This shit ain't going nowhere
+ }
+
+ var mapUid = _mapManager.GetMapEntityId(CargoMap.Value);
+ var ftl = EnsureComp(_mapManager.GetMapEntityId(CargoMap.Value));
+ ftl.Whitelist = new EntityWhitelist()
+ {
+ Components =
+ [
+ _factory.GetComponentName(typeof(CargoShuttleComponent))
+ ]
+ };
+
+ _metaSystem.SetEntityName(mapUid, $"Automated Trade Station {_random.Next(1000):000}");
+
+ _console.RefreshShuttleConsoles();
}
}
diff --git a/Content.Server/Cargo/Systems/CargoSystem.cs b/Content.Server/Cargo/Systems/CargoSystem.cs
index d4be68efc85..2609d06b55d 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.cs
@@ -15,6 +15,8 @@
using JetBrains.Annotations;
using Robust.Server.GameObjects;
using Robust.Shared.Audio.Systems;
+using Robust.Shared.Configuration;
+using Robust.Shared.Map;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
using Robust.Shared.Random;
@@ -43,6 +45,10 @@ public sealed partial class CargoSystem : SharedCargoSystem
[Dependency] private readonly StationSystem _station = default!;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
[Dependency] private readonly MetaDataSystem _metaSystem = default!;
+ [Dependency] private readonly IConfigurationManager _cfgManager = default!;
+ [Dependency] private readonly IMapManager _mapManager = default!;
+ [Dependency] private readonly IComponentFactory _factory = default!;
+ [Dependency] private readonly MapLoaderSystem _mapLoader = default!;
private EntityQuery _xformQuery;
private EntityQuery _blacklistQuery;
diff --git a/Resources/Prototypes/Entities/Stations/base.yml b/Resources/Prototypes/Entities/Stations/base.yml
index 933c7c6e195..5cbe349416f 100644
--- a/Resources/Prototypes/Entities/Stations/base.yml
+++ b/Resources/Prototypes/Entities/Stations/base.yml
@@ -46,12 +46,12 @@
path: /Maps/Shuttles/cargo.yml
- type: GridSpawn
groups:
- trade:
- addComponents:
- - type: ProtectedGrid
- - type: TradeStation
- paths:
- - /Maps/Shuttles/trading_outpost.yml
+# trade:
+# addComponents:
+# - type: ProtectedGrid
+# - type: TradeStation
+# paths:
+# - /Maps/Shuttles/trading_outpost.yml
# mining:
# paths:
# - /Maps/Shuttles/mining.yml
From 824673428346bd7bde0fc0fd33eb911ff90c8c2b Mon Sep 17 00:00:00 2001
From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Date: Fri, 19 Jan 2024 18:10:57 +1100
Subject: [PATCH 03/43] Run fixgridatmos on trading outpost (#24264)
(cherry picked from commit 129892f1442fa0873b907aaf822a9a6d617d2ecf)
---
Resources/Maps/Shuttles/trading_outpost.yml | 33 ++++-----------------
1 file changed, 6 insertions(+), 27 deletions(-)
diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml
index 2d81ada37b8..878f9633144 100644
--- a/Resources/Maps/Shuttles/trading_outpost.yml
+++ b/Resources/Maps/Shuttles/trading_outpost.yml
@@ -337,26 +337,21 @@ entities:
2,-1:
0: 65535
3,-2:
- 0: 13105
- 1: 2
+ 0: 13107
3,-1:
- 0: 4403
- 1: 8704
+ 0: 13107
-1,0:
0: 61166
-1,1:
0: 52974
-1,-2:
- 0: 61164
- 1: 2
+ 0: 61166
-1,-1:
- 0: 52462
- 1: 8704
+ 0: 61166
-1,-4:
0: 34952
-1,-3:
- 0: 51336
- 1: 8192
+ 0: 59528
0,-5:
0: 65520
1,-5:
@@ -366,8 +361,7 @@ entities:
-1,-5:
0: 34816
3,-3:
- 0: 4096
- 1: 8192
+ 0: 12288
uniqueMixes:
- volume: 2500
temperature: 293.15
@@ -384,21 +378,6 @@ entities:
- 0
- 0
- 0
- - volume: 2500
- temperature: 293.15
- moles:
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
chunkSize: 4
- type: GasTileOverlay
- type: RadiationGridResistance
From b3304295f60bb88d51ca270effbe5e28c2894242 Mon Sep 17 00:00:00 2001
From: Ubaser <134914314+UbaserB@users.noreply.github.com>
Date: Fri, 19 Jan 2024 21:06:15 +1100
Subject: [PATCH 04/43] Update Trading Outpost (#24281)
* add
* yes
(cherry picked from commit 83640863699720bce708af20ae0bc37ce2a9ff54)
---
Resources/Maps/Shuttles/trading_outpost.yml | 2550 ++++++++++++++-----
1 file changed, 1852 insertions(+), 698 deletions(-)
diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml
index 878f9633144..2b7528be89f 100644
--- a/Resources/Maps/Shuttles/trading_outpost.yml
+++ b/Resources/Maps/Shuttles/trading_outpost.yml
@@ -4,14 +4,15 @@ meta:
tilemap:
0: Space
29: FloorDark
- 33: FloorDarkMini
34: FloorDarkMono
37: FloorDarkPavementVertical
49: FloorGrassJungle
+ 64: FloorMetalDiamond
+ 77: FloorReinforced
+ 89: FloorSteel
100: FloorSteelMono
- 101: FloorSteelOffset
+ 104: FloorTechMaint
105: FloorTechMaint2
- 106: FloorTechMaint3
118: FloorWood
119: FloorWoodTile
120: Lattice
@@ -30,27 +31,27 @@ entities:
chunks:
0,0:
ind: 0,0
- tiles: ZQAAAAAAIgAAAAAAIgAAAAAAIgAAAAABZQAAAAAAeQAAAAAAZQAAAAAAIgAAAAADIgAAAAADIgAAAAADZQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAIgAAAAADJQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAIgAAAAABaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAIgAAAAADeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdwAAAAACdwAAAAADdwAAAAADMQAAAAAAMQAAAAAAMQAAAAAAdwAAAAAAdwAAAAABdwAAAAADdgAAAAADeQAAAAAAIgAAAAACeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdwAAAAADdwAAAAAAdwAAAAADdgAAAAADdgAAAAABdgAAAAADdwAAAAABdwAAAAABdwAAAAACdgAAAAAAIgAAAAAAJQAAAAACeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAACdgAAAAABdgAAAAABdgAAAAABdgAAAAABdgAAAAAAdgAAAAADdgAAAAADdgAAAAAAdgAAAAACdgAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: WQAAAAABWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAAAWQAAAAADWQAAAAAAWQAAAAABWQAAAAADWQAAAAAAIgAAAAABJQAAAAADeQAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAIgAAAAAAIgAAAAABIgAAAAAAIgAAAAAAIgAAAAACIgAAAAABIgAAAAAAIgAAAAAAIgAAAAABIgAAAAACeQAAAAAAIgAAAAACeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAIgAAAAADeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdwAAAAABdwAAAAADdwAAAAACMQAAAAAAMQAAAAAAMQAAAAAAdwAAAAADdwAAAAABdwAAAAABdgAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAADdwAAAAABdwAAAAADdwAAAAADdgAAAAADdgAAAAACdgAAAAADdwAAAAAAdwAAAAABdwAAAAAAdgAAAAACIgAAAAADJQAAAAACeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdgAAAAABdgAAAAACdgAAAAABdgAAAAAAdgAAAAACdgAAAAAAdgAAAAAAdgAAAAABdgAAAAADdgAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
0,-1:
ind: 0,-1
- tiles: IQAAAAAAIQAAAAAAIQAAAAADIQAAAAAAHQAAAAACeQAAAAAAeQAAAAAAHQAAAAABHQAAAAAAHQAAAAABIgAAAAACeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAADaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAaQAAAAAAIgAAAAABeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAZQAAAAAAeQAAAAAAZQAAAAAAIgAAAAABIgAAAAADIgAAAAABZQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAACIgAAAAADIgAAAAABaQAAAAAAeQAAAAAAaQAAAAAAIgAAAAAAIgAAAAACIgAAAAADZQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAAAIgAAAAACIgAAAAABaQAAAAAAeQAAAAAAaQAAAAAAIgAAAAAAIgAAAAABIgAAAAABZQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAABZAAAAAADagAAAAADagAAAAADaQAAAAAAeQAAAAAAaQAAAAAAagAAAAACagAAAAADZAAAAAACZAAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAADIgAAAAACIgAAAAABaQAAAAAAeQAAAAAAaQAAAAAAIgAAAAAAIgAAAAACIgAAAAACZQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAABIgAAAAAAIgAAAAABaQAAAAAAeQAAAAAAaQAAAAAAIgAAAAADIgAAAAAAIgAAAAACZQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAABIgAAAAAAIgAAAAADaQAAAAAAeQAAAAAAaQAAAAAAIgAAAAAAIgAAAAABIgAAAAAAZQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAZAAAAAACagAAAAACagAAAAABaQAAAAAAeQAAAAAAaQAAAAAAagAAAAABagAAAAADZAAAAAABZAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAAAIgAAAAACIgAAAAADaQAAAAAAeQAAAAAAaQAAAAAAIgAAAAAAIgAAAAABIgAAAAAAZQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAIgAAAAADIgAAAAADIgAAAAAAaQAAAAAAeQAAAAAAaQAAAAAAIgAAAAABIgAAAAADIgAAAAAAZQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: eQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAIgAAAAAAeQAAAAAAeQAAAAAAIgAAAAABIgAAAAABHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAABIgAAAAACIgAAAAAAIgAAAAAAIgAAAAABIgAAAAABIgAAAAACIgAAAAAAIgAAAAACeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAAAWQAAAAACWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAACWQAAAAABWQAAAAABeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAADWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAACZAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAABaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAAAZAAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAADWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAABZAAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAADTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAABWQAAAAACTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADZAAAAAADeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA
version: 6
-1,0:
ind: -1,0
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAACeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAACeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAACIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAACIgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAADeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAADeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAADIgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
-1,-1:
ind: -1,-1
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAA
version: 6
0,-2:
ind: 0,-2
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIQAAAAABIQAAAAABIQAAAAAAHQAAAAABHQAAAAADHQAAAAACHQAAAAABHQAAAAACHQAAAAACeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAAAAIQAAAAADIQAAAAABIQAAAAABHQAAAAABHQAAAAAAHQAAAAADHQAAAAACHQAAAAABHQAAAAABIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAIgAAAAABIgAAAAACHQAAAAACHQAAAAADHQAAAAABHQAAAAABeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAHQAAAAABHQAAAAACHQAAAAABIgAAAAADIgAAAAADHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA
version: 6
-1,-2:
ind: -1,-2
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAA
version: 6
- type: Broadphase
- type: Physics
@@ -76,210 +77,137 @@ entities:
color: '#FFFFFFFF'
id: Bot
decals:
- 29: 0,2
- 30: 10,2
- 31: 1,-12
- 32: 9,-12
- 33: 10,-16
- 34: 10,-17
+ 19: 0,2
+ 20: 10,2
+ 21: 9,-12
+ 25: 4,-16
+ 28: 0,-6
+ 29: 0,-4
+ 30: 0,-1
+ 31: 0,-9
+ 32: 10,-9
+ 33: 10,-6
+ 34: 10,-4
+ 35: 10,-1
+ 50: 4,-5
+ 51: 6,-5
+ 61: 1,-12
- node:
color: '#FFFFFFFF'
- id: BrickTileDarkLineE
- decals:
- 10: 3,-18
- 11: 3,-17
- 12: 3,-16
- - node:
- color: '#FFFFFFFF'
- id: BrickTileDarkLineN
- decals:
- 86: 2,-12
- 87: 3,-12
- 88: 4,-12
- 89: 5,-12
- 90: 6,-12
- 91: 7,-12
- 92: 8,-12
- - node:
- color: '#FFFFFFFF'
- id: BrickTileDarkLineS
- decals:
- 93: 1,2
- 94: 2,2
- 95: 3,2
- 96: 4,2
- 97: 5,2
- 98: 6,2
- 99: 7,2
- 100: 8,2
- 101: 9,2
- - node:
- color: '#FFFFFFFF'
- id: BrickTileSteelCornerNe
- decals:
- 52: 4,-1
- - node:
- color: '#FFFFFFFF'
- id: BrickTileSteelCornerNw
- decals:
- 51: 6,-1
- - node:
- color: '#FFFFFFFF'
- id: BrickTileSteelCornerSe
+ id: Box
decals:
- 69: 4,-9
+ 26: 4,-18
+ 27: 5,-18
- node:
color: '#FFFFFFFF'
- id: BrickTileSteelCornerSw
- decals:
- 50: 6,-9
- - node:
- color: '#FFFFFFFF'
- id: BrickTileSteelLineE
- decals:
- 4: 1,-3
- 5: 1,-7
- 53: 4,-8
- 54: 4,-7
- 55: 4,-6
- 56: 4,-5
- 57: 4,-4
- 58: 4,-2
- 59: 4,-3
- - node:
- color: '#FFFFFFFF'
- id: BrickTileSteelLineN
- decals:
- 0: 4,-10
- 1: 6,-10
- 6: 3,-12
- 7: 2,-12
- 8: 7,-12
- 9: 8,-12
- 46: 0,-8
- 47: 0,-4
- 48: 10,-4
- 49: 10,-8
- - node:
- color: '#FFFFFFFF'
- id: BrickTileSteelLineS
+ id: BrickTileDarkLineE
decals:
- 42: 0,-6
- 43: 0,-2
- 44: 10,-2
- 45: 10,-6
- 70: 4,0
- 79: 2,2
- 80: 3,2
- 81: 4,2
- 82: 5,2
- 83: 6,2
- 84: 8,2
- 85: 7,2
+ 0: 3,-18
+ 1: 3,-17
+ 2: 3,-16
+ 58: 8,-6
+ 59: 8,-5
+ 60: 8,-4
+ 62: 3,-6
+ 63: 3,-5
+ 64: 3,-4
- node:
color: '#FFFFFFFF'
- id: BrickTileSteelLineW
+ id: BrickTileDarkLineW
decals:
- 2: 9,-7
- 3: 9,-3
- 60: 6,-2
- 61: 6,-3
- 62: 6,-4
- 63: 6,-5
- 64: 6,-5
- 65: 6,-6
- 66: 6,-7
- 67: 6,-8
- 68: 6,-8
+ 52: 2,-6
+ 53: 2,-5
+ 54: 2,-4
+ 55: 7,-6
+ 56: 7,-5
+ 57: 7,-4
- node:
color: '#FFFFFFFF'
id: BushCOne
decals:
- 36: 6,4
+ 23: 6,4
- node:
color: '#FFFFFFFF'
id: BushCTwo
decals:
- 35: 4,4
+ 22: 4,4
- node:
color: '#FFFFFFFF'
id: Bushi2
decals:
- 37: 5,4
+ 24: 5,4
- node:
angle: -1.5707963267948966 rad
color: '#FFFFFFFF'
id: LoadingArea
decals:
- 38: 9,-7
- 39: 9,-3
+ 65: 9,-7
+ 66: 9,-3
- node:
angle: 1.5707963267948966 rad
color: '#FFFFFFFF'
id: LoadingArea
decals:
- 40: 1,-7
- 41: 1,-3
- - node:
- color: '#FFFFFFFF'
- id: WarnLineE
- decals:
- 73: 3,-7
- 74: 3,-3
+ 67: 1,-7
+ 68: 1,-3
- node:
color: '#FFFFFFFF'
id: WarnLineN
decals:
- 75: 4,0
- 76: 6,0
- - node:
- color: '#FFFFFFFF'
- id: WarnLineS
- decals:
- 71: 7,-7
- 72: 7,-3
+ 43: 8,1
+ 44: 7,1
+ 45: 6,1
+ 46: 5,1
+ 47: 4,1
+ 48: 3,1
+ 49: 2,1
- node:
color: '#FFFFFFFF'
id: WarnLineW
decals:
- 77: 4,-10
- 78: 6,-10
+ 36: 2,-11
+ 37: 3,-11
+ 38: 4,-11
+ 39: 5,-11
+ 40: 6,-11
+ 41: 7,-11
+ 42: 8,-11
- node:
color: '#FFFFFFFF'
id: WoodTrimThinInnerSe
decals:
- 27: 0,6
- 28: 6,6
+ 17: 0,6
+ 18: 6,6
- node:
color: '#FFFFFFFF'
id: WoodTrimThinInnerSw
decals:
- 25: 4,6
- 26: 10,6
+ 15: 4,6
+ 16: 10,6
- node:
color: '#FFFFFFFF'
id: WoodTrimThinLineE
decals:
- 19: 0,4
- 20: 0,5
- 21: 6,5
+ 9: 0,4
+ 10: 0,5
+ 11: 6,5
- node:
color: '#FFFFFFFF'
id: WoodTrimThinLineS
decals:
- 13: 1,6
- 14: 2,6
- 15: 3,6
- 16: 7,6
- 17: 9,6
- 18: 8,6
+ 3: 1,6
+ 4: 2,6
+ 5: 3,6
+ 6: 7,6
+ 7: 9,6
+ 8: 8,6
- node:
color: '#FFFFFFFF'
id: WoodTrimThinLineW
decals:
- 22: 4,5
- 23: 10,4
- 24: 10,5
+ 12: 4,5
+ 13: 10,4
+ 14: 10,5
- type: GridAtmosphere
version: 2
data:
@@ -306,6 +234,7 @@ entities:
0: 65535
2,2:
0: 30583
+ 1: 128
2,3:
0: 3
3,0:
@@ -350,18 +279,61 @@ entities:
0: 61166
-1,-4:
0: 34952
+ 1: 8738
-1,-3:
0: 59528
+ 1: 38
0,-5:
0: 65520
+ 1: 9
1,-5:
0: 65520
+ 1: 8
2,-5:
0: 65392
+ 1: 140
-1,-5:
0: 34816
+ 1: 8938
3,-3:
0: 12288
+ 1: 35
+ 3,2:
+ 1: 16
+ 3,-4:
+ 1: 8738
+ -1,2:
+ 1: 192
+ 0,-8:
+ 1: 12288
+ 0,-7:
+ 1: 61936
+ 0,-6:
+ 1: 61937
+ 1,-7:
+ 1: 53456
+ 1,-6:
+ 1: 53456
+ 2,-7:
+ 1: 64760
+ 2,-6:
+ 1: 64764
+ 2,-8:
+ 1: 57344
+ 3,-7:
+ 1: 8739
+ 3,-6:
+ 1: 562
+ 3,-5:
+ 1: 8754
+ 3,-8:
+ 1: 8192
+ -1,-8:
+ 1: 40960
+ -1,-7:
+ 1: 43694
+ -1,-6:
+ 1: 35562
uniqueMixes:
- volume: 2500
temperature: 293.15
@@ -378,6 +350,21 @@ entities:
- 0
- 0
- 0
+ - volume: 2500
+ temperature: 293.15
+ moles:
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
chunkSize: 4
- type: GasTileOverlay
- type: RadiationGridResistance
@@ -460,37 +447,33 @@ entities:
parent: 2
- type: AtmosDevice
joinedGrid: 2
-- proto: AirlockCargoGlassLocked
+- proto: AirlockCargo
entities:
- - uid: 248
+ - uid: 1
components:
+ - type: MetaData
+ flags: PvsPriority
- type: Transform
- rot: 1.5707963267948966 rad
- pos: -0.5,5.5
+ pos: 11.5,1.5
parent: 2
- - uid: 249
+ - uid: 22
components:
+ - type: MetaData
+ flags: PvsPriority
- type: Transform
- rot: 1.5707963267948966 rad
- pos: 11.5,5.5
+ pos: -0.5,1.5
parent: 2
-- proto: AirlockCargoLocked
+- proto: AirlockCargoGlass
entities:
- - uid: 246
+ - uid: 248
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
- rot: 1.5707963267948966 rad
- pos: -0.5,1.5
+ pos: 11.5,5.5
parent: 2
- - uid: 247
+ - uid: 249
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
- rot: 1.5707963267948966 rad
- pos: 11.5,1.5
+ pos: -0.5,5.5
parent: 2
- proto: AirlockExternalGlass
entities:
@@ -570,21 +553,49 @@ entities:
rot: -1.5707963267948966 rad
pos: 10.5,4.5
parent: 2
-- proto: APCBasic
+- proto: AlwaysPoweredWallLight
entities:
- - uid: 596
+ - uid: 541
components:
+ - type: MetaData
+ flags: PvsPriority
- type: Transform
- pos: 1.5,-14.5
+ pos: 3.5,-19.5
parent: 2
+ - uid: 576
+ components:
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ pos: 7.5,-19.5
+ parent: 2
+- proto: APCBasic
+ entities:
- uid: 597
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: -0.5,0.5
parent: 2
+ - uid: 944
+ components:
+ - type: Transform
+ pos: 2.5,-14.5
+ parent: 2
+- proto: BoxFolderClipboard
+ entities:
+ - uid: 779
+ components:
+ - type: Transform
+ pos: 9.622929,-17.072632
+ parent: 2
- proto: CableApcExtension
entities:
+ - uid: 31
+ components:
+ - type: Transform
+ pos: 1.5,-4.5
+ parent: 2
- uid: 222
components:
- type: Transform
@@ -595,6 +606,11 @@ entities:
- type: Transform
pos: 12.5,1.5
parent: 2
+ - uid: 276
+ components:
+ - type: Transform
+ pos: 7.5,-4.5
+ parent: 2
- uid: 283
components:
- type: Transform
@@ -635,35 +651,20 @@ entities:
- type: Transform
pos: -1.5,2.5
parent: 2
- - uid: 515
+ - uid: 542
components:
- type: Transform
- pos: 1.5,-4.5
+ pos: 4.5,-4.5
parent: 2
- - uid: 516
+ - uid: 575
components:
- type: Transform
pos: 2.5,-4.5
parent: 2
- - uid: 517
- components:
- - type: Transform
- pos: 3.5,-4.5
- parent: 2
- - uid: 527
- components:
- - type: Transform
- pos: 9.5,-4.5
- parent: 2
- - uid: 528
- components:
- - type: Transform
- pos: 8.5,-4.5
- parent: 2
- - uid: 529
+ - uid: 577
components:
- type: Transform
- pos: 7.5,-4.5
+ pos: 5.5,-4.5
parent: 2
- uid: 638
components:
@@ -720,16 +721,6 @@ entities:
- type: Transform
pos: 9.5,-16.5
parent: 2
- - uid: 649
- components:
- - type: Transform
- pos: 10.5,-16.5
- parent: 2
- - uid: 650
- components:
- - type: Transform
- pos: 10.5,-15.5
- parent: 2
- uid: 651
components:
- type: Transform
@@ -1150,6 +1141,11 @@ entities:
- type: Transform
pos: -2.5,-3.5
parent: 2
+ - uid: 736
+ components:
+ - type: Transform
+ pos: 9.5,-4.5
+ parent: 2
- uid: 739
components:
- type: Transform
@@ -1225,191 +1221,611 @@ entities:
- type: Transform
pos: -0.5,5.5
parent: 2
-- proto: CableHV
- entities:
- - uid: 591
+ - uid: 804
components:
- type: Transform
- pos: 2.5,-17.5
+ pos: 6.5,-4.5
parent: 2
- - uid: 592
+ - uid: 819
components:
- type: Transform
- pos: 1.5,-17.5
+ pos: 8.5,-4.5
parent: 2
- - uid: 593
+ - uid: 855
components:
- type: Transform
- pos: 3.5,-17.5
+ pos: 3.5,-4.5
parent: 2
- - uid: 594
+- proto: CableHV
+ entities:
+ - uid: 53
components:
- type: Transform
- pos: 3.5,-16.5
+ pos: 11.5,-21.5
parent: 2
- - uid: 595
+ - uid: 62
components:
- type: Transform
- pos: 3.5,-15.5
+ pos: 8.5,-20.5
parent: 2
-- proto: CableMV
- entities:
- - uid: 599
+ - uid: 63
components:
- type: Transform
- pos: 3.5,-15.5
+ pos: 10.5,-20.5
parent: 2
- - uid: 600
+ - uid: 64
components:
- type: Transform
- pos: 2.5,-15.5
+ pos: 9.5,-20.5
parent: 2
- - uid: 601
+ - uid: 190
components:
- type: Transform
- pos: -0.5,0.5
+ pos: 11.5,-20.5
parent: 2
- - uid: 602
+ - uid: 191
components:
- type: Transform
- pos: 1.5,-14.5
+ pos: 11.5,-22.5
parent: 2
- - uid: 603
+ - uid: 267
components:
- type: Transform
- pos: 2.5,-14.5
+ pos: 11.5,-23.5
parent: 2
- - uid: 604
+ - uid: 273
components:
- type: Transform
- pos: 2.5,-13.5
+ pos: -0.5,-17.5
parent: 2
- - uid: 605
+ - uid: 274
components:
- type: Transform
- pos: 2.5,-12.5
+ pos: -0.5,-20.5
parent: 2
- - uid: 606
+ - uid: 275
components:
- type: Transform
- pos: 2.5,-11.5
+ pos: -0.5,-21.5
parent: 2
- - uid: 607
+ - uid: 278
components:
- type: Transform
- pos: 1.5,1.5
+ pos: -0.5,-26.5
parent: 2
- - uid: 608
+ - uid: 383
components:
- type: Transform
- pos: 2.5,1.5
+ pos: 11.5,-15.5
parent: 2
- - uid: 609
+ - uid: 392
components:
- type: Transform
- pos: 2.5,0.5
+ pos: 11.5,-18.5
parent: 2
- - uid: 610
+ - uid: 591
components:
- type: Transform
- pos: 2.5,-0.5
+ pos: 2.5,-17.5
parent: 2
- - uid: 611
+ - uid: 592
components:
- type: Transform
- pos: 2.5,-1.5
+ pos: 1.5,-17.5
parent: 2
- - uid: 612
+ - uid: 593
components:
- type: Transform
- pos: 2.5,-2.5
+ pos: 3.5,-17.5
parent: 2
- - uid: 613
+ - uid: 594
components:
- type: Transform
- pos: 2.5,-3.5
+ pos: 3.5,-16.5
parent: 2
- - uid: 614
+ - uid: 595
components:
- type: Transform
- pos: 2.5,-4.5
+ pos: 3.5,-15.5
parent: 2
- - uid: 615
+ - uid: 623
components:
- type: Transform
- pos: 2.5,-5.5
+ pos: 11.5,-17.5
parent: 2
- - uid: 616
+ - uid: 735
components:
- type: Transform
- pos: 2.5,-6.5
+ pos: 11.5,-13.5
parent: 2
- - uid: 617
+ - uid: 738
components:
- type: Transform
- pos: 2.5,-7.5
+ pos: -0.5,-19.5
parent: 2
- - uid: 618
+ - uid: 743
components:
- type: Transform
- pos: 2.5,-8.5
+ pos: -0.5,-22.5
parent: 2
- - uid: 619
+ - uid: 746
components:
- type: Transform
- pos: 2.5,-9.5
+ pos: -0.5,-25.5
parent: 2
- - uid: 620
+ - uid: 763
components:
- type: Transform
- pos: 2.5,-10.5
+ pos: 11.5,-24.5
parent: 2
- - uid: 621
+ - uid: 764
components:
- type: Transform
- pos: 0.5,1.5
+ pos: 11.5,-25.5
parent: 2
- - uid: 622
+ - uid: 765
components:
- type: Transform
- pos: -0.5,1.5
+ pos: 11.5,-26.5
parent: 2
- - uid: 628
+ - uid: 778
components:
- type: Transform
- pos: -0.5,5.5
+ pos: 1.5,-16.5
parent: 2
- - uid: 629
+ - uid: 780
components:
- type: Transform
- pos: 0.5,5.5
+ pos: 0.5,-16.5
parent: 2
- - uid: 630
+ - uid: 781
components:
- type: Transform
- pos: 1.5,5.5
+ pos: 11.5,-14.5
parent: 2
- - uid: 633
+ - uid: 784
components:
- type: Transform
- pos: 6.5,6.5
+ pos: -0.5,-15.5
parent: 2
- - uid: 634
+ - uid: 785
components:
- type: Transform
- pos: 6.5,5.5
+ pos: 11.5,-16.5
parent: 2
- - uid: 635
+ - uid: 800
components:
- type: Transform
- pos: 5.5,5.5
+ pos: -0.5,-16.5
parent: 2
- - uid: 636
+ - uid: 801
components:
- type: Transform
- pos: 4.5,5.5
+ pos: -0.5,-14.5
parent: 2
- - uid: 637
+ - uid: 817
+ components:
+ - type: Transform
+ pos: -0.5,-24.5
+ parent: 2
+ - uid: 818
+ components:
+ - type: Transform
+ pos: -0.5,-23.5
+ parent: 2
+ - uid: 824
+ components:
+ - type: Transform
+ pos: -0.5,-13.5
+ parent: 2
+ - uid: 825
+ components:
+ - type: Transform
+ pos: -0.5,-18.5
+ parent: 2
+ - uid: 828
+ components:
+ - type: Transform
+ pos: 10.5,-13.5
+ parent: 2
+ - uid: 829
+ components:
+ - type: Transform
+ pos: 9.5,-13.5
+ parent: 2
+ - uid: 830
+ components:
+ - type: Transform
+ pos: 8.5,-13.5
+ parent: 2
+ - uid: 831
+ components:
+ - type: Transform
+ pos: 7.5,-13.5
+ parent: 2
+ - uid: 832
+ components:
+ - type: Transform
+ pos: 6.5,-13.5
+ parent: 2
+ - uid: 833
+ components:
+ - type: Transform
+ pos: 5.5,-13.5
+ parent: 2
+ - uid: 834
+ components:
+ - type: Transform
+ pos: 4.5,-13.5
+ parent: 2
+ - uid: 835
+ components:
+ - type: Transform
+ pos: 3.5,-13.5
+ parent: 2
+ - uid: 836
+ components:
+ - type: Transform
+ pos: 2.5,-13.5
+ parent: 2
+ - uid: 837
+ components:
+ - type: Transform
+ pos: 1.5,-13.5
+ parent: 2
+ - uid: 838
+ components:
+ - type: Transform
+ pos: 0.5,-13.5
+ parent: 2
+ - uid: 902
+ components:
+ - type: Transform
+ pos: 10.5,-22.5
+ parent: 2
+ - uid: 904
+ components:
+ - type: Transform
+ pos: 11.5,-19.5
+ parent: 2
+ - uid: 905
+ components:
+ - type: Transform
+ pos: 7.5,-20.5
+ parent: 2
+ - uid: 906
+ components:
+ - type: Transform
+ pos: 6.5,-20.5
+ parent: 2
+ - uid: 910
+ components:
+ - type: Transform
+ pos: 9.5,-22.5
+ parent: 2
+ - uid: 911
+ components:
+ - type: Transform
+ pos: 8.5,-22.5
+ parent: 2
+ - uid: 912
+ components:
+ - type: Transform
+ pos: 7.5,-22.5
+ parent: 2
+ - uid: 913
+ components:
+ - type: Transform
+ pos: 6.5,-22.5
+ parent: 2
+ - uid: 914
+ components:
+ - type: Transform
+ pos: 4.5,-20.5
+ parent: 2
+ - uid: 915
+ components:
+ - type: Transform
+ pos: 3.5,-20.5
+ parent: 2
+ - uid: 916
+ components:
+ - type: Transform
+ pos: 2.5,-20.5
+ parent: 2
+ - uid: 917
+ components:
+ - type: Transform
+ pos: 1.5,-20.5
+ parent: 2
+ - uid: 918
+ components:
+ - type: Transform
+ pos: 0.5,-20.5
+ parent: 2
+ - uid: 919
+ components:
+ - type: Transform
+ pos: 0.5,-22.5
+ parent: 2
+ - uid: 920
+ components:
+ - type: Transform
+ pos: 1.5,-22.5
+ parent: 2
+ - uid: 921
+ components:
+ - type: Transform
+ pos: 2.5,-22.5
+ parent: 2
+ - uid: 922
+ components:
+ - type: Transform
+ pos: 3.5,-22.5
+ parent: 2
+ - uid: 923
+ components:
+ - type: Transform
+ pos: 4.5,-22.5
+ parent: 2
+ - uid: 924
+ components:
+ - type: Transform
+ pos: 4.5,-24.5
+ parent: 2
+ - uid: 925
+ components:
+ - type: Transform
+ pos: 3.5,-24.5
+ parent: 2
+ - uid: 926
+ components:
+ - type: Transform
+ pos: 2.5,-24.5
+ parent: 2
+ - uid: 927
+ components:
+ - type: Transform
+ pos: 1.5,-24.5
+ parent: 2
+ - uid: 928
+ components:
+ - type: Transform
+ pos: 0.5,-24.5
+ parent: 2
+ - uid: 929
+ components:
+ - type: Transform
+ pos: 0.5,-26.5
+ parent: 2
+ - uid: 930
+ components:
+ - type: Transform
+ pos: 1.5,-26.5
+ parent: 2
+ - uid: 931
+ components:
+ - type: Transform
+ pos: 2.5,-26.5
+ parent: 2
+ - uid: 932
+ components:
+ - type: Transform
+ pos: 3.5,-26.5
+ parent: 2
+ - uid: 933
+ components:
+ - type: Transform
+ pos: 4.5,-26.5
+ parent: 2
+ - uid: 934
+ components:
+ - type: Transform
+ pos: 6.5,-26.5
+ parent: 2
+ - uid: 935
+ components:
+ - type: Transform
+ pos: 7.5,-26.5
+ parent: 2
+ - uid: 936
+ components:
+ - type: Transform
+ pos: 9.5,-26.5
+ parent: 2
+ - uid: 937
+ components:
+ - type: Transform
+ pos: 8.5,-26.5
+ parent: 2
+ - uid: 938
+ components:
+ - type: Transform
+ pos: 10.5,-26.5
+ parent: 2
+ - uid: 939
+ components:
+ - type: Transform
+ pos: 6.5,-24.5
+ parent: 2
+ - uid: 940
+ components:
+ - type: Transform
+ pos: 7.5,-24.5
+ parent: 2
+ - uid: 941
+ components:
+ - type: Transform
+ pos: 8.5,-24.5
+ parent: 2
+ - uid: 942
+ components:
+ - type: Transform
+ pos: 9.5,-24.5
+ parent: 2
+ - uid: 943
+ components:
+ - type: Transform
+ pos: 10.5,-24.5
+ parent: 2
+- proto: CableMV
+ entities:
+ - uid: 599
+ components:
+ - type: Transform
+ pos: 3.5,-15.5
+ parent: 2
+ - uid: 600
+ components:
+ - type: Transform
+ pos: 2.5,-15.5
+ parent: 2
+ - uid: 601
+ components:
+ - type: Transform
+ pos: -0.5,0.5
+ parent: 2
+ - uid: 602
+ components:
+ - type: Transform
+ pos: 1.5,-14.5
+ parent: 2
+ - uid: 603
+ components:
+ - type: Transform
+ pos: 2.5,-14.5
+ parent: 2
+ - uid: 604
+ components:
+ - type: Transform
+ pos: 2.5,-13.5
+ parent: 2
+ - uid: 605
+ components:
+ - type: Transform
+ pos: 2.5,-12.5
+ parent: 2
+ - uid: 606
+ components:
+ - type: Transform
+ pos: 2.5,-11.5
+ parent: 2
+ - uid: 607
+ components:
+ - type: Transform
+ pos: 1.5,1.5
+ parent: 2
+ - uid: 608
+ components:
+ - type: Transform
+ pos: 2.5,1.5
+ parent: 2
+ - uid: 609
+ components:
+ - type: Transform
+ pos: 2.5,0.5
+ parent: 2
+ - uid: 610
+ components:
+ - type: Transform
+ pos: 2.5,-0.5
+ parent: 2
+ - uid: 611
+ components:
+ - type: Transform
+ pos: 2.5,-1.5
+ parent: 2
+ - uid: 612
+ components:
+ - type: Transform
+ pos: 2.5,-2.5
+ parent: 2
+ - uid: 613
+ components:
+ - type: Transform
+ pos: 2.5,-3.5
+ parent: 2
+ - uid: 614
+ components:
+ - type: Transform
+ pos: 2.5,-4.5
+ parent: 2
+ - uid: 615
+ components:
+ - type: Transform
+ pos: 2.5,-5.5
+ parent: 2
+ - uid: 616
+ components:
+ - type: Transform
+ pos: 2.5,-6.5
+ parent: 2
+ - uid: 617
+ components:
+ - type: Transform
+ pos: 2.5,-7.5
+ parent: 2
+ - uid: 618
+ components:
+ - type: Transform
+ pos: 2.5,-8.5
+ parent: 2
+ - uid: 619
+ components:
+ - type: Transform
+ pos: 2.5,-9.5
+ parent: 2
+ - uid: 620
+ components:
+ - type: Transform
+ pos: 2.5,-10.5
+ parent: 2
+ - uid: 621
+ components:
+ - type: Transform
+ pos: 0.5,1.5
+ parent: 2
+ - uid: 622
+ components:
+ - type: Transform
+ pos: -0.5,1.5
+ parent: 2
+ - uid: 628
+ components:
+ - type: Transform
+ pos: -0.5,5.5
+ parent: 2
+ - uid: 629
+ components:
+ - type: Transform
+ pos: 0.5,5.5
+ parent: 2
+ - uid: 630
+ components:
+ - type: Transform
+ pos: 1.5,5.5
+ parent: 2
+ - uid: 633
+ components:
+ - type: Transform
+ pos: 6.5,6.5
+ parent: 2
+ - uid: 634
+ components:
+ - type: Transform
+ pos: 6.5,5.5
+ parent: 2
+ - uid: 635
+ components:
+ - type: Transform
+ pos: 5.5,5.5
+ parent: 2
+ - uid: 636
+ components:
+ - type: Transform
+ pos: 4.5,5.5
+ parent: 2
+ - uid: 637
components:
- type: Transform
pos: 3.5,5.5
@@ -1434,16 +1850,6 @@ entities:
- type: Transform
pos: 8.5,0.5
parent: 2
- - uid: 22
- components:
- - type: Transform
- pos: 9.5,0.5
- parent: 2
- - uid: 23
- components:
- - type: Transform
- pos: 9.5,-0.5
- parent: 2
- uid: 24
components:
- type: Transform
@@ -1464,429 +1870,616 @@ entities:
- type: Transform
pos: 8.5,-1.5
parent: 2
- - uid: 28
+ - uid: 30
components:
- type: Transform
- pos: 9.5,-1.5
+ rot: -1.5707963267948966 rad
+ pos: 6.5,0.5
parent: 2
- - uid: 29
+ - uid: 32
components:
- type: Transform
- pos: 9.5,-8.5
+ pos: 2.5,-7.5
parent: 2
- - uid: 30
+ - uid: 34
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 7.5,-7.5
+ parent: 2
+ - uid: 35
components:
- type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 8.5,-7.5
+ parent: 2
+ - uid: 36
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 6.5,-1.5
+ parent: 2
+ - uid: 37
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 8.5,-9.5
+ parent: 2
+ - uid: 39
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
pos: 8.5,-8.5
parent: 2
- - uid: 31
+ - uid: 41
components:
- type: Transform
+ rot: -1.5707963267948966 rad
pos: 7.5,-8.5
parent: 2
- - uid: 32
+ - uid: 42
components:
- type: Transform
- pos: 2.5,-7.5
+ rot: -1.5707963267948966 rad
+ pos: 6.5,-8.5
parent: 2
- - uid: 33
+ - uid: 43
components:
- type: Transform
- pos: 7.5,-7.5
+ rot: -1.5707963267948966 rad
+ pos: 6.5,-9.5
parent: 2
- - uid: 34
+ - uid: 44
components:
- type: Transform
- pos: 1.5,-8.5
+ rot: -1.5707963267948966 rad
+ pos: 4.5,-0.5
parent: 2
- - uid: 35
+ - uid: 45
components:
- type: Transform
- pos: 8.5,-7.5
+ rot: -1.5707963267948966 rad
+ pos: 4.5,-8.5
parent: 2
- - uid: 36
+ - uid: 46
components:
- type: Transform
- pos: 1.5,-7.5
+ rot: -1.5707963267948966 rad
+ pos: 6.5,-6.5
parent: 2
- - uid: 37
+ - uid: 47
components:
- type: Transform
- pos: 9.5,-7.5
+ rot: -1.5707963267948966 rad
+ pos: 4.5,-9.5
parent: 2
- - uid: 38
+ - uid: 48
components:
- type: Transform
- pos: 7.5,-3.5
+ rot: -1.5707963267948966 rad
+ pos: 6.5,-7.5
parent: 2
- - uid: 39
+ - uid: 49
components:
- type: Transform
- pos: 7.5,-4.5
+ pos: 7.5,-9.5
parent: 2
- - uid: 40
+ - uid: 50
components:
- type: Transform
- pos: 7.5,-5.5
+ pos: 3.5,-7.5
parent: 2
- - uid: 41
+ - uid: 51
components:
- type: Transform
- pos: 8.5,-5.5
+ pos: 3.5,-9.5
parent: 2
- - uid: 42
+ - uid: 52
components:
- type: Transform
- pos: 8.5,-3.5
+ pos: 3.5,-8.5
+ parent: 2
+ - uid: 54
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 4.5,-7.5
+ parent: 2
+ - uid: 55
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 6.5,-2.5
+ parent: 2
+ - uid: 56
+ components:
+ - type: Transform
+ pos: 3.5,-1.5
+ parent: 2
+ - uid: 57
+ components:
+ - type: Transform
+ pos: 2.5,-8.5
+ parent: 2
+ - uid: 58
+ components:
+ - type: Transform
+ pos: 3.5,-0.5
+ parent: 2
+ - uid: 59
+ components:
+ - type: Transform
+ pos: 3.5,0.5
+ parent: 2
+ - uid: 60
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 6.5,-0.5
+ parent: 2
+ - uid: 61
+ components:
+ - type: Transform
+ pos: 2.5,-9.5
+ parent: 2
+ - uid: 66
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 7.5,-2.5
+ parent: 2
+ - uid: 67
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 2.5,-2.5
+ parent: 2
+ - uid: 68
+ components:
+ - type: Transform
+ pos: 2.5,-1.5
+ parent: 2
+ - uid: 69
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 3.5,-2.5
+ parent: 2
+ - uid: 70
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 8.5,-2.5
+ parent: 2
+ - uid: 71
+ components:
+ - type: Transform
+ pos: 2.5,-0.5
+ parent: 2
+ - uid: 72
+ components:
+ - type: Transform
+ pos: 2.5,0.5
+ parent: 2
+ - uid: 73
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 8.5,-6.5
+ parent: 2
+ - uid: 183
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 7.5,-6.5
+ parent: 2
+ - uid: 900
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 3.5,-6.5
+ parent: 2
+ - uid: 901
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 2.5,-6.5
+ parent: 2
+ - uid: 903
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 4.5,0.5
+ parent: 2
+ - uid: 907
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 4.5,-6.5
+ parent: 2
+ - uid: 908
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 4.5,-2.5
+ parent: 2
+ - uid: 909
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 4.5,-1.5
+ parent: 2
+- proto: CarpetBlack
+ entities:
+ - uid: 33
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 6.5,5.5
+ parent: 2
+ - uid: 65
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 5.5,5.5
parent: 2
- - uid: 43
+ - uid: 199
components:
- type: Transform
- pos: 8.5,-4.5
+ rot: 1.5707963267948966 rad
+ pos: 4.5,6.5
parent: 2
- - uid: 44
+ - uid: 200
components:
- type: Transform
- pos: 9.5,-3.5
+ rot: 1.5707963267948966 rad
+ pos: 4.5,5.5
parent: 2
- - uid: 45
+ - uid: 201
components:
- type: Transform
- pos: 9.5,-4.5
+ rot: 1.5707963267948966 rad
+ pos: 1.5,5.5
parent: 2
- - uid: 46
+ - uid: 211
components:
- type: Transform
- pos: 9.5,-5.5
+ rot: 1.5707963267948966 rad
+ pos: 5.5,6.5
parent: 2
- - uid: 47
+ - uid: 212
components:
- type: Transform
- pos: 9.5,-9.5
+ rot: 1.5707963267948966 rad
+ pos: 9.5,6.5
parent: 2
- - uid: 48
+ - uid: 213
components:
- type: Transform
- pos: 8.5,-9.5
+ rot: 1.5707963267948966 rad
+ pos: 7.5,6.5
parent: 2
- - uid: 49
+ - uid: 214
components:
- type: Transform
- pos: 7.5,-9.5
+ rot: 1.5707963267948966 rad
+ pos: 10.5,5.5
parent: 2
- - uid: 50
+ - uid: 215
components:
- type: Transform
- pos: 3.5,-7.5
+ rot: 1.5707963267948966 rad
+ pos: 1.5,6.5
parent: 2
- - uid: 51
+ - uid: 221
components:
- type: Transform
- pos: 3.5,-9.5
+ rot: 1.5707963267948966 rad
+ pos: 6.5,6.5
parent: 2
- - uid: 52
+ - uid: 246
components:
- type: Transform
- pos: 3.5,-8.5
+ rot: 1.5707963267948966 rad
+ pos: 10.5,6.5
parent: 2
- - uid: 53
+ - uid: 247
components:
- type: Transform
- pos: 3.5,-3.5
+ rot: 1.5707963267948966 rad
+ pos: 3.5,5.5
parent: 2
- - uid: 54
+ - uid: 265
components:
- type: Transform
- pos: 3.5,-5.5
+ rot: 1.5707963267948966 rad
+ pos: 3.5,6.5
parent: 2
- - uid: 55
+ - uid: 266
components:
- type: Transform
- pos: 3.5,-4.5
+ rot: 1.5707963267948966 rad
+ pos: 0.5,6.5
parent: 2
- - uid: 56
+ - uid: 268
components:
- type: Transform
- pos: 3.5,-1.5
+ rot: 1.5707963267948966 rad
+ pos: 9.5,5.5
parent: 2
- - uid: 57
+ - uid: 269
components:
- type: Transform
- pos: 2.5,-8.5
+ rot: 1.5707963267948966 rad
+ pos: 7.5,5.5
parent: 2
- - uid: 58
+ - uid: 270
components:
- type: Transform
- pos: 3.5,-0.5
+ rot: 1.5707963267948966 rad
+ pos: 0.5,5.5
parent: 2
- - uid: 59
+ - uid: 271
components:
- type: Transform
- pos: 3.5,0.5
+ rot: 1.5707963267948966 rad
+ pos: 1.5,6.5
parent: 2
- - uid: 60
+- proto: Catwalk
+ entities:
+ - uid: 294
components:
- type: Transform
- pos: 1.5,-9.5
+ rot: 1.5707963267948966 rad
+ pos: 12.5,4.5
parent: 2
- - uid: 61
+ - uid: 295
components:
- type: Transform
- pos: 2.5,-9.5
+ rot: 1.5707963267948966 rad
+ pos: 12.5,3.5
parent: 2
- - uid: 62
+ - uid: 296
components:
- type: Transform
- pos: 2.5,-5.5
+ rot: 1.5707963267948966 rad
+ pos: 12.5,2.5
parent: 2
- - uid: 63
+ - uid: 297
components:
- type: Transform
- pos: 1.5,-5.5
+ rot: 1.5707963267948966 rad
+ pos: -1.5,4.5
parent: 2
- - uid: 64
+ - uid: 298
components:
- type: Transform
- pos: 1.5,-4.5
+ rot: 1.5707963267948966 rad
+ pos: -1.5,3.5
parent: 2
- - uid: 65
+ - uid: 299
components:
- type: Transform
- pos: 2.5,-4.5
+ rot: 1.5707963267948966 rad
+ pos: -1.5,2.5
parent: 2
- - uid: 66
+ - uid: 313
components:
- type: Transform
- pos: 2.5,-3.5
+ pos: -1.5,-3.5
parent: 2
- - uid: 67
+ - uid: 528
components:
- type: Transform
- pos: 1.5,-3.5
+ pos: 0.5,-24.5
parent: 2
- - uid: 68
+ - uid: 529
components:
- type: Transform
- pos: 2.5,-1.5
+ pos: 2.5,-26.5
parent: 2
- - uid: 69
+ - uid: 533
components:
- type: Transform
- pos: 1.5,-1.5
+ pos: 3.5,-22.5
parent: 2
- - uid: 70
+ - uid: 538
components:
- type: Transform
- pos: 1.5,-0.5
+ pos: 0.5,-20.5
parent: 2
- - uid: 71
+ - uid: 539
components:
- type: Transform
- pos: 2.5,-0.5
+ pos: 9.5,-20.5
parent: 2
- - uid: 72
+ - uid: 540
components:
- type: Transform
- pos: 2.5,0.5
+ pos: 9.5,-22.5
parent: 2
- - uid: 73
+ - uid: 543
components:
- type: Transform
- pos: 1.5,0.5
+ pos: 8.5,-22.5
parent: 2
-- proto: CarpetBlack
- entities:
- - uid: 265
+ - uid: 544
components:
- type: Transform
- pos: 3.5,5.5
+ pos: 9.5,-24.5
parent: 2
- - uid: 266
+ - uid: 552
components:
- type: Transform
- pos: 3.5,6.5
+ pos: 2.5,-24.5
parent: 2
- - uid: 267
+ - uid: 554
components:
- type: Transform
- pos: 4.5,6.5
+ pos: 7.5,-26.5
parent: 2
- - uid: 268
+ - uid: 557
components:
- type: Transform
- pos: 5.5,6.5
+ pos: 3.5,-26.5
parent: 2
- - uid: 269
+ - uid: 559
components:
- type: Transform
- pos: 6.5,6.5
+ pos: 0.5,-26.5
parent: 2
- - uid: 270
+ - uid: 560
components:
- type: Transform
- pos: 7.5,6.5
+ rot: 3.141592653589793 rad
+ pos: -1.5,-5.5
parent: 2
- - uid: 271
+ - uid: 562
components:
- type: Transform
- pos: 7.5,5.5
+ rot: 3.141592653589793 rad
+ pos: 12.5,-3.5
parent: 2
- - uid: 272
+ - uid: 563
components:
- type: Transform
- pos: 6.5,5.5
+ rot: 3.141592653589793 rad
+ pos: 12.5,-5.5
parent: 2
- - uid: 273
+ - uid: 571
components:
- type: Transform
- pos: 5.5,5.5
+ pos: 8.5,-20.5
parent: 2
- - uid: 274
+ - uid: 573
components:
- type: Transform
- pos: 4.5,5.5
+ pos: 10.5,-20.5
parent: 2
- - uid: 275
+ - uid: 578
components:
- type: Transform
- pos: 1.5,5.5
+ pos: 9.5,-26.5
parent: 2
- - uid: 276
+ - uid: 579
components:
- type: Transform
- pos: 1.5,6.5
+ pos: 10.5,-24.5
parent: 2
- - uid: 277
+ - uid: 596
components:
- type: Transform
- pos: 0.5,6.5
+ pos: 7.5,-24.5
parent: 2
- - uid: 278
+ - uid: 598
components:
- type: Transform
- pos: 0.5,5.5
+ pos: 7.5,-22.5
parent: 2
- - uid: 279
+ - uid: 759
components:
- type: Transform
- pos: 9.5,6.5
+ pos: 3.5,-24.5
parent: 2
- - uid: 280
+ - uid: 761
components:
- type: Transform
- pos: 9.5,5.5
+ pos: 1.5,-22.5
parent: 2
- - uid: 281
+ - uid: 762
components:
- type: Transform
- pos: 10.5,5.5
+ pos: 2.5,-20.5
parent: 2
- - uid: 282
+ - uid: 840
components:
- type: Transform
- pos: 10.5,6.5
+ pos: 3.5,-20.5
parent: 2
-- proto: CarpetOrange
- entities:
- - uid: 374
+ - uid: 841
components:
- type: Transform
- rot: -1.5707963267948966 rad
- pos: 9.5,-15.5
+ pos: 1.5,-24.5
parent: 2
- - uid: 375
+ - uid: 846
components:
- type: Transform
- rot: -1.5707963267948966 rad
- pos: 8.5,-15.5
+ pos: 1.5,-26.5
parent: 2
- - uid: 376
+ - uid: 848
components:
- type: Transform
- rot: -1.5707963267948966 rad
- pos: 7.5,-15.5
+ pos: 4.5,-26.5
parent: 2
- - uid: 377
+ - uid: 849
components:
- type: Transform
- rot: -1.5707963267948966 rad
- pos: 7.5,-16.5
+ pos: 0.5,-22.5
parent: 2
- - uid: 378
+ - uid: 850
components:
- type: Transform
- rot: -1.5707963267948966 rad
- pos: 8.5,-16.5
+ pos: 2.5,-22.5
parent: 2
- - uid: 379
+ - uid: 856
components:
- type: Transform
- rot: -1.5707963267948966 rad
- pos: 9.5,-16.5
+ pos: 6.5,-26.5
parent: 2
-- proto: Catwalk
- entities:
- - uid: 294
+ - uid: 857
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: 12.5,4.5
+ pos: 10.5,-22.5
parent: 2
- - uid: 295
+ - uid: 858
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: 12.5,3.5
+ pos: 6.5,-20.5
parent: 2
- - uid: 296
+ - uid: 859
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: 12.5,2.5
+ pos: 1.5,-20.5
parent: 2
- - uid: 297
+ - uid: 860
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: -1.5,4.5
+ pos: 4.5,-20.5
parent: 2
- - uid: 298
+ - uid: 861
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: -1.5,3.5
+ pos: 7.5,-20.5
parent: 2
- - uid: 299
+ - uid: 863
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: -1.5,2.5
+ pos: 8.5,-24.5
parent: 2
- - uid: 313
+ - uid: 864
components:
- type: Transform
- pos: -1.5,-3.5
+ pos: 8.5,-26.5
parent: 2
- - uid: 560
+ - uid: 865
components:
- type: Transform
- rot: 3.141592653589793 rad
- pos: -1.5,-5.5
+ pos: 10.5,-26.5
parent: 2
- - uid: 562
+- proto: Chair
+ entities:
+ - uid: 38
components:
- type: Transform
- rot: 3.141592653589793 rad
- pos: 12.5,-3.5
+ rot: -1.5707963267948966 rad
+ pos: 7.5,-4.5
parent: 2
- - uid: 563
+ - uid: 40
components:
- type: Transform
- rot: 3.141592653589793 rad
- pos: 12.5,-5.5
+ rot: 1.5707963267948966 rad
+ pos: 3.5,-4.5
parent: 2
-- proto: Chair
- entities:
- uid: 94
components:
- type: Transform
@@ -1955,17 +2548,17 @@ entities:
parent: 2
- proto: ChairPilotSeat
entities:
- - uid: 372
+ - uid: 767
components:
- type: Transform
- rot: -1.5707963267948966 rad
- pos: 10.5,-16.5
+ rot: 3.141592653589793 rad
+ pos: 7.5,-16.5
parent: 2
- - uid: 373
+ - uid: 768
components:
- type: Transform
- rot: -1.5707963267948966 rad
- pos: 10.5,-15.5
+ rot: 3.141592653589793 rad
+ pos: 8.5,-16.5
parent: 2
- proto: ChairWood
entities:
@@ -2011,26 +2604,36 @@ entities:
- uid: 355
components:
- type: Transform
- pos: 10.5,2.5
+ pos: 10.5,2.5
+ parent: 2
+- proto: ComputerPalletConsole
+ entities:
+ - uid: 894
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 6.5,-4.5
+ parent: 2
+ - uid: 895
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 4.5,-4.5
parent: 2
-- proto: ComputerPalletConsole
+- proto: ComputerPowerMonitoring
entities:
- - uid: 1
+ - uid: 766
components:
- type: Transform
- rot: -1.5707963267948966 rad
- pos: 4.5,-4.5
+ pos: 7.5,-15.5
parent: 2
- missingComponents:
- - Anchorable
- - uid: 514
+- proto: ComputerSolarControl
+ entities:
+ - uid: 772
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: 6.5,-4.5
+ pos: 8.5,-15.5
parent: 2
- missingComponents:
- - Anchorable
- proto: ConveyorBelt
entities:
- uid: 81
@@ -3054,10 +3657,10 @@ entities:
parent: 2
- proto: GravityGeneratorMini
entities:
- - uid: 382
+ - uid: 279
components:
- type: Transform
- pos: 0.5,-16.5
+ pos: 1.5,-16.5
parent: 2
- proto: Grille
entities:
@@ -3219,93 +3822,402 @@ entities:
- uid: 224
components:
- type: Transform
- pos: 8.5,-13.5
+ pos: 8.5,-13.5
+ parent: 2
+ - uid: 225
+ components:
+ - type: Transform
+ pos: 2.5,-13.5
+ parent: 2
+ - uid: 228
+ components:
+ - type: Transform
+ rot: 3.141592653589793 rad
+ pos: 13.5,4.5
+ parent: 2
+ - uid: 229
+ components:
+ - type: Transform
+ rot: 3.141592653589793 rad
+ pos: 13.5,5.5
+ parent: 2
+ - uid: 272
+ components:
+ - type: Transform
+ pos: 10.5,-28.5
+ parent: 2
+ - uid: 282
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 13.5,-11.5
+ parent: 2
+ - uid: 286
+ components:
+ - type: Transform
+ pos: -2.5,-24.5
+ parent: 2
+ - uid: 291
+ components:
+ - type: Transform
+ pos: -2.5,-28.5
+ parent: 2
+ - uid: 303
+ components:
+ - type: Transform
+ pos: 4.5,7.5
+ parent: 2
+ - uid: 304
+ components:
+ - type: Transform
+ pos: 3.5,7.5
+ parent: 2
+ - uid: 306
+ components:
+ - type: Transform
+ pos: 6.5,7.5
+ parent: 2
+ - uid: 307
+ components:
+ - type: Transform
+ pos: 5.5,7.5
+ parent: 2
+ - uid: 312
+ components:
+ - type: Transform
+ pos: 7.5,7.5
+ parent: 2
+ - uid: 349
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -1.5,-1.5
+ parent: 2
+ - uid: 350
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -1.5,-7.5
+ parent: 2
+ - uid: 351
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 12.5,-7.5
+ parent: 2
+ - uid: 352
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 12.5,-1.5
+ parent: 2
+ - uid: 373
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -2.5,-12.5
+ parent: 2
+ - uid: 379
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 13.5,-19.5
+ parent: 2
+ - uid: 514
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -2.5,-16.5
+ parent: 2
+ - uid: 516
+ components:
+ - type: Transform
+ pos: 13.5,-27.5
+ parent: 2
+ - uid: 527
+ components:
+ - type: Transform
+ pos: -0.5,-28.5
+ parent: 2
+ - uid: 556
+ components:
+ - type: Transform
+ pos: 13.5,-21.5
+ parent: 2
+ - uid: 569
+ components:
+ - type: Transform
+ rot: 3.141592653589793 rad
+ pos: -1.5,-4.5
+ parent: 2
+ - uid: 570
+ components:
+ - type: Transform
+ pos: 13.5,-24.5
+ parent: 2
+ - uid: 572
+ components:
+ - type: Transform
+ rot: 3.141592653589793 rad
+ pos: 12.5,-4.5
+ parent: 2
+ - uid: 624
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -2.5,-19.5
+ parent: 2
+ - uid: 625
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -2.5,-14.5
+ parent: 2
+ - uid: 626
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -2.5,-11.5
+ parent: 2
+ - uid: 627
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 13.5,-12.5
+ parent: 2
+ - uid: 737
+ components:
+ - type: Transform
+ pos: 9.5,-28.5
+ parent: 2
+ - uid: 750
+ components:
+ - type: Transform
+ pos: -2.5,-27.5
+ parent: 2
+ - uid: 787
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -2.5,-18.5
+ parent: 2
+ - uid: 788
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -2.5,-10.5
+ parent: 2
+ - uid: 791
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 13.5,-10.5
+ parent: 2
+ - uid: 792
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 13.5,-16.5
+ parent: 2
+ - uid: 798
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 13.5,-17.5
+ parent: 2
+ - uid: 814
+ components:
+ - type: Transform
+ pos: 13.5,-28.5
+ parent: 2
+ - uid: 820
+ components:
+ - type: Transform
+ pos: -2.5,-25.5
+ parent: 2
+ - uid: 821
+ components:
+ - type: Transform
+ pos: -2.5,-22.5
+ parent: 2
+ - uid: 823
+ components:
+ - type: Transform
+ pos: 0.5,-28.5
+ parent: 2
+ - uid: 826
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 13.5,-18.5
+ parent: 2
+ - uid: 827
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 13.5,-14.5
+ parent: 2
+ - uid: 847
+ components:
+ - type: Transform
+ pos: 13.5,-26.5
+ parent: 2
+ - uid: 862
+ components:
+ - type: Transform
+ pos: 13.5,-23.5
+ parent: 2
+ - uid: 876
+ components:
+ - type: Transform
+ pos: -1.5,9.5
+ parent: 2
+ - uid: 877
+ components:
+ - type: Transform
+ pos: -0.5,9.5
+ parent: 2
+ - uid: 878
+ components:
+ - type: Transform
+ pos: 1.5,9.5
+ parent: 2
+ - uid: 879
+ components:
+ - type: Transform
+ pos: 0.5,9.5
+ parent: 2
+ - uid: 880
+ components:
+ - type: Transform
+ pos: 3.5,9.5
+ parent: 2
+ - uid: 881
+ components:
+ - type: Transform
+ pos: 5.5,9.5
+ parent: 2
+ - uid: 882
+ components:
+ - type: Transform
+ pos: 7.5,9.5
+ parent: 2
+ - uid: 883
+ components:
+ - type: Transform
+ pos: 8.5,9.5
+ parent: 2
+ - uid: 884
+ components:
+ - type: Transform
+ pos: 10.5,9.5
+ parent: 2
+ - uid: 885
+ components:
+ - type: Transform
+ pos: 9.5,9.5
+ parent: 2
+ - uid: 886
+ components:
+ - type: Transform
+ pos: 12.5,9.5
+ parent: 2
+- proto: GrilleSpawner
+ entities:
+ - uid: 277
+ components:
+ - type: Transform
+ pos: 11.5,-28.5
+ parent: 2
+ - uid: 382
+ components:
+ - type: Transform
+ pos: 13.5,-13.5
+ parent: 2
+ - uid: 517
+ components:
+ - type: Transform
+ pos: -2.5,-26.5
parent: 2
- - uid: 225
+ - uid: 631
components:
- type: Transform
- pos: 2.5,-13.5
+ pos: -2.5,-15.5
parent: 2
- - uid: 228
+ - uid: 632
components:
- type: Transform
- rot: 3.141592653589793 rad
- pos: 13.5,4.5
+ pos: -2.5,-17.5
parent: 2
- - uid: 229
+ - uid: 754
components:
- type: Transform
- rot: 3.141592653589793 rad
- pos: 13.5,5.5
+ pos: -2.5,-21.5
parent: 2
- - uid: 303
+ - uid: 755
components:
- type: Transform
- pos: 4.5,7.5
+ pos: 13.5,-25.5
parent: 2
- - uid: 304
+ - uid: 756
components:
- type: Transform
- pos: 3.5,7.5
+ pos: 13.5,-22.5
parent: 2
- - uid: 306
+ - uid: 797
components:
- type: Transform
- pos: 6.5,7.5
+ pos: 13.5,-15.5
parent: 2
- - uid: 307
+ - uid: 799
components:
- type: Transform
- pos: 5.5,7.5
+ pos: -2.5,-13.5
parent: 2
- - uid: 312
+ - uid: 815
components:
- type: Transform
- pos: 7.5,7.5
+ pos: 1.5,-28.5
parent: 2
- - uid: 349
+ - uid: 822
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: -1.5,-1.5
+ pos: -2.5,-23.5
parent: 2
- - uid: 350
+ - uid: 887
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: -1.5,-7.5
+ pos: 2.5,9.5
parent: 2
- - uid: 351
+ - uid: 888
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: 12.5,-7.5
+ pos: 4.5,9.5
parent: 2
- - uid: 352
+ - uid: 889
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: 12.5,-1.5
+ pos: 6.5,9.5
parent: 2
- - uid: 569
+ - uid: 890
components:
- type: Transform
- rot: 3.141592653589793 rad
- pos: -1.5,-4.5
+ pos: 11.5,9.5
parent: 2
- - uid: 572
+- proto: Gyroscope
+ entities:
+ - uid: 816
components:
- type: Transform
- rot: 3.141592653589793 rad
- pos: 12.5,-4.5
+ pos: 1.5,-15.5
parent: 2
-- proto: Gyroscope
+- proto: Lamp
entities:
- - uid: 383
+ - uid: 774
components:
- type: Transform
rot: -1.5707963267948966 rad
- pos: 0.5,-15.5
+ pos: 9.59808,-15.833403
parent: 2
- proto: LiquidNitrogenCanister
entities:
@@ -3325,6 +4237,23 @@ entities:
parent: 2
- type: AtmosDevice
joinedGrid: 2
+- proto: Paper
+ entities:
+ - uid: 775
+ components:
+ - type: Transform
+ pos: 9.61031,-16.5917
+ parent: 2
+ - uid: 776
+ components:
+ - type: Transform
+ pos: 9.488004,-16.738466
+ parent: 2
+ - uid: 777
+ components:
+ - type: Transform
+ pos: 9.341236,-16.909695
+ parent: 2
- proto: PlasmaReinforcedWindowDirectional
entities:
- uid: 388
@@ -3431,10 +4360,12 @@ entities:
- type: Transform
pos: 10.5,4.5
parent: 2
- - uid: 392
+- proto: PowerCellRecharger
+ entities:
+ - uid: 773
components:
- type: Transform
- pos: 9.5,-17.5
+ pos: 9.5,-15.5
parent: 2
- proto: Poweredlight
entities:
@@ -3559,12 +4490,6 @@ entities:
parent: 2
- proto: Railing
entities:
- - uid: 286
- components:
- - type: Transform
- rot: -1.5707963267948966 rad
- pos: 1.5,4.5
- parent: 2
- uid: 287
components:
- type: Transform
@@ -3583,6 +4508,12 @@ entities:
rot: 1.5707963267948966 rad
pos: 9.5,4.5
parent: 2
+ - uid: 293
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 1.5,4.5
+ parent: 2
- uid: 325
components:
- type: Transform
@@ -3606,24 +4537,12 @@ entities:
rot: 3.141592653589793 rad
pos: 3.5,5.5
parent: 2
- - uid: 291
- components:
- - type: Transform
- rot: 3.141592653589793 rad
- pos: 9.5,5.5
- parent: 2
- uid: 292
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 7.5,5.5
parent: 2
- - uid: 293
- components:
- - type: Transform
- rot: 1.5707963267948966 rad
- pos: 1.5,5.5
- parent: 2
- proto: RandomPosterLegit
entities:
- uid: 518
@@ -3959,68 +4878,284 @@ entities:
- uid: 807
components:
- type: Transform
- pos: 0.5,7.5
+ pos: 0.5,7.5
+ parent: 2
+ - type: DeviceLinkSource
+ linkedPorts:
+ 808:
+ - Pressed: Toggle
+ 809:
+ - Pressed: Toggle
+ 810:
+ - Pressed: Toggle
+ 811:
+ - Pressed: Toggle
+ 812:
+ - Pressed: Toggle
+ 813:
+ - Pressed: Toggle
+- proto: SignSecureMed
+ entities:
+ - uid: 144
+ components:
+ - type: Transform
+ rot: 3.141592653589793 rad
+ pos: 5.5,-8.5
+ parent: 2
+ - uid: 145
+ components:
+ - type: Transform
+ rot: 3.141592653589793 rad
+ pos: 5.5,-0.5
+ parent: 2
+- proto: SignShipDock
+ entities:
+ - uid: 945
+ components:
+ - type: Transform
+ pos: -2.5,-4.5
+ parent: 2
+ - uid: 946
+ components:
+ - type: Transform
+ pos: 13.5,-4.5
+ parent: 2
+- proto: SignSpace
+ entities:
+ - uid: 341
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -0.5,-1.5
+ parent: 2
+ - uid: 342
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 11.5,-1.5
+ parent: 2
+ - uid: 343
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 11.5,-7.5
+ parent: 2
+ - uid: 344
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -0.5,-7.5
+ parent: 2
+- proto: SMESBasic
+ entities:
+ - uid: 380
+ components:
+ - type: Transform
+ pos: 3.5,-17.5
+ parent: 2
+- proto: SolarPanel
+ entities:
+ - uid: 280
+ components:
+ - type: Transform
+ pos: 3.5,-24.5
+ parent: 2
+ - uid: 281
+ components:
+ - type: Transform
+ pos: 1.5,-24.5
+ parent: 2
+ - uid: 530
+ components:
+ - type: Transform
+ pos: 6.5,-20.5
+ parent: 2
+ - uid: 531
+ components:
+ - type: Transform
+ pos: 8.5,-20.5
+ parent: 2
+ - uid: 532
+ components:
+ - type: Transform
+ pos: 10.5,-20.5
+ parent: 2
+ - uid: 534
+ components:
+ - type: Transform
+ pos: 0.5,-26.5
+ parent: 2
+ - uid: 535
+ components:
+ - type: Transform
+ pos: 9.5,-24.5
+ parent: 2
+ - uid: 536
+ components:
+ - type: Transform
+ pos: 10.5,-22.5
+ parent: 2
+ - uid: 537
+ components:
+ - type: Transform
+ pos: 7.5,-24.5
+ parent: 2
+ - uid: 561
+ components:
+ - type: Transform
+ pos: 9.5,-26.5
+ parent: 2
+ - uid: 564
+ components:
+ - type: Transform
+ pos: 7.5,-20.5
+ parent: 2
+ - uid: 565
+ components:
+ - type: Transform
+ pos: 6.5,-26.5
+ parent: 2
+ - uid: 566
+ components:
+ - type: Transform
+ pos: 10.5,-24.5
+ parent: 2
+ - uid: 567
+ components:
+ - type: Transform
+ pos: 1.5,-26.5
+ parent: 2
+ - uid: 568
+ components:
+ - type: Transform
+ pos: 7.5,-22.5
+ parent: 2
+ - uid: 649
+ components:
+ - type: Transform
+ pos: 4.5,-26.5
+ parent: 2
+ - uid: 650
+ components:
+ - type: Transform
+ pos: 2.5,-24.5
+ parent: 2
+ - uid: 839
+ components:
+ - type: Transform
+ pos: 8.5,-24.5
+ parent: 2
+ - uid: 842
+ components:
+ - type: Transform
+ pos: 10.5,-26.5
+ parent: 2
+ - uid: 843
+ components:
+ - type: Transform
+ pos: 7.5,-26.5
+ parent: 2
+ - uid: 844
+ components:
+ - type: Transform
+ pos: 8.5,-26.5
+ parent: 2
+ - uid: 845
+ components:
+ - type: Transform
+ pos: 9.5,-20.5
+ parent: 2
+ - uid: 851
+ components:
+ - type: Transform
+ pos: 2.5,-26.5
+ parent: 2
+ - uid: 852
+ components:
+ - type: Transform
+ pos: 3.5,-26.5
+ parent: 2
+ - uid: 853
+ components:
+ - type: Transform
+ pos: 9.5,-22.5
+ parent: 2
+ - uid: 854
+ components:
+ - type: Transform
+ pos: 8.5,-22.5
+ parent: 2
+ - uid: 866
+ components:
+ - type: Transform
+ pos: 0.5,-24.5
+ parent: 2
+ - uid: 867
+ components:
+ - type: Transform
+ pos: 3.5,-22.5
+ parent: 2
+ - uid: 868
+ components:
+ - type: Transform
+ pos: 1.5,-22.5
+ parent: 2
+ - uid: 869
+ components:
+ - type: Transform
+ pos: 2.5,-22.5
+ parent: 2
+ - uid: 870
+ components:
+ - type: Transform
+ pos: 0.5,-20.5
+ parent: 2
+ - uid: 871
+ components:
+ - type: Transform
+ pos: 2.5,-20.5
+ parent: 2
+ - uid: 872
+ components:
+ - type: Transform
+ pos: 3.5,-20.5
parent: 2
- - type: DeviceLinkSource
- linkedPorts:
- 808:
- - Pressed: Toggle
- 809:
- - Pressed: Toggle
- 810:
- - Pressed: Toggle
- 811:
- - Pressed: Toggle
- 812:
- - Pressed: Toggle
- 813:
- - Pressed: Toggle
-- proto: SignSecureMed
- entities:
- - uid: 144
+ - uid: 873
components:
- type: Transform
- rot: 3.141592653589793 rad
- pos: 5.5,-8.5
+ pos: 4.5,-20.5
parent: 2
- - uid: 145
+ - uid: 891
components:
- type: Transform
- rot: 3.141592653589793 rad
- pos: 5.5,-0.5
+ pos: 0.5,-22.5
parent: 2
-- proto: SignSpace
- entities:
- - uid: 341
+ - uid: 892
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: -0.5,-1.5
+ pos: 1.5,-20.5
parent: 2
- - uid: 342
+- proto: SolarTracker
+ entities:
+ - uid: 198
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: 11.5,-1.5
+ pos: 4.5,-22.5
parent: 2
- - uid: 343
+ - uid: 874
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: 11.5,-7.5
+ pos: 6.5,-22.5
parent: 2
- - uid: 344
+ - uid: 875
components:
- type: Transform
- rot: 1.5707963267948966 rad
- pos: -0.5,-7.5
+ pos: 4.5,-24.5
parent: 2
-- proto: SMESBasic
- entities:
- - uid: 380
+ - uid: 893
components:
- type: Transform
- pos: 3.5,-17.5
+ pos: 6.5,-24.5
parent: 2
- proto: SubstationBasic
entities:
@@ -4067,6 +5202,50 @@ entities:
rot: 1.5707963267948966 rad
pos: 8.5,4.5
parent: 2
+- proto: TableReinforced
+ entities:
+ - uid: 769
+ components:
+ - type: Transform
+ rot: 3.141592653589793 rad
+ pos: 9.5,-15.5
+ parent: 2
+ - uid: 770
+ components:
+ - type: Transform
+ rot: 3.141592653589793 rad
+ pos: 9.5,-16.5
+ parent: 2
+ - uid: 771
+ components:
+ - type: Transform
+ rot: 3.141592653589793 rad
+ pos: 9.5,-17.5
+ parent: 2
+ - uid: 896
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 4.5,-3.5
+ parent: 2
+ - uid: 897
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 4.5,-5.5
+ parent: 2
+ - uid: 898
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 6.5,-3.5
+ parent: 2
+ - uid: 899
+ components:
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 6.5,-5.5
+ parent: 2
- proto: TwoWayLever
entities:
- uid: 365
@@ -4184,6 +5363,22 @@ entities:
- type: Transform
pos: 5.5,-8.5
parent: 2
+ - uid: 28
+ components:
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 10.5,-15.5
+ parent: 2
+ - uid: 29
+ components:
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 10.5,-16.5
+ parent: 2
- uid: 74
components:
- type: MetaData
@@ -4554,14 +5749,6 @@ entities:
rot: 3.141592653589793 rad
pos: -2.5,6.5
parent: 2
- - uid: 183
- components:
- - type: MetaData
- flags: PvsPriority
- - type: Transform
- rot: 3.141592653589793 rad
- pos: 0.5,-14.5
- parent: 2
- uid: 184
components:
- type: MetaData
@@ -4602,22 +5789,6 @@ entities:
rot: 3.141592653589793 rad
pos: 7.5,-14.5
parent: 2
- - uid: 190
- components:
- - type: MetaData
- flags: PvsPriority
- - type: Transform
- rot: 3.141592653589793 rad
- pos: 11.5,-14.5
- parent: 2
- - uid: 191
- components:
- - type: MetaData
- flags: PvsPriority
- - type: Transform
- rot: 3.141592653589793 rad
- pos: 10.5,-14.5
- parent: 2
- uid: 192
components:
- type: MetaData
@@ -4633,38 +5804,6 @@ entities:
- type: Transform
pos: 2.5,-12.5
parent: 2
- - uid: 198
- components:
- - type: MetaData
- flags: PvsPriority
- - type: Transform
- rot: 3.141592653589793 rad
- pos: -0.5,-14.5
- parent: 2
- - uid: 199
- components:
- - type: MetaData
- flags: PvsPriority
- - type: Transform
- rot: 3.141592653589793 rad
- pos: -0.5,-15.5
- parent: 2
- - uid: 200
- components:
- - type: MetaData
- flags: PvsPriority
- - type: Transform
- rot: 3.141592653589793 rad
- pos: -0.5,-16.5
- parent: 2
- - uid: 201
- components:
- - type: MetaData
- flags: PvsPriority
- - type: Transform
- rot: 3.141592653589793 rad
- pos: -0.5,-17.5
- parent: 2
- uid: 202
components:
- type: MetaData
@@ -4737,46 +5876,6 @@ entities:
rot: 3.141592653589793 rad
pos: 9.5,-18.5
parent: 2
- - uid: 211
- components:
- - type: MetaData
- flags: PvsPriority
- - type: Transform
- rot: 3.141592653589793 rad
- pos: 10.5,-18.5
- parent: 2
- - uid: 212
- components:
- - type: MetaData
- flags: PvsPriority
- - type: Transform
- rot: 3.141592653589793 rad
- pos: 10.5,-17.5
- parent: 2
- - uid: 213
- components:
- - type: MetaData
- flags: PvsPriority
- - type: Transform
- rot: 3.141592653589793 rad
- pos: 11.5,-17.5
- parent: 2
- - uid: 214
- components:
- - type: MetaData
- flags: PvsPriority
- - type: Transform
- rot: 3.141592653589793 rad
- pos: 11.5,-16.5
- parent: 2
- - uid: 215
- components:
- - type: MetaData
- flags: PvsPriority
- - type: Transform
- rot: 3.141592653589793 rad
- pos: 11.5,-15.5
- parent: 2
- uid: 217
components:
- type: MetaData
@@ -4792,14 +5891,6 @@ entities:
rot: 3.141592653589793 rad
pos: 0.5,-18.5
parent: 2
- - uid: 221
- components:
- - type: MetaData
- flags: PvsPriority
- - type: Transform
- rot: 3.141592653589793 rad
- pos: 0.5,-17.5
- parent: 2
- uid: 230
components:
- type: MetaData
@@ -4910,6 +6001,62 @@ entities:
rot: 1.5707963267948966 rad
pos: 13.5,-1.5
parent: 2
+ - uid: 372
+ components:
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 0.5,-17.5
+ parent: 2
+ - uid: 374
+ components:
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 10.5,-14.5
+ parent: 2
+ - uid: 375
+ components:
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 0.5,-16.5
+ parent: 2
+ - uid: 376
+ components:
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 0.5,-15.5
+ parent: 2
+ - uid: 377
+ components:
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 0.5,-14.5
+ parent: 2
+ - uid: 378
+ components:
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 10.5,-18.5
+ parent: 2
+ - uid: 515
+ components:
+ - type: MetaData
+ flags: PvsPriority
+ - type: Transform
+ rot: -1.5707963267948966 rad
+ pos: 10.5,-17.5
+ parent: 2
- uid: 553
components:
- type: MetaData
@@ -4940,4 +6087,11 @@ entities:
rot: 1.5707963267948966 rad
pos: 3.5,-17.5
parent: 2
+- proto: Wrench
+ entities:
+ - uid: 23
+ components:
+ - type: Transform
+ pos: 4.301509,-15.756044
+ parent: 2
...
From fa3e17de860e290d059e93d90e59a87fceb31444 Mon Sep 17 00:00:00 2001
From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Date: Fri, 19 Jan 2024 20:32:33 +1100
Subject: [PATCH 05/43] Clear cargo orders on approval (#24278)
(cherry picked from commit f82fd23f2c87b7cab852bdc2563cfa30c2d2a6dd)
---
Content.Server/Cargo/Systems/CargoSystem.Orders.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
index 3b1a55ed4f7..c1a20e19b0b 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
@@ -216,6 +216,7 @@ private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent com
_adminLogger.Add(LogType.Action, LogImpact.Low,
$"{ToPrettyString(player):user} approved order [orderId:{order.OrderId}, quantity:{order.OrderQuantity}, product:{order.ProductId}, requester:{order.Requester}, reason:{order.Reason}] with balance at {bank.Balance}");
+ orderDatabase.Orders.Remove(order);
DeductFunds(bank, cost);
UpdateOrders(station.Value, orderDatabase);
}
From 0f8546794955b2a20fa643fe9d2062697b473d58 Mon Sep 17 00:00:00 2001
From: Ubaser <134914314+UbaserB@users.noreply.github.com>
Date: Sat, 20 Jan 2024 07:41:00 +1100
Subject: [PATCH 06/43] Update Trade Station (#24295)
add
(cherry picked from commit 00e770d4dc68f98ecc8a3ef1605277fc2c59fb8f)
---
Resources/Maps/Shuttles/trading_outpost.yml | 165 +++++++++++++++-----
1 file changed, 130 insertions(+), 35 deletions(-)
diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml
index 2b7528be89f..f698c2d1454 100644
--- a/Resources/Maps/Shuttles/trading_outpost.yml
+++ b/Resources/Maps/Shuttles/trading_outpost.yml
@@ -31,19 +31,19 @@ entities:
chunks:
0,0:
ind: 0,0
- tiles: WQAAAAABWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAAAWQAAAAADWQAAAAAAWQAAAAABWQAAAAADWQAAAAAAIgAAAAABJQAAAAADeQAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAIgAAAAAAIgAAAAABIgAAAAAAIgAAAAAAIgAAAAACIgAAAAABIgAAAAAAIgAAAAAAIgAAAAABIgAAAAACeQAAAAAAIgAAAAACeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAIgAAAAADeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdwAAAAABdwAAAAADdwAAAAACMQAAAAAAMQAAAAAAMQAAAAAAdwAAAAADdwAAAAABdwAAAAABdgAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAADdwAAAAABdwAAAAADdwAAAAADdgAAAAADdgAAAAACdgAAAAADdwAAAAAAdwAAAAABdwAAAAAAdgAAAAACIgAAAAADJQAAAAACeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdgAAAAABdgAAAAACdgAAAAABdgAAAAAAdgAAAAACdgAAAAAAdgAAAAAAdgAAAAABdgAAAAADdgAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: WQAAAAABWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAAAWQAAAAADWQAAAAAAWQAAAAABWQAAAAADWQAAAAAAIgAAAAABJQAAAAADeQAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAIgAAAAAAIgAAAAABIgAAAAAAIgAAAAAAIgAAAAACIgAAAAABIgAAAAAAIgAAAAAAIgAAAAABIgAAAAACeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdwAAAAABdwAAAAADdwAAAAACMQAAAAAAMQAAAAAAMQAAAAAAdwAAAAADdwAAAAABdwAAAAABdgAAAAACeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAADdwAAAAABdwAAAAADdwAAAAADdgAAAAADdgAAAAACdgAAAAADdwAAAAAAdwAAAAABdwAAAAAAdgAAAAACIgAAAAADJQAAAAACeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdgAAAAABdgAAAAACdgAAAAABdgAAAAAAdgAAAAACdgAAAAAAdgAAAAAAdgAAAAABdgAAAAADdgAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
0,-1:
ind: 0,-1
- tiles: eQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAIgAAAAAAeQAAAAAAeQAAAAAAIgAAAAABIgAAAAABHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAABIgAAAAACIgAAAAAAIgAAAAAAIgAAAAABIgAAAAABIgAAAAACIgAAAAAAIgAAAAACeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAAAWQAAAAACWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAACWQAAAAABWQAAAAABeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAADWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAACZAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAABaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAAAZAAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAADWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAABZAAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAADTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAABWQAAAAACTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADZAAAAAADeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: eQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAIgAAAAAAeQAAAAAAeQAAAAAAIgAAAAABIgAAAAABHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAABIgAAAAACIgAAAAAAIgAAAAAAIgAAAAABIgAAAAABIgAAAAACIgAAAAAAIgAAAAACeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAAAWQAAAAACWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAACWQAAAAABWQAAAAABeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAADWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAACZAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAABaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAAAZAAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAADWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAABZAAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAADTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAABWQAAAAACTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADZAAAAAADeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA
version: 6
-1,0:
ind: -1,0
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAACIgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAADeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAADeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAADIgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAACIgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAADIgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
-1,-1:
ind: -1,-1
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAA
version: 6
0,-2:
ind: 0,-2
@@ -73,6 +73,20 @@ entities:
chunkCollection:
version: 2
nodes:
+ - node:
+ angle: -1.5707963267948966 rad
+ color: '#FFFFFFFF'
+ id: Arrows
+ decals:
+ 71: 12,-6
+ 72: 12,-4
+ - node:
+ angle: 1.5707963267948966 rad
+ color: '#FFFFFFFF'
+ id: Arrows
+ decals:
+ 69: -2,-4
+ 70: -2,-6
- node:
color: '#FFFFFFFF'
id: Bot
@@ -443,8 +457,11 @@ entities:
- uid: 387
components:
- type: Transform
+ anchored: True
pos: 4.5,-15.5
parent: 2
+ - type: Physics
+ bodyType: Static
- type: AtmosDevice
joinedGrid: 2
- proto: AirlockCargo
@@ -501,31 +518,31 @@ entities:
rot: 3.141592653589793 rad
pos: 11.5,-3.5
parent: 2
-- proto: AirlockGlassShuttle
+- proto: AirlockExternalGlassShuttleLocked
entities:
- - uid: 586
+ - uid: 313
components:
- type: Transform
rot: -1.5707963267948966 rad
- pos: -2.5,-5.5
+ pos: -2.5,-3.5
parent: 2
- - uid: 587
+ - uid: 560
components:
- type: Transform
rot: -1.5707963267948966 rad
- pos: -2.5,-3.5
+ pos: -2.5,-5.5
parent: 2
- - uid: 588
+ - uid: 562
components:
- type: Transform
rot: 1.5707963267948966 rad
- pos: 13.5,-5.5
+ pos: 13.5,-3.5
parent: 2
- - uid: 589
+ - uid: 563
components:
- type: Transform
rot: 1.5707963267948966 rad
- pos: 13.5,-3.5
+ pos: 13.5,-5.5
parent: 2
- proto: AirSensor
entities:
@@ -582,6 +599,48 @@ entities:
- type: Transform
pos: 2.5,-14.5
parent: 2
+- proto: AtmosDeviceFanTiny
+ entities:
+ - uid: 947
+ components:
+ - type: Transform
+ pos: 13.5,-5.5
+ parent: 2
+ - uid: 948
+ components:
+ - type: Transform
+ pos: 13.5,-3.5
+ parent: 2
+ - uid: 949
+ components:
+ - type: Transform
+ pos: 13.5,-2.5
+ parent: 2
+ - uid: 950
+ components:
+ - type: Transform
+ pos: 13.5,-6.5
+ parent: 2
+ - uid: 951
+ components:
+ - type: Transform
+ pos: -2.5,-6.5
+ parent: 2
+ - uid: 952
+ components:
+ - type: Transform
+ pos: -2.5,-5.5
+ parent: 2
+ - uid: 953
+ components:
+ - type: Transform
+ pos: -2.5,-3.5
+ parent: 2
+ - uid: 954
+ components:
+ - type: Transform
+ pos: -2.5,-2.5
+ parent: 2
- proto: BoxFolderClipboard
entities:
- uid: 779
@@ -2263,11 +2322,6 @@ entities:
rot: 1.5707963267948966 rad
pos: -1.5,2.5
parent: 2
- - uid: 313
- components:
- - type: Transform
- pos: -1.5,-3.5
- parent: 2
- uid: 528
components:
- type: Transform
@@ -2328,43 +2382,49 @@ entities:
- type: Transform
pos: 0.5,-26.5
parent: 2
- - uid: 560
+ - uid: 571
components:
- type: Transform
- rot: 3.141592653589793 rad
- pos: -1.5,-5.5
+ pos: 8.5,-20.5
parent: 2
- - uid: 562
+ - uid: 573
components:
- type: Transform
- rot: 3.141592653589793 rad
- pos: 12.5,-3.5
+ pos: 10.5,-20.5
parent: 2
- - uid: 563
+ - uid: 578
components:
- type: Transform
- rot: 3.141592653589793 rad
- pos: 12.5,-5.5
+ pos: 9.5,-26.5
parent: 2
- - uid: 571
+ - uid: 579
components:
- type: Transform
- pos: 8.5,-20.5
+ pos: 10.5,-24.5
parent: 2
- - uid: 573
+ - uid: 586
components:
- type: Transform
- pos: 10.5,-20.5
+ rot: 1.5707963267948966 rad
+ pos: 13.5,-3.5
parent: 2
- - uid: 578
+ - uid: 587
components:
- type: Transform
- pos: 9.5,-26.5
+ rot: 1.5707963267948966 rad
+ pos: 13.5,-5.5
parent: 2
- - uid: 579
+ - uid: 588
components:
- type: Transform
- pos: 10.5,-24.5
+ rot: 1.5707963267948966 rad
+ pos: 11.5,-5.5
+ parent: 2
+ - uid: 589
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: 11.5,-3.5
parent: 2
- uid: 596
components:
@@ -2466,6 +2526,30 @@ entities:
- type: Transform
pos: 10.5,-26.5
parent: 2
+ - uid: 956
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -0.5,-3.5
+ parent: 2
+ - uid: 957
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -0.5,-5.5
+ parent: 2
+ - uid: 958
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -2.5,-5.5
+ parent: 2
+ - uid: 959
+ components:
+ - type: Transform
+ rot: 1.5707963267948966 rad
+ pos: -2.5,-3.5
+ parent: 2
- proto: Chair
entities:
- uid: 38
@@ -4877,6 +4961,8 @@ entities:
entities:
- uid: 807
components:
+ - type: MetaData
+ name: shutters button
- type: Transform
pos: 0.5,7.5
parent: 2
@@ -6065,6 +6151,15 @@ entities:
rot: 3.141592653589793 rad
pos: -2.5,-4.5
parent: 2
+- proto: WarpPoint
+ entities:
+ - uid: 955
+ components:
+ - type: Transform
+ pos: 5.5,-4.5
+ parent: 2
+ - type: WarpPoint
+ location: Automated Trade Station
- proto: WindoorSecureEngineeringLocked
entities:
- uid: 371
From 5c7b5ac2808e5efae830357732f9c3a81f01918a Mon Sep 17 00:00:00 2001
From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Date: Thu, 25 Jan 2024 17:54:42 +1100
Subject: [PATCH 07/43] Resave trading outpost (#24536)
Removes metadata merge alongside https://github.com/space-wizards/RobustToolbox/pull/4861
(cherry picked from commit 6ae45378715b9f8fc843a28b762f8b785330f28d)
---
Resources/Maps/Shuttles/trading_outpost.yml | 224 --------------------
1 file changed, 224 deletions(-)
diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml
index f698c2d1454..a10f070bd25 100644
--- a/Resources/Maps/Shuttles/trading_outpost.yml
+++ b/Resources/Maps/Shuttles/trading_outpost.yml
@@ -468,15 +468,11 @@ entities:
entities:
- uid: 1
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 11.5,1.5
parent: 2
- uid: 22
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: -0.5,1.5
parent: 2
@@ -574,15 +570,11 @@ entities:
entities:
- uid: 541
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 3.5,-19.5
parent: 2
- uid: 576
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 7.5,-19.5
parent: 2
@@ -4455,95 +4447,71 @@ entities:
entities:
- uid: 119
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: -1.5707963267948966 rad
pos: 4.5,-0.5
parent: 2
- uid: 120
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: 6.5,-0.5
parent: 2
- uid: 121
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: 6.5,-8.5
parent: 2
- uid: 122
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: -1.5707963267948966 rad
pos: 4.5,-8.5
parent: 2
- uid: 123
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 5.5,-11.5
parent: 2
- uid: 124
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 5.5,2.5
parent: 2
- uid: 216
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 2.5,-17.5
parent: 2
- uid: 219
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 8.5,-17.5
parent: 2
- uid: 231
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: 0.5,6.5
parent: 2
- uid: 232
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: -1.5707963267948966 rad
pos: 10.5,6.5
parent: 2
- uid: 233
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: -1.5707963267948966 rad
pos: -1.5,3.5
parent: 2
- uid: 234
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: 12.5,3.5
@@ -5430,723 +5398,531 @@ entities:
entities:
- uid: 4
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 5.5,0.5
parent: 2
- uid: 5
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 5.5,-0.5
parent: 2
- uid: 6
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 5.5,-8.5
parent: 2
- uid: 28
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: -1.5707963267948966 rad
pos: 10.5,-15.5
parent: 2
- uid: 29
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: -1.5707963267948966 rad
pos: 10.5,-16.5
parent: 2
- uid: 74
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 5.5,-9.5
parent: 2
- uid: 76
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 11.5,2.5
parent: 2
- uid: 78
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 11.5,0.5
parent: 2
- uid: 79
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 11.5,-0.5
parent: 2
- uid: 80
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 11.5,-1.5
parent: 2
- uid: 83
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 11.5,-4.5
parent: 2
- uid: 85
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 11.5,-7.5
parent: 2
- uid: 87
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 11.5,-8.5
parent: 2
- uid: 88
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 11.5,-9.5
parent: 2
- uid: 89
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 11.5,-10.5
parent: 2
- uid: 90
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 11.5,-11.5
parent: 2
- uid: 91
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 10.5,-11.5
parent: 2
- uid: 92
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 10.5,-12.5
parent: 2
- uid: 93
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 9.5,-12.5
parent: 2
- uid: 95
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 7.5,-12.5
parent: 2
- uid: 96
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 6.5,-12.5
parent: 2
- uid: 97
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 5.5,-12.5
parent: 2
- uid: 98
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 4.5,-12.5
parent: 2
- uid: 101
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 1.5,-12.5
parent: 2
- uid: 102
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 0.5,-12.5
parent: 2
- uid: 103
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 0.5,-11.5
parent: 2
- uid: 104
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: -0.5,-11.5
parent: 2
- uid: 105
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: -0.5,-10.5
parent: 2
- uid: 106
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: -0.5,-8.5
parent: 2
- uid: 107
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: -0.5,-7.5
parent: 2
- uid: 109
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: -0.5,-9.5
parent: 2
- uid: 111
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 13.5,-4.5
parent: 2
- uid: 113
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: -0.5,-4.5
parent: 2
- uid: 114
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: -0.5,-1.5
parent: 2
- uid: 115
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: -0.5,-0.5
parent: 2
- uid: 116
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: -0.5,0.5
parent: 2
- uid: 117
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 3.5,-12.5
parent: 2
- uid: 118
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: -0.5,2.5
parent: 2
- uid: 125
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 11.5,3.5
parent: 2
- uid: 126
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 10.5,3.5
parent: 2
- uid: 130
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 6.5,3.5
parent: 2
- uid: 131
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 5.5,3.5
parent: 2
- uid: 132
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 4.5,3.5
parent: 2
- uid: 136
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 0.5,3.5
parent: 2
- uid: 137
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: -0.5,3.5
parent: 2
- uid: 141
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 3.5,-14.5
parent: 2
- uid: 172
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: -2.5,0.5
parent: 2
- uid: 173
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 13.5,0.5
parent: 2
- uid: 174
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: -0.5,4.5
parent: 2
- uid: 175
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 13.5,6.5
parent: 2
- uid: 176
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 12.5,6.5
parent: 2
- uid: 177
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 11.5,6.5
parent: 2
- uid: 178
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 11.5,4.5
parent: 2
- uid: 179
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: -0.5,6.5
parent: 2
- uid: 180
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: -1.5,6.5
parent: 2
- uid: 181
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: -2.5,6.5
parent: 2
- uid: 184
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 1.5,-14.5
parent: 2
- uid: 186
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 4.5,-14.5
parent: 2
- uid: 187
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 5.5,-14.5
parent: 2
- uid: 188
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 6.5,-14.5
parent: 2
- uid: 189
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 7.5,-14.5
parent: 2
- uid: 192
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 9.5,-14.5
parent: 2
- uid: 193
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 2.5,-12.5
parent: 2
- uid: 202
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 1.5,-18.5
parent: 2
- uid: 203
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 2.5,-18.5
parent: 2
- uid: 204
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 3.5,-18.5
parent: 2
- uid: 205
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 4.5,-18.5
parent: 2
- uid: 206
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 5.5,-18.5
parent: 2
- uid: 207
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 6.5,-18.5
parent: 2
- uid: 208
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 7.5,-18.5
parent: 2
- uid: 209
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 8.5,-18.5
parent: 2
- uid: 210
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 9.5,-18.5
parent: 2
- uid: 217
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 8.5,-12.5
parent: 2
- uid: 220
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: 0.5,-18.5
parent: 2
- uid: 230
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: -0.5,7.5
parent: 2
- uid: 235
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: 0.5,7.5
parent: 2
- uid: 236
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: 1.5,7.5
parent: 2
- uid: 237
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: 2.5,7.5
parent: 2
- uid: 239
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 8.5,-14.5
parent: 2
- uid: 240
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
pos: 2.5,-14.5
parent: 2
- uid: 242
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: 8.5,7.5
parent: 2
- uid: 243
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: 9.5,7.5
parent: 2
- uid: 244
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: 10.5,7.5
parent: 2
- uid: 245
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: 11.5,7.5
parent: 2
- uid: 345
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: 13.5,-7.5
parent: 2
- uid: 346
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: -2.5,-7.5
parent: 2
- uid: 347
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: -2.5,-1.5
parent: 2
- uid: 348
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 1.5707963267948966 rad
pos: 13.5,-1.5
parent: 2
- uid: 372
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: -1.5707963267948966 rad
pos: 0.5,-17.5
parent: 2
- uid: 374
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: -1.5707963267948966 rad
pos: 10.5,-14.5
parent: 2
- uid: 375
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: -1.5707963267948966 rad
pos: 0.5,-16.5
parent: 2
- uid: 376
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: -1.5707963267948966 rad
pos: 0.5,-15.5
parent: 2
- uid: 377
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: -1.5707963267948966 rad
pos: 0.5,-14.5
parent: 2
- uid: 378
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: -1.5707963267948966 rad
pos: 10.5,-18.5
parent: 2
- uid: 515
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: -1.5707963267948966 rad
pos: 10.5,-17.5
parent: 2
- uid: 553
components:
- - type: MetaData
- flags: PvsPriority
- type: Transform
rot: 3.141592653589793 rad
pos: -2.5,-4.5
From 554f6649945bd2160d16ccbb8f0914708084cba8 Mon Sep 17 00:00:00 2001
From: themias <89101928+themias@users.noreply.github.com>
Date: Tue, 30 Jan 2024 06:05:20 -0500
Subject: [PATCH 08/43] Fix centcom cargo gifts (#24701)
(cherry picked from commit 3933490962993e839c71efea46c3e799ac824778)
---
.../Cargo/Systems/CargoSystem.Orders.cs | 54 +++++++++++--------
.../StationEvents/Events/CargoGiftsRule.cs | 7 ++-
2 files changed, 36 insertions(+), 25 deletions(-)
diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
index c1a20e19b0b..d02a07bfaa3 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
@@ -170,6 +170,33 @@ private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent com
return;
}
+ var tradeDestination = TryFulfillOrder(stationData, order, orderDatabase);
+
+ if (tradeDestination == null)
+ {
+ ConsolePopup(args.Session, Loc.GetString("cargo-console-unfulfilled"));
+ PlayDenySound(uid, component);
+ return;
+ }
+
+ _idCardSystem.TryFindIdCard(player, out var idCard);
+ // ReSharper disable once ConditionalAccessQualifierIsNonNullableAccordingToAPIContract
+ order.SetApproverData(idCard.Comp?.FullName, idCard.Comp?.JobTitle);
+ _audio.PlayPvs(component.ConfirmSound, uid);
+
+ ConsolePopup(args.Session, Loc.GetString("cargo-console-trade-station", ("destination", MetaData(tradeDestination.Value).EntityName)));
+
+ // Log order approval
+ _adminLogger.Add(LogType.Action, LogImpact.Low,
+ $"{ToPrettyString(player):user} approved order [orderId:{order.OrderId}, quantity:{order.OrderQuantity}, product:{order.ProductId}, requester:{order.Requester}, reason:{order.Reason}] with balance at {bank.Balance}");
+
+ orderDatabase.Orders.Remove(order);
+ DeductFunds(bank, cost);
+ UpdateOrders(station.Value, orderDatabase);
+ }
+
+ private EntityUid? TryFulfillOrder(StationDataComponent stationData, CargoOrderData order, StationCargoOrderDatabaseComponent orderDatabase)
+ {
// No slots at the trade station
_listEnts.Clear();
GetTradeStations(stationData, ref _listEnts);
@@ -198,27 +225,7 @@ private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent com
break;
}
- if (tradeDestination == null)
- {
- ConsolePopup(args.Session, Loc.GetString("cargo-console-unfulfilled"));
- PlayDenySound(uid, component);
- return;
- }
-
- _idCardSystem.TryFindIdCard(player, out var idCard);
- // ReSharper disable once ConditionalAccessQualifierIsNonNullableAccordingToAPIContract
- order.SetApproverData(idCard.Comp?.FullName, idCard.Comp?.JobTitle);
- _audio.PlayPvs(component.ConfirmSound, uid);
-
- ConsolePopup(args.Session, Loc.GetString("cargo-console-trade-station", ("destination", MetaData(tradeDestination.Value).EntityName)));
-
- // Log order approval
- _adminLogger.Add(LogType.Action, LogImpact.Low,
- $"{ToPrettyString(player):user} approved order [orderId:{order.OrderId}, quantity:{order.OrderQuantity}, product:{order.ProductId}, requester:{order.Requester}, reason:{order.Reason}] with balance at {bank.Balance}");
-
- orderDatabase.Orders.Remove(order);
- DeductFunds(bank, cost);
- UpdateOrders(station.Value, orderDatabase);
+ return tradeDestination;
}
private void GetTradeStations(StationDataComponent data, ref List ents)
@@ -372,7 +379,8 @@ public bool AddAndApproveOrder(
string sender,
string description,
string dest,
- StationCargoOrderDatabaseComponent component
+ StationCargoOrderDatabaseComponent component,
+ StationDataComponent stationData
)
{
DebugTools.Assert(_protoMan.HasIndex(spawnId));
@@ -388,7 +396,7 @@ StationCargoOrderDatabaseComponent component
$"AddAndApproveOrder {description} added order [orderId:{order.OrderId}, quantity:{order.OrderQuantity}, product:{order.ProductId}, requester:{order.Requester}, reason:{order.Reason}]");
// Add it to the list
- return TryAddOrder(dbUid, order, component);
+ return TryAddOrder(dbUid, order, component) && TryFulfillOrder(stationData, order, component).HasValue;
}
private bool TryAddOrder(EntityUid dbUid, CargoOrderData data, StationCargoOrderDatabaseComponent component)
diff --git a/Content.Server/StationEvents/Events/CargoGiftsRule.cs b/Content.Server/StationEvents/Events/CargoGiftsRule.cs
index 4d3ffa005d7..c174cc48c09 100644
--- a/Content.Server/StationEvents/Events/CargoGiftsRule.cs
+++ b/Content.Server/StationEvents/Events/CargoGiftsRule.cs
@@ -3,6 +3,7 @@
using Content.Server.Cargo.Systems;
using Content.Server.GameTicking;
using Content.Server.GameTicking.Rules.Components;
+using Content.Server.Station.Components;
using Content.Server.StationEvents.Components;
using Robust.Shared.Prototypes;
@@ -39,7 +40,8 @@ protected override void ActiveTick(EntityUid uid, CargoGiftsRuleComponent compon
component.TimeUntilNextGifts += 30f;
- if (!TryGetRandomStation(out var station, HasComp))
+ if (!TryGetRandomStation(out var station, HasComp) ||
+ !TryComp(station, out var stationData))
return;
if (!TryComp(station, out var cargoDb))
@@ -65,7 +67,8 @@ protected override void ActiveTick(EntityUid uid, CargoGiftsRuleComponent compon
Loc.GetString(component.Sender),
Loc.GetString(component.Description),
Loc.GetString(component.Dest),
- cargoDb
+ cargoDb,
+ stationData!
))
{
break;
From 0129a6e5b69d3ed3d1e89273570e1d5353f5901a Mon Sep 17 00:00:00 2001
From: Hmeister-real <118129069+hmeister-real@users.noreply.github.com>
Date: Sat, 3 Feb 2024 03:07:21 +0100
Subject: [PATCH 09/43] Update cargo guidebook entry and other minor guidebook
changes (#24828)
* Minor cloning change in guidebook
Cloning this should be removed at some point anyway, but im unsure if it can still be found in salv? can anyone confirm?
* Changes and updates to survival, removed fluff
* Create TradeStation.xml
* Forgor
* Change hex
* Rework this cause it was out of date
* Pointless spacing fixed (copy and pasted made it funny,)
* revert (somewhat)
Science cant set up cloning, so i just removed that part
* Remove more space
(cherry picked from commit 7ba6a278a410af8e894abd5798e4577a782f0f94)
---
Resources/ServerInfo/Guidebook/Cargo/Cargo.xml | 9 ++++-----
Resources/ServerInfo/Guidebook/Cargo/TradeStation.xml | 11 +++++++++++
Resources/ServerInfo/Guidebook/Survival.xml | 4 ++--
3 files changed, 17 insertions(+), 7 deletions(-)
create mode 100644 Resources/ServerInfo/Guidebook/Cargo/TradeStation.xml
diff --git a/Resources/ServerInfo/Guidebook/Cargo/Cargo.xml b/Resources/ServerInfo/Guidebook/Cargo/Cargo.xml
index 3124574da87..a6e95fac412 100644
--- a/Resources/ServerInfo/Guidebook/Cargo/Cargo.xml
+++ b/Resources/ServerInfo/Guidebook/Cargo/Cargo.xml
@@ -9,16 +9,15 @@
Every transaction you make will begin at a [color=#a4885c]cargo request computer[/color], from which you can make orders for specific products. Making any order requires [color=#118C4F]spesos[/color], the currency of the station. To make an order, click the "request" button next to whatever you need, type an appropriate reason for why you're ordering it, and hit "approve" when it appears below the request list.
## Piloting
- Orders are shipped to the station via the [color=#a4885c]cargo shuttle[/color], the remotely piloted spacecraft that logistics uses to buy and sell goods. In order to move the shuttle, you must first find the [color=#a4885c]cargo shuttle computer[/color].
+ Orders are shipped to the station via the [color=#a4885c]Trade Station[/color], and then transported with the cargo shuttle, a remotely piloted shuttle that logistics uses to transport goods back and forth from the trade station. In order to move the shuttle, you must first find the [color=#a4885c]cargo shuttle computer[/color] either on the station, or the shuttle itself.
After clicking the computer, you should see a radar view of the shuttle. Here are the steps for piloting the shuttle back and forth:
- First, disconnect any airlocks that are connected to the dock.
- - Then, you actually get to pilot the shuttle. The controls are fairly simple, with W and S being forward and backward, A and D being turn left and right; and Spacebar being the brake.
- - Find the button that designates the trading post. Hit this button, and the shuttle will start traveling to it.
- - After a short delay, the option to FTL back to the station will reappear. After this, just pilot the shuttle back to the cargo dock and retrieve the items you ordered.
+ - Then, you actually get to pilot the shuttle. The controls are fairly simple, with [color=#028ed9]"W"[/color] and [color=#028ed9]"S"[/color] being forward and backward, [color=#028ed9]"A"[/color] and [color=#028ed9]"D"[/color] being left and right, and [color=#028ed9]"Q"[/color] and [color=#028ed9]"E"[/color] being rotating left and right; and [color=#028ed9]"spacebar"[/color] being the brake and moving precicely by holding the [color=#028ed9]"spacebar"[/color] while doing other inputs.
+ - Then pilot the shuttle to the [textlink="Trade Station" link="TradeStation"].
## Selling
So, you want to order something, but don't have the money for it? You just need to sell something! Almost everything on the station has economic value, which an [color=#a4885c]appraisal tool[/color] can read out to you.
@@ -26,6 +25,6 @@
- After finding something worth selling, place it on one of the shuttle's cargo pallets. The next time the shuttle is sent to a trading post, the item will be sold and the money will be directly transferred back to the station's bank account. You can also make even more money by completing [textlink="bounties" link="CargoBounties"] or selling valuable items from [textlink="salvage" link="Salvage"].
+ After finding something worth selling, place it on the cargo shuttle, and then fly it to the [textlink="Trade Station" link="TradeStation"]. Then sell the item and collect the spesos from the terminal. You can also make even more money by completing [textlink="bounties" link="CargoBounties"] or selling valuable items from [textlink="salvage" link="Salvage"].
diff --git a/Resources/ServerInfo/Guidebook/Cargo/TradeStation.xml b/Resources/ServerInfo/Guidebook/Cargo/TradeStation.xml
new file mode 100644
index 00000000000..53361f8b9e1
--- /dev/null
+++ b/Resources/ServerInfo/Guidebook/Cargo/TradeStation.xml
@@ -0,0 +1,11 @@
+
+ # Trade Station
+ The Trade Station is seperate from the station, usually floating around in space visible on the scanner and shuttle computer. It is self maintaining, and self powered with solar pannels, so cargo doesn't need to do anything for it to work.
+
+ ## Selling
+ Using the [color=#a4885c]cargo shuttle[/color], you are able to transport items and bounties to sell at the trade station by flying the shuttle (explained in [textlink="cargo" link="Cargo"]) and docking it to the trade station. Then you bring the objects to sell over the cargo pallets, go to the computer inbetween the 2 sets of pallets and sell what can be sold. Dont worry, you can't sell yourself! Then [color=#118C4F]Spessos[/color] should come out of the computer, and can be inserted into the Quartermasters Digiboard or the Cargo Computer to be added to the Bank.
+
+ ## Collecting Orders
+ All cargo orders are sent to the [color=#a4885c]Trade Station[/color] to be [color=#a4885c]collected[/color], this includes items sent by centcom. To collect them you have to travel to the Trade station and they should be there on the cargo pallets in a crate, ready to be taken back to the station.
+
+
diff --git a/Resources/ServerInfo/Guidebook/Survival.xml b/Resources/ServerInfo/Guidebook/Survival.xml
index 2de22b08d43..981b826d6de 100644
--- a/Resources/ServerInfo/Guidebook/Survival.xml
+++ b/Resources/ServerInfo/Guidebook/Survival.xml
@@ -1,4 +1,4 @@
-
+
# Survival
It is generally wise to avoid situations that will cause you harm, because medical can only heal you so much when there's nuclear operatives on your doorstep.
@@ -31,4 +31,4 @@ In the event of a serious emergency, there're a few things you can do to help en
- Actually sleeping on a bed boosts your healing rate even farther.
- Meals that contain beans, red meat, or otherwise are just full of protein - will tremendously help your body's condition after severe bloodloss. It's still advised to visit a doctor and get treated though.
-
\ No newline at end of file
+
From b7619d3daf291d7e766e64f2ee8640dc9f59df48 Mon Sep 17 00:00:00 2001
From: Hmeister-real <118129069+Hmeister-real@users.noreply.github.com>
Date: Sun, 4 Feb 2024 22:34:32 +0000
Subject: [PATCH 10/43] Fix guidebook (#24947)
Co-authored-by: Kevin Zheng
(cherry picked from commit 1837459614fde9a11c1e5f2a34b3f82fa92f7167)
---
Resources/ServerInfo/Guidebook/Cargo/TradeStation.xml | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/Resources/ServerInfo/Guidebook/Cargo/TradeStation.xml b/Resources/ServerInfo/Guidebook/Cargo/TradeStation.xml
index 53361f8b9e1..bde0506b17b 100644
--- a/Resources/ServerInfo/Guidebook/Cargo/TradeStation.xml
+++ b/Resources/ServerInfo/Guidebook/Cargo/TradeStation.xml
@@ -7,5 +7,4 @@
## Collecting Orders
All cargo orders are sent to the [color=#a4885c]Trade Station[/color] to be [color=#a4885c]collected[/color], this includes items sent by centcom. To collect them you have to travel to the Trade station and they should be there on the cargo pallets in a crate, ready to be taken back to the station.
-
-
+
From 44613e6544d072cde4cc18010f16745db640727d Mon Sep 17 00:00:00 2001
From: Flesh <62557990+PolterTzi@users.noreply.github.com>
Date: Sun, 25 Feb 2024 08:36:22 +0100
Subject: [PATCH 11/43] Made ordering multiple crates at cargo order multiple
crates (#25518)
* please tell me this is empty
* it wasn't empty, fixing that
* This should fix it
* fix for the fix
* address changes
* fix
* Added some comments, hoping that failed test was a fluke.
(cherry picked from commit aa4e7c061939fbe314be97a2e7f559477b941c07)
---
.../Cargo/Systems/CargoSystem.Orders.cs | 18 +++++++++++-------
.../Cargo/Systems/CargoSystem.Shuttle.cs | 8 ++++++--
2 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
index d02a07bfaa3..ebe66ff029e 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
@@ -209,15 +209,19 @@ private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent com
_random.Shuffle(tradePads);
var freePads = GetFreeCargoPallets(trade, tradePads);
-
- foreach (var pad in freePads)
+ if (freePads.Count >= order.OrderQuantity) //check if the station has enough free pallets
{
- var coordinates = new EntityCoordinates(trade, pad.Transform.LocalPosition);
-
- if (FulfillOrder(order, coordinates, orderDatabase.PrinterOutput))
+ foreach (var pad in freePads)
{
- tradeDestination = trade;
- break;
+ var coordinates = new EntityCoordinates(trade, pad.Transform.LocalPosition);
+
+ if (FulfillOrder(order, coordinates, orderDatabase.PrinterOutput))
+ {
+ tradeDestination = trade;
+ order.NumDispatched++;
+ if (order.OrderQuantity <= order.NumDispatched) //Spawn a crate on free pellets until the order is fulfilled.
+ break;
+ }
}
}
diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
index 04dd9edeb47..a20b5c723f4 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
@@ -220,12 +220,14 @@ private int GetCargoSpace(EntityUid gridUid)
return _pads;
}
- private IEnumerable<(EntityUid Entity, CargoPalletComponent Component, TransformComponent Transform)>
+ private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent Transform)>
GetFreeCargoPallets(EntityUid gridUid,
List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent Transform)> pallets)
{
_setEnts.Clear();
+ List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent Transform)> outList = new();
+
foreach (var pallet in pallets)
{
var aabb = _lookup.GetAABBNoContainer(pallet.Entity, pallet.Transform.LocalPosition, pallet.Transform.LocalRotation);
@@ -233,8 +235,10 @@ private int GetCargoSpace(EntityUid gridUid)
if (_lookup.AnyLocalEntitiesIntersecting(gridUid, aabb, LookupFlags.Dynamic))
continue;
- yield return pallet;
+ outList.Add(pallet);
}
+
+ return outList;
}
#endregion
From f102e8ff7564da52e2fa652c730027b3c54e544d Mon Sep 17 00:00:00 2001
From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Date: Sun, 3 Mar 2024 08:39:19 +0100
Subject: [PATCH 12/43] Shuttle console + FTL rework (#24430)
* Add shuttle interior drawing back
Just do it per-tile she'll be right, at least it's done with 1 draw call.
* Revamp shuttle console
* Bunch of cleanup work
* Lables sortito
* dok
* Pixel alignment and colours
* Fix a bunch of drawing bugs
* Shuttle map drawing
* Drawing fixes
* Map parallax working finally
* weh
* Commit all my stuff
* mic
* deez
* Update everything
* Xamlify everything
* uh
* Rudimentary blocker range
* My enemies have succeeded
* Bunch of changes to FTL
* Heaps of cleanup
* Fix FTL bugs
* FTL
* weewoo
* FTL fallback
* wew
* weh
* Basic FTL working
* FTL working
* FTL destination fixes
* a
* Exclusion zones
* Fix drawing / FTL
* Beacons working
* Coordinates drawing
* Fix unknown map names
* Dorks beginning
* State + docking cleanup start
* Basic dock drawing
* Bunch of drawing fixes
* Batching / color fixes
* Cleanup and beacons support
* weh
* weh
* Begin pings
* First draft at map objects
* Map fixup
* Faster drawing
* Fix perf + FTL
* Cached drawing
* Fix drawing
* Best I got
* strips
* Back to lists but with caching
* Final optimisation
* Fix dock bounds
* Docking work
* stinker
* kobolds
* Btns
* Docking vis working
* Fix docking pre-vis
* canasses
* Helldivers 2
* a
* Array life
* Fix
* Fix TODOs
* liltenhead feature club
* dorking
* Merge artifacts
* Last-minute touchup
(cherry picked from commit c5486873db0d6826122eb1f30007e392fc101082)
---
.../ManageSolutions/EditSolutionsWindow.xaml | 4 +-
.../Atmos/Monitor/UI/Widgets/PumpControl.xaml | 2 +-
.../Monitor/UI/Widgets/ScrubberControl.xaml | 4 +-
.../Atmos/Monitor/UI/Widgets/SensorInfo.xaml | 4 +-
.../Monitor/UI/Widgets/ThresholdControl.xaml | 2 +-
.../Cryostorage/CryostorageEntryControl.xaml | 2 +-
.../Guidebook/Controls/GuideReagentEmbed.xaml | 6 +-
.../HumanoidMarkingModifierWindow.xaml | 2 +-
.../CrewMonitoringNavMapControl.cs | 9 +-
.../CrewMonitoringWindow.xaml.cs | 7 -
Content.Client/Pinpointer/UI/NavMapControl.cs | 121 +--
.../PowerMonitoringConsoleNavMapControl.cs | 14 +-
.../BUI/RadarConsoleBoundUserInterface.cs | 7 +-
.../BUI/ShuttleConsoleBoundUserInterface.cs | 64 +-
.../Shuttles/ShuttleConsoleComponent.cs | 9 +-
.../Shuttles/Systems/DockingSystem.cs | 6 +-
.../Shuttles/Systems/ShuttleSystem.Console.cs | 48 ++
.../Shuttles/UI/BaseShuttleControl.xaml | 2 +
.../Shuttles/UI/BaseShuttleControl.xaml.cs | 324 +++++++++
Content.Client/Shuttles/UI/DockObject.xaml | 11 +
Content.Client/Shuttles/UI/DockObject.xaml.cs | 61 ++
Content.Client/Shuttles/UI/DockingControl.cs | 272 -------
Content.Client/Shuttles/UI/DockingScreen.xaml | 28 +
.../Shuttles/UI/DockingScreen.xaml.cs | 183 +++++
Content.Client/Shuttles/UI/MapScreen.xaml | 66 ++
Content.Client/Shuttles/UI/MapScreen.xaml.cs | 531 ++++++++++++++
Content.Client/Shuttles/UI/NavScreen.xaml | 69 ++
Content.Client/Shuttles/UI/NavScreen.xaml.cs | 85 +++
.../Shuttles/UI/RadarConsoleWindow.xaml | 2 +-
.../Shuttles/UI/RadarConsoleWindow.xaml.cs | 9 +-
Content.Client/Shuttles/UI/RadarControl.cs | 433 -----------
.../Shuttles/UI/ShuttleConsoleWindow.xaml | 139 +---
.../Shuttles/UI/ShuttleConsoleWindow.xaml.cs | 362 +++------
.../Shuttles/UI/ShuttleDockControl.xaml | 1 +
.../Shuttles/UI/ShuttleDockControl.xaml.cs | 458 ++++++++++++
.../Shuttles/UI/ShuttleMapControl.xaml | 1 +
.../Shuttles/UI/ShuttleMapControl.xaml.cs | 609 ++++++++++++++++
.../Shuttles/UI/ShuttleNavControl.xaml | 1 +
.../Shuttles/UI/ShuttleNavControl.xaml.cs | 288 ++++++++
.../UserInterface/Controls/MapGridControl.cs | 84 ---
.../Controls/MapGridControl.xaml | 1 +
.../Controls/MapGridControl.xaml.cs | 243 +++++++
.../Salvage/SalvageSystem.Runner.cs | 3 +-
.../Shuttles/Commands/DockCommand.cs | 2 +-
.../Shuttles/Components/AutoDockComponent.cs | 14 -
.../Shuttles/Components/FTLBeaconComponent.cs | 10 +
.../Shuttles/Components/FTLComponent.cs | 20 +-
.../Components/FTLDestinationComponent.cs | 19 -
.../Components/FTLExclusionComponent.cs | 16 +
.../Components/RecentlyDockedComponent.cs | 15 -
.../Shuttles/Systems/ArrivalsSystem.cs | 6 +-
.../Systems/DockingSystem.AutoDock.cs | 122 ----
.../Shuttles/Systems/DockingSystem.Shuttle.cs | 88 ++-
.../Shuttles/Systems/DockingSystem.cs | 367 +++++-----
.../Systems/EmergencyShuttleSystem.Console.cs | 17 +-
.../Systems/EmergencyShuttleSystem.cs | 2 +-
.../Shuttles/Systems/RadarConsoleSystem.cs | 22 +-
.../Systems/ShuttleConsoleSystem.Drone.cs | 14 +
.../Systems/ShuttleConsoleSystem.FTL.cs | 160 ++++
.../Shuttles/Systems/ShuttleConsoleSystem.cs | 303 ++++----
.../Systems/ShuttleSystem.FasterThanLight.cs | 686 ++++++++++--------
.../Systems/ShuttleSystem.GridFill.cs | 6 +-
.../Shuttles/Systems/ShuttleSystem.cs | 8 -
Content.Shared/Parallax/ParallaxComponent.cs | 2 +-
.../BUIStates/DockingInterfaceState.cs | 14 +
.../Shuttles/BUIStates/DockingPortState.cs | 20 +
.../BUIStates/NavBoundUserInterfaceState.cs | 17 +
...InterfaceState.cs => NavInterfaceState.cs} | 25 +-
.../ShuttleBoundUserInterfaceState.cs | 19 +
.../ShuttleConsoleBoundInterfaceState.cs | 36 -
.../BUIStates/ShuttleMapInterfaceState.cs | 38 +
.../Components/FTLDestinationComponent.cs | 26 +
.../Shuttles/Components/FTLMapComponent.cs | 28 +
.../Shuttles/Components/IFFComponent.cs | 4 +-
.../Shuttles/Components/PilotComponent.cs | 2 -
.../Components/ShuttleMapParallaxComponent.cs | 17 +
...equestMessage.cs => DockRequestMessage.cs} | 6 +-
.../Events/ShuttleConsoleFTLBeaconMessage.cs | 13 +
...cs => ShuttleConsoleFTLPositionMessage.cs} | 6 +-
.../Events/StopAutodockRequestMessage.cs | 12 -
.../Shuttles/Systems/SharedDockingSystem.cs | 78 ++
.../Systems/SharedRadarConsoleSystem.cs | 1 -
.../Systems/SharedShuttleConsoleSystem.cs | 1 +
.../Systems/SharedShuttleSystem.IFF.cs | 37 +
.../Shuttles/Systems/SharedShuttleSystem.cs | 191 +++++
.../Shuttles/UI/MapObjects/GridMapObject.cs | 7 +
.../Shuttles/UI/MapObjects/IMapObject.cs | 9 +
.../UI/MapObjects/ShuttleBeaconObject.cs | 7 +
.../UI/MapObjects/ShuttleExclusionObject.cs | 7 +
.../Audio/Effects/Shuttle/attributions.yml | 6 +
.../Audio/Effects/Shuttle/radar_ping.ogg | Bin 0 -> 24816 bytes
Resources/Locale/en-US/shuttles/console.ftl | 59 +-
Resources/Maps/Shuttles/infiltrator.yml | 3 +
.../Prototypes/Entities/Markers/shuttle.yml | 12 +-
.../Machines/Computers/computers.yml | 2 +-
.../Prototypes/Procedural/salvage_mods.yml | 1 +
Resources/Textures/Parallaxes/space_map2.png | Bin 0 -> 6150065 bytes
Resources/Textures/Parallaxes/weh.txt | 1 +
98 files changed, 4853 insertions(+), 2328 deletions(-)
create mode 100644 Content.Client/Shuttles/Systems/ShuttleSystem.Console.cs
create mode 100644 Content.Client/Shuttles/UI/BaseShuttleControl.xaml
create mode 100644 Content.Client/Shuttles/UI/BaseShuttleControl.xaml.cs
create mode 100644 Content.Client/Shuttles/UI/DockObject.xaml
create mode 100644 Content.Client/Shuttles/UI/DockObject.xaml.cs
delete mode 100644 Content.Client/Shuttles/UI/DockingControl.cs
create mode 100644 Content.Client/Shuttles/UI/DockingScreen.xaml
create mode 100644 Content.Client/Shuttles/UI/DockingScreen.xaml.cs
create mode 100644 Content.Client/Shuttles/UI/MapScreen.xaml
create mode 100644 Content.Client/Shuttles/UI/MapScreen.xaml.cs
create mode 100644 Content.Client/Shuttles/UI/NavScreen.xaml
create mode 100644 Content.Client/Shuttles/UI/NavScreen.xaml.cs
delete mode 100644 Content.Client/Shuttles/UI/RadarControl.cs
create mode 100644 Content.Client/Shuttles/UI/ShuttleDockControl.xaml
create mode 100644 Content.Client/Shuttles/UI/ShuttleDockControl.xaml.cs
create mode 100644 Content.Client/Shuttles/UI/ShuttleMapControl.xaml
create mode 100644 Content.Client/Shuttles/UI/ShuttleMapControl.xaml.cs
create mode 100644 Content.Client/Shuttles/UI/ShuttleNavControl.xaml
create mode 100644 Content.Client/Shuttles/UI/ShuttleNavControl.xaml.cs
delete mode 100644 Content.Client/UserInterface/Controls/MapGridControl.cs
create mode 100644 Content.Client/UserInterface/Controls/MapGridControl.xaml
create mode 100644 Content.Client/UserInterface/Controls/MapGridControl.xaml.cs
delete mode 100644 Content.Server/Shuttles/Components/AutoDockComponent.cs
create mode 100644 Content.Server/Shuttles/Components/FTLBeaconComponent.cs
delete mode 100644 Content.Server/Shuttles/Components/FTLDestinationComponent.cs
create mode 100644 Content.Server/Shuttles/Components/FTLExclusionComponent.cs
delete mode 100644 Content.Server/Shuttles/Components/RecentlyDockedComponent.cs
delete mode 100644 Content.Server/Shuttles/Systems/DockingSystem.AutoDock.cs
create mode 100644 Content.Server/Shuttles/Systems/ShuttleConsoleSystem.FTL.cs
create mode 100644 Content.Shared/Shuttles/BUIStates/DockingInterfaceState.cs
create mode 100644 Content.Shared/Shuttles/BUIStates/DockingPortState.cs
create mode 100644 Content.Shared/Shuttles/BUIStates/NavBoundUserInterfaceState.cs
rename Content.Shared/Shuttles/BUIStates/{RadarConsoleBoundInterfaceState.cs => NavInterfaceState.cs} (53%)
create mode 100644 Content.Shared/Shuttles/BUIStates/ShuttleBoundUserInterfaceState.cs
delete mode 100644 Content.Shared/Shuttles/BUIStates/ShuttleConsoleBoundInterfaceState.cs
create mode 100644 Content.Shared/Shuttles/BUIStates/ShuttleMapInterfaceState.cs
create mode 100644 Content.Shared/Shuttles/Components/FTLDestinationComponent.cs
create mode 100644 Content.Shared/Shuttles/Components/FTLMapComponent.cs
create mode 100644 Content.Shared/Shuttles/Components/ShuttleMapParallaxComponent.cs
rename Content.Shared/Shuttles/Events/{AutodockRequestMessage.cs => DockRequestMessage.cs} (64%)
create mode 100644 Content.Shared/Shuttles/Events/ShuttleConsoleFTLBeaconMessage.cs
rename Content.Shared/Shuttles/Events/{ShuttleConsoleFTLRequestMessage.cs => ShuttleConsoleFTLPositionMessage.cs} (54%)
delete mode 100644 Content.Shared/Shuttles/Events/StopAutodockRequestMessage.cs
create mode 100644 Content.Shared/Shuttles/Systems/SharedDockingSystem.cs
create mode 100644 Content.Shared/Shuttles/UI/MapObjects/GridMapObject.cs
create mode 100644 Content.Shared/Shuttles/UI/MapObjects/IMapObject.cs
create mode 100644 Content.Shared/Shuttles/UI/MapObjects/ShuttleBeaconObject.cs
create mode 100644 Content.Shared/Shuttles/UI/MapObjects/ShuttleExclusionObject.cs
create mode 100644 Resources/Audio/Effects/Shuttle/radar_ping.ogg
create mode 100644 Resources/Textures/Parallaxes/space_map2.png
create mode 100644 Resources/Textures/Parallaxes/weh.txt
diff --git a/Content.Client/Administration/UI/ManageSolutions/EditSolutionsWindow.xaml b/Content.Client/Administration/UI/ManageSolutions/EditSolutionsWindow.xaml
index 9e0f9d182ea..01259b60f7a 100644
--- a/Content.Client/Administration/UI/ManageSolutions/EditSolutionsWindow.xaml
+++ b/Content.Client/Administration/UI/ManageSolutions/EditSolutionsWindow.xaml
@@ -12,7 +12,7 @@
-
+
@@ -23,7 +23,7 @@
-
+
diff --git a/Content.Client/Atmos/Monitor/UI/Widgets/PumpControl.xaml b/Content.Client/Atmos/Monitor/UI/Widgets/PumpControl.xaml
index 632e44a4587..5fb4e5f0c8c 100644
--- a/Content.Client/Atmos/Monitor/UI/Widgets/PumpControl.xaml
+++ b/Content.Client/Atmos/Monitor/UI/Widgets/PumpControl.xaml
@@ -1,7 +1,7 @@
-
+
diff --git a/Content.Client/Atmos/Monitor/UI/Widgets/ScrubberControl.xaml b/Content.Client/Atmos/Monitor/UI/Widgets/ScrubberControl.xaml
index 1cb9c9ed5b4..34c1a9dd1a9 100644
--- a/Content.Client/Atmos/Monitor/UI/Widgets/ScrubberControl.xaml
+++ b/Content.Client/Atmos/Monitor/UI/Widgets/ScrubberControl.xaml
@@ -1,7 +1,7 @@
-
+
@@ -26,7 +26,7 @@
-
+
diff --git a/Content.Client/Atmos/Monitor/UI/Widgets/SensorInfo.xaml b/Content.Client/Atmos/Monitor/UI/Widgets/SensorInfo.xaml
index b90ca3f1f66..005e6807b37 100644
--- a/Content.Client/Atmos/Monitor/UI/Widgets/SensorInfo.xaml
+++ b/Content.Client/Atmos/Monitor/UI/Widgets/SensorInfo.xaml
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
diff --git a/Content.Client/Atmos/Monitor/UI/Widgets/ThresholdControl.xaml b/Content.Client/Atmos/Monitor/UI/Widgets/ThresholdControl.xaml
index 0f53673da10..635a70f532c 100644
--- a/Content.Client/Atmos/Monitor/UI/Widgets/ThresholdControl.xaml
+++ b/Content.Client/Atmos/Monitor/UI/Widgets/ThresholdControl.xaml
@@ -1,7 +1,7 @@
-
+
diff --git a/Content.Client/Bed/Cryostorage/CryostorageEntryControl.xaml b/Content.Client/Bed/Cryostorage/CryostorageEntryControl.xaml
index 176acbf29b5..5acb142a607 100644
--- a/Content.Client/Bed/Cryostorage/CryostorageEntryControl.xaml
+++ b/Content.Client/Bed/Cryostorage/CryostorageEntryControl.xaml
@@ -11,7 +11,7 @@
-
+
diff --git a/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml b/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml
index 752c9cc6c2c..f46e319abeb 100644
--- a/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml
+++ b/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml
@@ -11,7 +11,7 @@
-
+
-
+
-
+
-
+
diff --git a/Content.Client/Medical/CrewMonitoring/CrewMonitoringNavMapControl.cs b/Content.Client/Medical/CrewMonitoring/CrewMonitoringNavMapControl.cs
index fcecbad465a..340cc9af891 100644
--- a/Content.Client/Medical/CrewMonitoring/CrewMonitoringNavMapControl.cs
+++ b/Content.Client/Medical/CrewMonitoring/CrewMonitoringNavMapControl.cs
@@ -1,6 +1,7 @@
using Content.Client.Pinpointer.UI;
using Robust.Client.Graphics;
using Robust.Client.UserInterface.Controls;
+using Robust.Shared.Timing;
namespace Content.Client.Medical.CrewMonitoring;
@@ -16,7 +17,7 @@ public CrewMonitoringNavMapControl() : base()
{
WallColor = new Color(192, 122, 196);
TileColor = new(71, 42, 72);
- _backgroundColor = Color.FromSrgb(TileColor.WithAlpha(_backgroundOpacity));
+ BackgroundColor = Color.FromSrgb(TileColor.WithAlpha(BackgroundOpacity));
_trackedEntityLabel = new Label
{
@@ -30,7 +31,7 @@ public CrewMonitoringNavMapControl() : base()
{
PanelOverride = new StyleBoxFlat
{
- BackgroundColor = _backgroundColor,
+ BackgroundColor = BackgroundColor,
},
Margin = new Thickness(5f, 10f),
@@ -43,9 +44,9 @@ public CrewMonitoringNavMapControl() : base()
this.AddChild(_trackedEntityPanel);
}
- protected override void Draw(DrawingHandleScreen handle)
+ protected override void FrameUpdate(FrameEventArgs args)
{
- base.Draw(handle);
+ base.FrameUpdate(args);
if (Focus == null)
{
diff --git a/Content.Client/Medical/CrewMonitoring/CrewMonitoringWindow.xaml.cs b/Content.Client/Medical/CrewMonitoring/CrewMonitoringWindow.xaml.cs
index 645243b0a3a..39326c8a99c 100644
--- a/Content.Client/Medical/CrewMonitoring/CrewMonitoringWindow.xaml.cs
+++ b/Content.Client/Medical/CrewMonitoring/CrewMonitoringWindow.xaml.cs
@@ -23,7 +23,6 @@ namespace Content.Client.Medical.CrewMonitoring;
[GenerateTypedNameReferences]
public sealed partial class CrewMonitoringWindow : FancyWindow
{
- private List _rowsContent = new();
private readonly IEntityManager _entManager;
private readonly IPrototypeManager _prototypeManager;
private readonly SpriteSystem _spriteSystem;
@@ -100,7 +99,6 @@ public void ShowSensors(List sensors, EntityUid monitor, Entit
};
SensorsTable.AddChild(spacer);
- _rowsContent.Add(spacer);
}
var deparmentLabel = new RichTextLabel()
@@ -113,7 +111,6 @@ public void ShowSensors(List sensors, EntityUid monitor, Entit
deparmentLabel.StyleClasses.Add(StyleNano.StyleClassTooltipActionDescription);
SensorsTable.AddChild(deparmentLabel);
- _rowsContent.Add(deparmentLabel);
PopulateDepartmentList(departmentSensors);
}
@@ -129,7 +126,6 @@ public void ShowSensors(List sensors, EntityUid monitor, Entit
};
SensorsTable.AddChild(spacer);
- _rowsContent.Add(spacer);
var deparmentLabel = new RichTextLabel()
{
@@ -141,7 +137,6 @@ public void ShowSensors(List sensors, EntityUid monitor, Entit
deparmentLabel.StyleClasses.Add(StyleNano.StyleClassTooltipActionDescription);
SensorsTable.AddChild(deparmentLabel);
- _rowsContent.Add(deparmentLabel);
PopulateDepartmentList(remainingSensors);
}
@@ -175,7 +170,6 @@ private void PopulateDepartmentList(IEnumerable departmentSens
sensorButton.AddStyleClass(StyleNano.StyleClassButtonColorGreen);
SensorsTable.AddChild(sensorButton);
- _rowsContent.Add(sensorButton);
// Primary container to hold the button UI elements
var mainContainer = new BoxContainer()
@@ -422,7 +416,6 @@ private bool TryGetNextScrollPosition([NotNullWhen(true)] out float? nextScrollP
private void ClearOutDatedData()
{
SensorsTable.RemoveAllChildren();
- _rowsContent.Clear();
NavMap.TrackedCoordinates.Clear();
NavMap.TrackedEntities.Clear();
NavMap.LocalizedNames.Clear();
diff --git a/Content.Client/Pinpointer/UI/NavMapControl.cs b/Content.Client/Pinpointer/UI/NavMapControl.cs
index 3b426e73d89..a8ec7b37a0b 100644
--- a/Content.Client/Pinpointer/UI/NavMapControl.cs
+++ b/Content.Client/Pinpointer/UI/NavMapControl.cs
@@ -25,12 +25,14 @@ namespace Content.Client.Pinpointer.UI;
[UsedImplicitly, Virtual]
public partial class NavMapControl : MapGridControl
{
- [Dependency] private readonly IEntityManager _entManager = default!;
+ [Dependency] private IResourceCache _cache = default!;
private readonly SharedTransformSystem _transformSystem;
public EntityUid? Owner;
public EntityUid? MapUid;
+ protected override bool Draggable => true;
+
// Actions
public event Action? TrackedEntitySelectedAction;
public event Action? PostWallDrawingAction;
@@ -47,23 +49,17 @@ public partial class NavMapControl : MapGridControl
// Constants
protected float UpdateTime = 1.0f;
protected float MaxSelectableDistance = 10f;
- protected float RecenterMinimum = 0.05f;
protected float MinDragDistance = 5f;
protected static float MinDisplayedRange = 8f;
protected static float MaxDisplayedRange = 128f;
protected static float DefaultDisplayedRange = 48f;
// Local variables
- private Vector2 _offset;
- private bool _draggin;
- private Vector2 _startDragPosition = default!;
- private bool _recentering = false;
private float _updateTimer = 0.25f;
- private Dictionary _sRGBLookUp = new Dictionary();
- public Color _backgroundColor;
- public float _backgroundOpacity = 0.9f;
+ private Dictionary _sRGBLookUp = new();
+ protected Color BackgroundColor;
+ protected float BackgroundOpacity = 0.9f;
private int _targetFontsize = 8;
- private IResourceCache _cache;
// Components
private NavMapComponent? _navMap;
@@ -100,10 +96,9 @@ public partial class NavMapControl : MapGridControl
public NavMapControl() : base(MinDisplayedRange, MaxDisplayedRange, DefaultDisplayedRange)
{
IoCManager.InjectDependencies(this);
- _cache = IoCManager.Resolve();
- _transformSystem = _entManager.System();
- _backgroundColor = Color.FromSrgb(TileColor.WithAlpha(_backgroundOpacity));
+ _transformSystem = EntManager.System();
+ BackgroundColor = Color.FromSrgb(TileColor.WithAlpha(BackgroundOpacity));
RectClipContent = true;
HorizontalExpand = true;
@@ -145,21 +140,16 @@ public NavMapControl() : base(MinDisplayedRange, MaxDisplayedRange, DefaultDispl
_recenter.OnPressed += args =>
{
- _recentering = true;
+ Recentering = true;
};
ForceNavMapUpdate();
}
- public void ForceRecenter()
- {
- _recentering = true;
- }
-
public void ForceNavMapUpdate()
{
- _entManager.TryGetComponent(MapUid, out _navMap);
- _entManager.TryGetComponent(MapUid, out _grid);
+ EntManager.TryGetComponent(MapUid, out _navMap);
+ EntManager.TryGetComponent(MapUid, out _grid);
UpdateNavMap();
}
@@ -167,29 +157,15 @@ public void ForceNavMapUpdate()
public void CenterToCoordinates(EntityCoordinates coordinates)
{
if (_physics != null)
- _offset = new Vector2(coordinates.X, coordinates.Y) - _physics.LocalCenter;
+ Offset = new Vector2(coordinates.X, coordinates.Y) - _physics.LocalCenter;
_recenter.Disabled = false;
}
- protected override void KeyBindDown(GUIBoundKeyEventArgs args)
- {
- base.KeyBindDown(args);
-
- if (args.Function == EngineKeyFunctions.Use)
- {
- _startDragPosition = args.PointerLocation.Position;
- _draggin = true;
- }
- }
-
protected override void KeyBindUp(GUIBoundKeyEventArgs args)
{
base.KeyBindUp(args);
- if (args.Function == EngineKeyFunctions.Use)
- _draggin = false;
-
if (args.Function == EngineKeyFunctions.UIClick)
{
if (TrackedEntitySelectedAction == null)
@@ -199,15 +175,15 @@ protected override void KeyBindUp(GUIBoundKeyEventArgs args)
return;
// If the cursor has moved a significant distance, exit
- if ((_startDragPosition - args.PointerLocation.Position).Length() > MinDragDistance)
+ if ((StartDragPosition - args.PointerLocation.Position).Length() > MinDragDistance)
return;
// Get the clicked position
- var offset = _offset + _physics.LocalCenter;
+ var offset = Offset + _physics.LocalCenter;
var localPosition = args.PointerLocation.Position - GlobalPixelPosition;
// Convert to a world position
- var unscaledPosition = (localPosition - MidpointVector) / MinimapScale;
+ var unscaledPosition = (localPosition - MidPointVector) / MinimapScale;
var worldPosition = _transformSystem.GetWorldMatrix(_xform).Transform(new Vector2(unscaledPosition.X, -unscaledPosition.Y) + offset);
// Find closest tracked entity in range
@@ -219,7 +195,7 @@ protected override void KeyBindUp(GUIBoundKeyEventArgs args)
if (!blip.Selectable)
continue;
- var currentDistance = (blip.Coordinates.ToMapPos(_entManager, _transformSystem) - worldPosition).Length();
+ var currentDistance = (blip.Coordinates.ToMapPos(EntManager, _transformSystem) - worldPosition).Length();
if (closestDistance < currentDistance || currentDistance * MinimapScale > MaxSelectableDistance)
continue;
@@ -251,15 +227,8 @@ protected override void MouseMove(GUIMouseMoveEventArgs args)
{
base.MouseMove(args);
- if (!_draggin)
- return;
-
- _recentering = false;
- _offset -= new Vector2(args.Relative.X, -args.Relative.Y) / MidPoint * WorldRange;
-
- if (_offset != Vector2.Zero)
+ if (Offset != Vector2.Zero)
_recenter.Disabled = false;
-
else
_recenter.Disabled = true;
}
@@ -269,36 +238,21 @@ protected override void Draw(DrawingHandleScreen handle)
base.Draw(handle);
// Get the components necessary for drawing the navmap
- _entManager.TryGetComponent(MapUid, out _navMap);
- _entManager.TryGetComponent(MapUid, out _grid);
- _entManager.TryGetComponent(MapUid, out _xform);
- _entManager.TryGetComponent(MapUid, out _physics);
- _entManager.TryGetComponent(MapUid, out _fixtures);
+ EntManager.TryGetComponent(MapUid, out _navMap);
+ EntManager.TryGetComponent(MapUid, out _grid);
+ EntManager.TryGetComponent(MapUid, out _xform);
+ EntManager.TryGetComponent(MapUid, out _physics);
+ EntManager.TryGetComponent(MapUid, out _fixtures);
// Map re-centering
- if (_recentering)
- {
- var frameTime = Timing.FrameTime;
- var diff = _offset * (float) frameTime.TotalSeconds;
-
- if (_offset.LengthSquared() < RecenterMinimum)
- {
- _offset = Vector2.Zero;
- _recentering = false;
- _recenter.Disabled = true;
- }
- else
- {
- _offset -= diff * 5f;
- }
- }
+ _recenter.Disabled = DrawRecenter();
_zoom.Text = Loc.GetString("navmap-zoom", ("value", $"{(DefaultDisplayedRange / WorldRange ):0.0}"));
if (_navMap == null || _xform == null)
return;
- var offset = _offset;
+ var offset = Offset;
if (_physics != null)
offset += _physics.LocalCenter;
@@ -317,7 +271,7 @@ protected override void Draw(DrawingHandleScreen handle)
{
var vert = poly.Vertices[i] - offset;
- verts[i] = Scale(new Vector2(vert.X, -vert.Y));
+ verts[i] = ScalePosition(new Vector2(vert.X, -vert.Y));
}
handle.DrawPrimitives(DrawPrimitiveTopology.TriangleFan, verts[..poly.VertexCount], TileColor);
@@ -348,8 +302,8 @@ protected override void Draw(DrawingHandleScreen handle)
foreach (var chunkedLine in chunkedLines)
{
- var start = Scale(chunkedLine.Origin - new Vector2(offset.X, -offset.Y));
- var end = Scale(chunkedLine.Terminus - new Vector2(offset.X, -offset.Y));
+ var start = ScalePosition(chunkedLine.Origin - new Vector2(offset.X, -offset.Y));
+ var end = ScalePosition(chunkedLine.Terminus - new Vector2(offset.X, -offset.Y));
walls.Add(start);
walls.Add(end);
@@ -375,7 +329,7 @@ protected override void Draw(DrawingHandleScreen handle)
foreach (var airlock in _navMap.Airlocks)
{
var position = airlock.Position - offset;
- position = Scale(position with { Y = -position.Y });
+ position = ScalePosition(position with { Y = -position.Y });
airlockLines.Add(position + airlockBuffer);
airlockLines.Add(position - airlockBuffer * foobarVec);
@@ -418,10 +372,10 @@ protected override void Draw(DrawingHandleScreen handle)
foreach (var beacon in _navMap.Beacons)
{
var position = beacon.Position - offset;
- position = Scale(position with { Y = -position.Y });
+ position = ScalePosition(position with { Y = -position.Y });
var textDimensions = handle.GetDimensions(font, beacon.Text, 1f);
- handle.DrawRect(new UIBox2(position - textDimensions / 2 - rectBuffer, position + textDimensions / 2 + rectBuffer), _backgroundColor);
+ handle.DrawRect(new UIBox2(position - textDimensions / 2 - rectBuffer, position + textDimensions / 2 + rectBuffer), BackgroundColor);
handle.DrawString(font, position - textDimensions / 2, beacon.Text, beacon.Color);
}
}
@@ -435,12 +389,12 @@ protected override void Draw(DrawingHandleScreen handle)
{
if (lit && value.Visible)
{
- var mapPos = coord.ToMap(_entManager, _transformSystem);
+ var mapPos = coord.ToMap(EntManager, _transformSystem);
if (mapPos.MapId != MapId.Nullspace)
{
var position = _transformSystem.GetInvWorldMatrix(_xform).Transform(mapPos.Position) - offset;
- position = Scale(new Vector2(position.X, -position.Y));
+ position = ScalePosition(new Vector2(position.X, -position.Y));
handle.DrawCircle(position, float.Sqrt(MinimapScale) * 2f, value.Color);
}
@@ -461,12 +415,12 @@ protected override void Draw(DrawingHandleScreen handle)
if (!iconVertexUVs.TryGetValue((blip.Texture, blip.Color), out var vertexUVs))
vertexUVs = new();
- var mapPos = blip.Coordinates.ToMap(_entManager, _transformSystem);
+ var mapPos = blip.Coordinates.ToMap(EntManager, _transformSystem);
if (mapPos.MapId != MapId.Nullspace)
{
var position = _transformSystem.GetInvWorldMatrix(_xform).Transform(mapPos.Position) - offset;
- position = Scale(new Vector2(position.X, -position.Y));
+ position = ScalePosition(new Vector2(position.X, -position.Y));
var scalingCoefficient = 2.5f;
var positionOffset = scalingCoefficient * float.Sqrt(MinimapScale);
@@ -628,14 +582,9 @@ public Dictionary> GetDecodedWallChunks
return decodedOutput;
}
- protected Vector2 Scale(Vector2 position)
- {
- return position * MinimapScale + MidpointVector;
- }
-
protected Vector2 GetOffset()
{
- return _offset + (_physics != null ? _physics.LocalCenter : new Vector2());
+ return Offset + (_physics?.LocalCenter ?? new Vector2());
}
}
diff --git a/Content.Client/Power/PowerMonitoringConsoleNavMapControl.cs b/Content.Client/Power/PowerMonitoringConsoleNavMapControl.cs
index 9f537f38587..902d6bb7e60 100644
--- a/Content.Client/Power/PowerMonitoringConsoleNavMapControl.cs
+++ b/Content.Client/Power/PowerMonitoringConsoleNavMapControl.cs
@@ -33,7 +33,7 @@ public PowerMonitoringConsoleNavMapControl() : base()
// Set colors
TileColor = new Color(30, 57, 67);
WallColor = new Color(102, 164, 217);
- _backgroundColor = Color.FromSrgb(TileColor.WithAlpha(_backgroundOpacity));
+ BackgroundColor = Color.FromSrgb(TileColor.WithAlpha(BackgroundOpacity));
PostWallDrawingAction += DrawAllCableNetworks;
}
@@ -93,8 +93,8 @@ public void DrawCableNetwork(DrawingHandleScreen handle, Dictionary
+ /// Gets the parallax to use for the specified map or uses the fallback if not available.
+ ///
+ public Texture GetTexture(Entity entity)
+ {
+ if (!Resolve(entity, ref entity.Comp, false))
+ {
+ return _resource.GetTexture(ShuttleMapParallaxComponent.FallbackTexture);
+ }
+
+ return _resource.GetTexture(entity.Comp.TexturePath);
+ }
+
+ ///
+ /// Gets the map coordinates of a map object.
+ ///
+ public MapCoordinates GetMapCoordinates(IMapObject mapObj)
+ {
+ switch (mapObj)
+ {
+ case ShuttleBeaconObject beacon:
+ return GetCoordinates(beacon.Coordinates).ToMap(EntityManager, XformSystem);
+ case ShuttleExclusionObject exclusion:
+ return GetCoordinates(exclusion.Coordinates).ToMap(EntityManager, XformSystem);
+ case GridMapObject grid:
+ var gridXform = Transform(grid.Entity);
+ Entity gridEnt = (grid.Entity, null, gridXform);
+ return new MapCoordinates(Maps.GetGridPosition(gridEnt), gridXform.MapID);
+ default:
+ throw new ArgumentOutOfRangeException();
+ }
+ }
+}
diff --git a/Content.Client/Shuttles/UI/BaseShuttleControl.xaml b/Content.Client/Shuttles/UI/BaseShuttleControl.xaml
new file mode 100644
index 00000000000..c3c18021660
--- /dev/null
+++ b/Content.Client/Shuttles/UI/BaseShuttleControl.xaml
@@ -0,0 +1,2 @@
+
diff --git a/Content.Client/Shuttles/UI/BaseShuttleControl.xaml.cs b/Content.Client/Shuttles/UI/BaseShuttleControl.xaml.cs
new file mode 100644
index 00000000000..035823af430
--- /dev/null
+++ b/Content.Client/Shuttles/UI/BaseShuttleControl.xaml.cs
@@ -0,0 +1,324 @@
+using Content.Client.UserInterface.Controls;
+using Content.Shared.Shuttles.Components;
+using Robust.Client.AutoGenerated;
+using Robust.Client.Graphics;
+using Robust.Client.ResourceManagement;
+using Robust.Client.UserInterface.XAML;
+using Robust.Shared.Map.Components;
+using Robust.Shared.Physics;
+using Robust.Shared.Threading;
+using Robust.Shared.Timing;
+using Robust.Shared.Utility;
+using Vector2 = System.Numerics.Vector2;
+
+namespace Content.Client.Shuttles.UI;
+
+///
+/// Provides common functionality for radar-like displays on shuttle consoles.
+///
+[GenerateTypedNameReferences]
+[Virtual]
+public partial class BaseShuttleControl : MapGridControl
+{
+ [Dependency] private readonly IParallelManager _parallel = default!;
+ protected readonly SharedMapSystem Maps;
+
+ protected readonly Font Font;
+
+ private GridDrawJob _drawJob;
+
+ // Cache grid drawing data as it can be expensive to build
+ public readonly Dictionary GridData = new();
+
+ // Per-draw caching
+ private readonly List _gridTileList = new();
+ private readonly HashSet _gridNeighborSet = new();
+ private readonly List<(Vector2 Start, Vector2 End)> _edges = new();
+
+ private Vector2[] _allVertices = Array.Empty();
+
+ private (DirectionFlag, Vector2i)[] _neighborDirections;
+
+ public BaseShuttleControl() : this(32f, 32f, 32f)
+ {
+ }
+
+ public BaseShuttleControl(float minRange, float maxRange, float range) : base(minRange, maxRange, range)
+ {
+ RobustXamlLoader.Load(this);
+ Maps = EntManager.System();
+ Font = new VectorFont(IoCManager.Resolve().GetResource("/Fonts/NotoSans/NotoSans-Regular.ttf"), 12);
+
+ _drawJob = new GridDrawJob()
+ {
+ ScaledVertices = _allVertices,
+ };
+
+ _neighborDirections = new (DirectionFlag, Vector2i)[4];
+
+ for (var i = 0; i < 4; i++)
+ {
+ var dir = (DirectionFlag) Math.Pow(2, i);
+ var dirVec = dir.AsDir().ToIntVec();
+ _neighborDirections[i] = (dir, dirVec);
+ }
+ }
+
+ protected void DrawData(DrawingHandleScreen handle, string text)
+ {
+ var coordsDimensions = handle.GetDimensions(Font, text, UIScale);
+ const float coordsMargins = 5f;
+
+ handle.DrawString(Font,
+ new Vector2(coordsMargins, Height) - new Vector2(0f, coordsDimensions.Y + coordsMargins),
+ text,
+ Color.FromSrgb(IFFComponent.SelfColor));
+ }
+
+ protected void DrawCircles(DrawingHandleScreen handle)
+ {
+ // Equatorial lines
+ var gridLines = Color.LightGray.WithAlpha(0.01f);
+
+ // Each circle is this x distance of the last one.
+ const float EquatorialMultiplier = 2f;
+
+ var minDistance = MathF.Pow(EquatorialMultiplier, EquatorialMultiplier * 1.5f);
+ var maxDistance = MathF.Pow(2f, EquatorialMultiplier * 6f);
+ var cornerDistance = MathF.Sqrt(WorldRange * WorldRange + WorldRange * WorldRange);
+
+ var origin = ScalePosition(-new Vector2(Offset.X, -Offset.Y));
+ var distOffset = -24f;
+
+ for (var radius = minDistance; radius <= maxDistance; radius *= EquatorialMultiplier)
+ {
+ if (radius > cornerDistance)
+ continue;
+
+ var color = Color.ToSrgb(gridLines).WithAlpha(0.05f);
+ var scaledRadius = MinimapScale * radius;
+ var text = $"{radius:0}m";
+ var textDimensions = handle.GetDimensions(Font, text, UIScale);
+
+ handle.DrawCircle(origin, scaledRadius, color, false);
+ handle.DrawString(Font, ScalePosition(new Vector2(0f, -radius)) - new Vector2(0f, textDimensions.Y), text, color);
+ }
+
+ const int gridLinesRadial = 8;
+
+ for (var i = 0; i < gridLinesRadial; i++)
+ {
+ Angle angle = (Math.PI / gridLinesRadial) * i;
+ // TODO: Handle distance properly.
+ var aExtent = angle.ToVec() * ScaledMinimapRadius * 1.42f;
+ var lineColor = Color.MediumSpringGreen.WithAlpha(0.02f);
+ handle.DrawLine(origin - aExtent, origin + aExtent, lineColor);
+ }
+ }
+
+ protected void DrawGrid(DrawingHandleScreen handle, Matrix3 matrix, Entity grid, Color color, float alpha = 0.01f)
+ {
+ var rator = Maps.GetAllTilesEnumerator(grid.Owner, grid.Comp);
+ var minimapScale = MinimapScale;
+ var midpoint = new Vector2(MidPoint, MidPoint);
+ var tileSize = grid.Comp.TileSize;
+
+ // Check if we even have data
+ // TODO: Need to prune old grid-data if we don't draw it.
+ var gridData = GridData.GetOrNew(grid.Owner);
+
+ if (gridData.LastBuild < grid.Comp.LastTileModifiedTick)
+ {
+ gridData.Vertices.Clear();
+ _gridTileList.Clear();
+ _gridNeighborSet.Clear();
+
+ // Okay so there's 2 steps to this
+ // 1. Is that get we get a set of all tiles. This is used to decompose into triangle-strips
+ // 2. Is that we get a list of all tiles. This is used for edge data to decompose into line-strips.
+ while (rator.MoveNext(out var tileRef))
+ {
+ var index = tileRef.Value.GridIndices;
+ _gridNeighborSet.Add(index);
+ _gridTileList.Add(index);
+
+ var bl = Maps.TileToVector(grid, index);
+ var br = bl + new Vector2(tileSize, 0f);
+ var tr = bl + new Vector2(tileSize, tileSize);
+ var tl = bl + new Vector2(0f, tileSize);
+
+ gridData.Vertices.Add(bl);
+ gridData.Vertices.Add(br);
+ gridData.Vertices.Add(tl);
+
+ gridData.Vertices.Add(br);
+ gridData.Vertices.Add(tl);
+ gridData.Vertices.Add(tr);
+ }
+
+ gridData.EdgeIndex = gridData.Vertices.Count;
+ _edges.Clear();
+
+ foreach (var index in _gridTileList)
+ {
+ // We get all of the raw lines up front
+ // then we decompose them into longer lines in a separate step.
+ foreach (var (dir, dirVec) in _neighborDirections)
+ {
+ var neighbor = index + dirVec;
+
+ if (_gridNeighborSet.Contains(neighbor))
+ continue;
+
+ var bl = Maps.TileToVector(grid, index);
+ var br = bl + new Vector2(tileSize, 0f);
+ var tr = bl + new Vector2(tileSize, tileSize);
+ var tl = bl + new Vector2(0f, tileSize);
+
+ // Could probably rotate this but this might be faster?
+ Vector2 actualStart;
+ Vector2 actualEnd;
+
+ switch (dir)
+ {
+ case DirectionFlag.South:
+ actualStart = bl;
+ actualEnd = br;
+ break;
+ case DirectionFlag.East:
+ actualStart = br;
+ actualEnd = tr;
+ break;
+ case DirectionFlag.North:
+ actualStart = tr;
+ actualEnd = tl;
+ break;
+ case DirectionFlag.West:
+ actualStart = tl;
+ actualEnd = bl;
+ break;
+ default:
+ throw new NotImplementedException();
+ }
+
+ _edges.Add((actualStart, actualEnd));
+ }
+ }
+
+ // Decompose the edges into longer lines to save data.
+ // Now we decompose the lines into longer lines (less data to send to the GPU)
+ var decomposed = true;
+
+ while (decomposed)
+ {
+ decomposed = false;
+
+ for (var i = 0; i < _edges.Count; i++)
+ {
+ var (start, end) = _edges[i];
+ var neighborFound = false;
+ var neighborIndex = 0;
+ Vector2 neighborStart;
+ Vector2 neighborEnd = Vector2.Zero;
+
+ // Does our end correspond with another start?
+ for (var j = i + 1; j < _edges.Count; j++)
+ {
+ (neighborStart, neighborEnd) = _edges[j];
+
+ if (!end.Equals(neighborStart))
+ continue;
+
+ neighborFound = true;
+ neighborIndex = j;
+ break;
+ }
+
+ if (!neighborFound)
+ continue;
+
+ // Check if our start and the neighbor's end are collinear
+ if (!CollinearSimplifier.IsCollinear(start, end, neighborEnd, 10f * float.Epsilon))
+ continue;
+
+ decomposed = true;
+ _edges[i] = (start, neighborEnd);
+ _edges.RemoveAt(neighborIndex);
+ }
+ }
+
+ gridData.Vertices.EnsureCapacity(_edges.Count * 2);
+
+ foreach (var edge in _edges)
+ {
+ gridData.Vertices.Add(edge.Start);
+ gridData.Vertices.Add(edge.End);
+ }
+
+ gridData.LastBuild = grid.Comp.LastTileModifiedTick;
+ }
+
+ var totalData = gridData.Vertices.Count;
+ var triCount = gridData.EdgeIndex;
+ var edgeCount = totalData - gridData.EdgeIndex;
+ Extensions.EnsureLength(ref _allVertices, totalData);
+
+ _drawJob.MidPoint = midpoint;
+ _drawJob.Matrix = matrix;
+ _drawJob.MinimapScale = minimapScale;
+ _drawJob.Vertices = gridData.Vertices;
+ _drawJob.ScaledVertices = _allVertices;
+
+ _parallel.ProcessNow(_drawJob, totalData);
+
+ const float BatchSize = 3f * 4096;
+
+ for (var i = 0; i < Math.Ceiling(triCount / BatchSize); i++)
+ {
+ var start = (int) (i * BatchSize);
+ var end = (int) Math.Min(triCount, start + BatchSize);
+ var count = end - start;
+ handle.DrawPrimitives(DrawPrimitiveTopology.TriangleList, new Span(_allVertices, start, count), color.WithAlpha(alpha));
+ }
+
+ handle.DrawPrimitives(DrawPrimitiveTopology.LineList, new Span(_allVertices, gridData.EdgeIndex, edgeCount), color);
+ }
+
+ private record struct GridDrawJob : IParallelRobustJob
+ {
+ public int BatchSize => 16;
+
+ public float MinimapScale;
+ public Vector2 MidPoint;
+ public Matrix3 Matrix;
+
+ public List Vertices;
+ public Vector2[] ScaledVertices;
+
+ public void Execute(int index)
+ {
+ var vert = Vertices[index];
+ var adjustedVert = Matrix.Transform(vert);
+ adjustedVert = adjustedVert with { Y = -adjustedVert.Y };
+
+ var scaledVert = ScalePosition(adjustedVert, MinimapScale, MidPoint);
+ ScaledVertices[index] = scaledVert;
+ }
+ }
+}
+
+public sealed class GridDrawData
+{
+ /*
+ * List of lists because we use LineStrip and TriangleStrip respectively (less data to pass to the GPU).
+ */
+
+ public List Vertices = new();
+
+ ///
+ /// Vertices index from when edges start.
+ ///
+ public int EdgeIndex;
+
+ public GameTick LastBuild;
+}
diff --git a/Content.Client/Shuttles/UI/DockObject.xaml b/Content.Client/Shuttles/UI/DockObject.xaml
new file mode 100644
index 00000000000..bae625658b7
--- /dev/null
+++ b/Content.Client/Shuttles/UI/DockObject.xaml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/Content.Client/Shuttles/UI/DockObject.xaml.cs b/Content.Client/Shuttles/UI/DockObject.xaml.cs
new file mode 100644
index 00000000000..9dae6b7a4d3
--- /dev/null
+++ b/Content.Client/Shuttles/UI/DockObject.xaml.cs
@@ -0,0 +1,61 @@
+using System.Text;
+using Content.Shared.Shuttles.BUIStates;
+using Content.Shared.Shuttles.Systems;
+using Robust.Client.AutoGenerated;
+using Robust.Client.Graphics;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.XAML;
+using Robust.Shared.Map;
+
+namespace Content.Client.Shuttles.UI;
+
+[GenerateTypedNameReferences]
+public sealed partial class DockObject : PanelContainer
+{
+ public event Action? UndockPressed;
+ public event Action? ViewPressed;
+
+ public BoxContainer ContentsContainer => Contents;
+
+ public DockObject()
+ {
+ RobustXamlLoader.Load(this);
+ IoCManager.InjectDependencies(this);
+
+ PanelOverride = new StyleBoxFlat(new Color(30, 30, 34));
+ }
+
+ public void AddDock(DockingPortState state, ShuttleDockControl dockControl)
+ {
+ var viewButton = new Button()
+ {
+ Text = Loc.GetString("shuttle-console-view"),
+ };
+
+ viewButton.OnPressed += args =>
+ {
+ dockControl.SetViewedDock(state);
+ };
+
+ var container = new BoxContainer()
+ {
+ Orientation = BoxContainer.LayoutOrientation.Vertical,
+ Children =
+ {
+ new Label()
+ {
+ Text = state.Name,
+ HorizontalAlignment = HAlignment.Center,
+ },
+ viewButton
+ }
+ };
+
+ DockContainer.AddChild(container);
+ }
+
+ public void SetName(string value)
+ {
+ DockedLabel.Text = value;
+ }
+}
diff --git a/Content.Client/Shuttles/UI/DockingControl.cs b/Content.Client/Shuttles/UI/DockingControl.cs
deleted file mode 100644
index c0ddeff86c2..00000000000
--- a/Content.Client/Shuttles/UI/DockingControl.cs
+++ /dev/null
@@ -1,272 +0,0 @@
-using System.Numerics;
-using Content.Client.UserInterface.Controls;
-using Content.Shared.Shuttles.BUIStates;
-using Robust.Client.Graphics;
-using Robust.Client.UserInterface;
-using Robust.Shared.Map;
-using Robust.Shared.Map.Components;
-using Robust.Shared.Physics;
-using Robust.Shared.Physics.Collision.Shapes;
-
-namespace Content.Client.Shuttles.UI;
-
-///
-/// Displays the docking view from a specific docking port
-///
-[Virtual]
-public class DockingControl : Control
-{
- private readonly IEntityManager _entManager;
- private readonly IMapManager _mapManager;
-
- private float _range = 8f;
- private float _rangeSquared = 0f;
-
- private Vector2 RangeVector => new Vector2(_range, _range);
-
- private const float GridLinesDistance = 32f;
-
- private int MidPoint => SizeFull / 2;
- private Vector2 MidPointVector => new Vector2(MidPoint, MidPoint);
-
- private int SizeFull => (int) (MapGridControl.UIDisplayRadius * 2 * UIScale);
- private int ScaledMinimapRadius => (int) (MapGridControl.UIDisplayRadius * UIScale);
- private float MinimapScale => _range != 0 ? ScaledMinimapRadius / _range : 0f;
-
- public NetEntity? ViewedDock;
- public EntityUid? GridEntity;
-
- public EntityCoordinates? Coordinates;
- public Angle? Angle;
-
- ///
- /// Stored by GridID then by docks
- ///
- public Dictionary> Docks = new();
-
- private List> _grids = new();
-
- public DockingControl()
- {
- _entManager = IoCManager.Resolve();
- _mapManager = IoCManager.Resolve();
- _rangeSquared = _range * _range;
- MinSize = new Vector2(SizeFull, SizeFull);
- }
-
- protected override void Draw(DrawingHandleScreen handle)
- {
- base.Draw(handle);
-
- var fakeAA = new Color(0.08f, 0.08f, 0.08f);
-
- handle.DrawCircle(new Vector2(MidPoint, MidPoint), ScaledMinimapRadius + 1, fakeAA);
- handle.DrawCircle(new Vector2(MidPoint, MidPoint), ScaledMinimapRadius, Color.Black);
-
- var gridLines = new Color(0.08f, 0.08f, 0.08f);
- var gridLinesRadial = 8;
- var gridLinesEquatorial = (int) Math.Floor(_range / GridLinesDistance);
-
- for (var i = 1; i < gridLinesEquatorial + 1; i++)
- {
- handle.DrawCircle(new Vector2(MidPoint, MidPoint), GridLinesDistance * MinimapScale * i, gridLines, false);
- }
-
- for (var i = 0; i < gridLinesRadial; i++)
- {
- Angle angle = (Math.PI / gridLinesRadial) * i;
- var aExtent = angle.ToVec() * ScaledMinimapRadius;
- handle.DrawLine(new Vector2(MidPoint, MidPoint) - aExtent, new Vector2(MidPoint, MidPoint) + aExtent, gridLines);
- }
-
- if (Coordinates == null ||
- Angle == null ||
- !_entManager.TryGetComponent(GridEntity, out var gridXform)) return;
-
- var rotation = Matrix3.CreateRotation(-Angle.Value + Math.PI);
- var matrix = Matrix3.CreateTranslation(-Coordinates.Value.Position);
-
- // Draw the fixtures around the dock before drawing it
- if (_entManager.TryGetComponent(GridEntity, out var fixtures))
- {
- foreach (var fixture in fixtures.Fixtures.Values)
- {
- var poly = (PolygonShape) fixture.Shape;
-
- for (var i = 0; i < poly.VertexCount; i++)
- {
- var start = matrix.Transform(poly.Vertices[i]);
- var end = matrix.Transform(poly.Vertices[(i + 1) % poly.VertexCount]);
-
- var startOut = start.LengthSquared() > _rangeSquared;
- var endOut = end.LengthSquared() > _rangeSquared;
-
- // We need to draw to the radar border so we'll cap the range,
- // but if none of the verts are in range then just leave it.
- if (startOut && endOut)
- continue;
-
- start.Y = -start.Y;
- end.Y = -end.Y;
-
- // If start is outside we draw capped from end to start
- if (startOut)
- {
- // It's called Jobseeker now.
- if (!MathHelper.TryGetIntersecting(start, end, _range, out var newStart))
- continue;
-
- start = newStart.Value;
- }
- // otherwise vice versa
- else if (endOut)
- {
- if (!MathHelper.TryGetIntersecting(end, start, _range, out var newEnd))
- continue;
-
- end = newEnd.Value;
- }
-
- handle.DrawLine(ScalePosition(start), ScalePosition(end), Color.Goldenrod);
- }
- }
- }
-
- // Draw the dock's collision
- handle.DrawRect(new UIBox2(
- ScalePosition(rotation.Transform(new Vector2(-0.2f, -0.7f))),
- ScalePosition(rotation.Transform(new Vector2(0.2f, -0.5f)))), Color.Aquamarine);
-
- // Draw the dock itself
- handle.DrawRect(new UIBox2(
- ScalePosition(rotation.Transform(new Vector2(-0.5f, 0.5f))),
- ScalePosition(rotation.Transform(new Vector2(0.5f, -0.5f)))), Color.Green);
-
- // Draw nearby grids
- var worldPos = gridXform.WorldMatrix.Transform(Coordinates.Value.Position);
- var gridInvMatrix = gridXform.InvWorldMatrix;
- Matrix3.Multiply(in gridInvMatrix, in matrix, out var invMatrix);
-
- // TODO: Getting some overdraw so need to fix that.
- var xformQuery = _entManager.GetEntityQuery();
-
- _grids.Clear();
- _mapManager.FindGridsIntersecting(gridXform.MapID, new Box2(worldPos - RangeVector, worldPos + RangeVector), ref _grids);
-
- foreach (var grid in _grids)
- {
- if (grid.Owner == GridEntity)
- continue;
-
- // Draw the fixtures before drawing any docks in range.
- if (!_entManager.TryGetComponent(grid, out var gridFixtures))
- continue;
-
- var gridMatrix = xformQuery.GetComponent(grid).WorldMatrix;
-
- Matrix3.Multiply(in gridMatrix, in invMatrix, out var matty);
-
- foreach (var (_, fixture) in gridFixtures.Fixtures)
- {
- var poly = (PolygonShape) fixture.Shape;
-
- for (var i = 0; i < poly.VertexCount; i++)
- {
- // This is because the same line might be on different fixtures so we don't want to draw it twice.
- var startPos = poly.Vertices[i];
- var endPos = poly.Vertices[(i + 1) % poly.VertexCount];
-
- var start = matty.Transform(startPos);
- var end = matty.Transform(endPos);
-
- var startOut = start.LengthSquared() > _rangeSquared;
- var endOut = end.LengthSquared() > _rangeSquared;
-
- // We need to draw to the radar border so we'll cap the range,
- // but if none of the verts are in range then just leave it.
- if (startOut && endOut)
- continue;
-
- start.Y = -start.Y;
- end.Y = -end.Y;
-
- // If start is outside we draw capped from end to start
- if (startOut)
- {
- // It's called Jobseeker now.
- if (!MathHelper.TryGetIntersecting(start, end, _range, out var newStart)) continue;
- start = newStart.Value;
- }
- // otherwise vice versa
- else if (endOut)
- {
- if (!MathHelper.TryGetIntersecting(end, start, _range, out var newEnd)) continue;
- end = newEnd.Value;
- }
-
- handle.DrawLine(ScalePosition(start), ScalePosition(end), Color.Aquamarine);
- }
- }
-
- // Draw any docks on that grid
- if (Docks.TryGetValue(_entManager.GetNetEntity(grid), out var gridDocks))
- {
- foreach (var dock in gridDocks)
- {
- var position = matty.Transform(dock.Coordinates.Position);
-
- if (position.Length() > _range - 0.8f)
- continue;
-
- var otherDockRotation = Matrix3.CreateRotation(dock.Angle);
-
- // Draw the dock's collision
- var verts = new[]
- {
- matty.Transform(dock.Coordinates.Position +
- otherDockRotation.Transform(new Vector2(-0.2f, -0.7f))),
- matty.Transform(dock.Coordinates.Position +
- otherDockRotation.Transform(new Vector2(0.2f, -0.7f))),
- matty.Transform(dock.Coordinates.Position +
- otherDockRotation.Transform(new Vector2(0.2f, -0.5f))),
- matty.Transform(dock.Coordinates.Position +
- otherDockRotation.Transform(new Vector2(-0.2f, -0.5f))),
- };
-
- for (var i = 0; i < verts.Length; i++)
- {
- var vert = verts[i];
- vert.Y = -vert.Y;
- verts[i] = ScalePosition(vert);
- }
-
- handle.DrawPrimitives(DrawPrimitiveTopology.TriangleFan, verts, Color.Turquoise);
-
- // Draw the dock itself
- verts = new[]
- {
- matty.Transform(dock.Coordinates.Position + new Vector2(-0.5f, -0.5f)),
- matty.Transform(dock.Coordinates.Position + new Vector2(0.5f, -0.5f)),
- matty.Transform(dock.Coordinates.Position + new Vector2(0.5f, 0.5f)),
- matty.Transform(dock.Coordinates.Position + new Vector2(-0.5f, 0.5f)),
- };
-
- for (var i = 0; i < verts.Length; i++)
- {
- var vert = verts[i];
- vert.Y = -vert.Y;
- verts[i] = ScalePosition(vert);
- }
-
- handle.DrawPrimitives(DrawPrimitiveTopology.TriangleFan, verts, Color.Green);
- }
- }
- }
-
- }
-
- private Vector2 ScalePosition(Vector2 value)
- {
- return value * MinimapScale + MidPointVector;
- }
-}
diff --git a/Content.Client/Shuttles/UI/DockingScreen.xaml b/Content.Client/Shuttles/UI/DockingScreen.xaml
new file mode 100644
index 00000000000..7c112b6daf5
--- /dev/null
+++ b/Content.Client/Shuttles/UI/DockingScreen.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Content.Client/Shuttles/UI/DockingScreen.xaml.cs b/Content.Client/Shuttles/UI/DockingScreen.xaml.cs
new file mode 100644
index 00000000000..c0aa7942148
--- /dev/null
+++ b/Content.Client/Shuttles/UI/DockingScreen.xaml.cs
@@ -0,0 +1,183 @@
+using System.Linq;
+using System.Numerics;
+using System.Text;
+using Content.Shared.Shuttles.BUIStates;
+using Content.Shared.Shuttles.Systems;
+using Robust.Client.AutoGenerated;
+using Robust.Client.UserInterface;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.XAML;
+using Robust.Shared.Utility;
+
+namespace Content.Client.Shuttles.UI;
+
+[GenerateTypedNameReferences]
+public sealed partial class DockingScreen : BoxContainer
+{
+ [Dependency] private readonly IEntityManager _entManager = default!;
+ private readonly SharedShuttleSystem _shuttles;
+
+ ///
+ /// Stored by GridID then by docks
+ ///
+ public Dictionary> Docks = new();
+
+ ///
+ /// Store the dock buttons for the side buttons.
+ ///
+ private readonly Dictionary _ourDockButtons = new();
+
+ public event Action? DockRequest;
+ public event Action? UndockRequest;
+
+ public DockingScreen()
+ {
+ RobustXamlLoader.Load(this);
+ IoCManager.InjectDependencies(this);
+ _shuttles = _entManager.System();
+
+ DockingControl.OnViewDock += OnView;
+ DockingControl.DockRequest += (entity, netEntity) =>
+ {
+ DockRequest?.Invoke(entity, netEntity);
+ };
+ DockingControl.UndockRequest += entity =>
+ {
+ UndockRequest?.Invoke(entity);
+ };
+ }
+
+ private void OnView(NetEntity obj)
+ {
+ if (_ourDockButtons.TryGetValue(obj, out var viewed))
+ {
+ viewed.Pressed = true;
+ }
+ }
+
+ public void UpdateState(EntityUid? shuttle, DockingInterfaceState state)
+ {
+ Docks = state.Docks;
+ DockingControl.DockState = state;
+ DockingControl.GridEntity = shuttle;
+ BuildDocks(shuttle);
+ }
+
+ private void BuildDocks(EntityUid? shuttle)
+ {
+ DockingControl.BuildDocks(shuttle);
+ var currentDock = DockingControl.ViewedDock;
+ // DockedWith.DisposeAllChildren();
+ DockPorts.DisposeAllChildren();
+ _ourDockButtons.Clear();
+
+ if (shuttle == null)
+ {
+ DockingControl.SetViewedDock(null);
+ return;
+ }
+
+ var shuttleNent = _entManager.GetNetEntity(shuttle.Value);
+
+ if (!Docks.TryGetValue(shuttleNent, out var shuttleDocks) || shuttleDocks.Count <= 0)
+ return;
+
+ var dockText = new StringBuilder();
+ var buttonGroup = new ButtonGroup();
+ var idx = 0;
+ var selected = false;
+
+ // Build the dock buttons for our docks.
+ foreach (var dock in shuttleDocks)
+ {
+ idx++;
+ dockText.Clear();
+ dockText.Append(dock.Name);
+
+ var button = new Button()
+ {
+ Text = dockText.ToString(),
+ ToggleMode = true,
+ Group = buttonGroup,
+ Margin = new Thickness(0f, 3f),
+ };
+
+ button.OnMouseEntered += args =>
+ {
+ DockingControl.HighlightedDock = dock.Entity;
+ };
+
+ button.OnMouseExited += args =>
+ {
+ DockingControl.HighlightedDock = null;
+ };
+
+ button.Label.Margin = new Thickness(3f);
+
+ if (currentDock == dock.Entity)
+ {
+ selected = true;
+ button.Pressed = true;
+ }
+
+ button.OnPressed += args =>
+ {
+ OnDockPress(dock);
+ };
+
+ _ourDockButtons[dock.Entity] = button;
+ DockPorts.AddChild(button);
+ }
+
+ // Button group needs one selected so just show the first one.
+ if (!selected)
+ {
+ var buttonOne = shuttleDocks[0];
+ OnDockPress(buttonOne);
+ }
+
+ var shuttleContainers = new Dictionary();
+
+ foreach (var dock in shuttleDocks.OrderBy(x => x.GridDockedWith))
+ {
+ if (dock.GridDockedWith == null)
+ continue;
+
+ DockObject? dockContainer;
+
+ if (!shuttleContainers.TryGetValue(dock.GridDockedWith.Value, out dockContainer))
+ {
+ dockContainer = new DockObject();
+ shuttleContainers[dock.GridDockedWith.Value] = dockContainer;
+ var dockGrid = _entManager.GetEntity(dock.GridDockedWith);
+ string? iffLabel = null;
+
+ if (_entManager.EntityExists(dockGrid))
+ {
+ iffLabel = _shuttles.GetIFFLabel(dockGrid.Value);
+ }
+
+ iffLabel ??= Loc.GetString("shuttle-console-unknown");
+ dockContainer.SetName(iffLabel);
+ // DockedWith.AddChild(dockContainer);
+ }
+
+ dockContainer.AddDock(dock, DockingControl);
+
+ dockContainer.ViewPressed += () =>
+ {
+ OnDockPress(dock);
+ };
+
+ dockContainer.UndockPressed += () =>
+ {
+ UndockRequest?.Invoke(dock.Entity);
+ };
+ }
+ }
+
+ private void OnDockPress(DockingPortState state)
+ {
+ DockingControl.SetViewedDock(state);
+ }
+}
diff --git a/Content.Client/Shuttles/UI/MapScreen.xaml b/Content.Client/Shuttles/UI/MapScreen.xaml
new file mode 100644
index 00000000000..7db61b9e349
--- /dev/null
+++ b/Content.Client/Shuttles/UI/MapScreen.xaml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Content.Client/Shuttles/UI/MapScreen.xaml.cs b/Content.Client/Shuttles/UI/MapScreen.xaml.cs
new file mode 100644
index 00000000000..8287093f78e
--- /dev/null
+++ b/Content.Client/Shuttles/UI/MapScreen.xaml.cs
@@ -0,0 +1,531 @@
+using System.Linq;
+using System.Numerics;
+using Content.Client.Shuttles.Systems;
+using Content.Shared.Shuttles.BUIStates;
+using Content.Shared.Shuttles.Components;
+using Content.Shared.Shuttles.Systems;
+using Content.Shared.Shuttles.UI.MapObjects;
+using Robust.Client.AutoGenerated;
+using Robust.Client.Graphics;
+using Robust.Client.UserInterface;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.XAML;
+using Robust.Shared.Audio;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Map;
+using Robust.Shared.Map.Components;
+using Robust.Shared.Physics.Components;
+using Robust.Shared.Player;
+using Robust.Shared.Random;
+using Robust.Shared.Timing;
+using Robust.Shared.Utility;
+
+namespace Content.Client.Shuttles.UI;
+
+[GenerateTypedNameReferences]
+public sealed partial class MapScreen : BoxContainer
+{
+ [Dependency] private readonly IEntityManager _entManager = default!;
+ [Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly IMapManager _mapManager = default!;
+ [Dependency] private readonly IRobustRandom _random = default!;
+ private readonly SharedAudioSystem _audio;
+ private readonly SharedMapSystem _maps;
+ private readonly ShuttleSystem _shuttles;
+ private readonly SharedTransformSystem _xformSystem;
+
+ private EntityUid? _console;
+ private EntityUid? _shuttleEntity;
+
+ private FTLState _state;
+ private float _ftlDuration;
+
+ private List _beacons = new();
+ private List _exclusions = new();
+
+ ///
+ /// When the next FTL state change happens.
+ ///
+ private TimeSpan _nextFtlTime;
+
+ private TimeSpan _nextPing;
+ private TimeSpan _pingCooldown = TimeSpan.FromSeconds(3);
+ private TimeSpan _nextMapDequeue;
+
+ private float _minMapDequeue = 0.05f;
+ private float _maxMapDequeue = 0.25f;
+
+ private StyleBoxFlat _ftlStyle;
+
+ public event Action? RequestFTL;
+ public event Action? RequestBeaconFTL;
+
+ private readonly Dictionary _mapHeadings = new();
+ private readonly Dictionary> _mapObjects = new();
+ private readonly List<(MapId mapId, IMapObject mapobj)> _pendingMapObjects = new();
+
+ ///
+ /// Store the names of map object controls for re-sorting later.
+ ///
+ private Dictionary _mapObjectControls = new();
+
+ private List _sortChildren = new();
+
+ public MapScreen()
+ {
+ RobustXamlLoader.Load(this);
+ IoCManager.InjectDependencies(this);
+
+ _audio = _entManager.System();
+ _maps = _entManager.System();
+ _shuttles = _entManager.System();
+ _xformSystem = _entManager.System();
+
+ MapRebuildButton.OnPressed += MapRebuildPressed;
+
+ OnVisibilityChanged += OnVisChange;
+
+ MapFTLButton.OnToggled += FtlPreviewToggled;
+
+ _ftlStyle = new StyleBoxFlat(Color.LimeGreen);
+ FTLBar.ForegroundStyleBoxOverride = _ftlStyle;
+
+ // Just pass it on up.
+ MapRadar.RequestFTL += (coords, angle) =>
+ {
+ RequestFTL?.Invoke(coords, angle);
+ };
+
+ MapRadar.RequestBeaconFTL += (ent, angle) =>
+ {
+ RequestBeaconFTL?.Invoke(ent, angle);
+ };
+
+ MapBeaconsButton.OnToggled += args =>
+ {
+ MapRadar.ShowBeacons = args.Pressed;
+ };
+ }
+
+ public void UpdateState(ShuttleMapInterfaceState state)
+ {
+ // Only network the accumulator due to ping making the thing fonky.
+ // This should work better with predicting network states as they come in.
+ _beacons = state.Destinations;
+ _exclusions = state.Exclusions;
+ _state = state.FTLState;
+ _ftlDuration = state.FTLDuration;
+ _nextFtlTime = _timing.CurTime + TimeSpan.FromSeconds(_ftlDuration);
+ MapRadar.InFtl = true;
+ MapFTLState.Text = Loc.GetString($"shuttle-console-ftl-state-{_state.ToString()}");
+
+ switch (_state)
+ {
+ case FTLState.Available:
+ SetFTLAllowed(true);
+ _ftlStyle.BackgroundColor = Color.FromHex("#80C71F");
+ MapRadar.InFtl = false;
+ break;
+ case FTLState.Starting:
+ SetFTLAllowed(false);
+ _ftlStyle.BackgroundColor = Color.FromHex("#169C9C");
+ break;
+ case FTLState.Travelling:
+ SetFTLAllowed(false);
+ _ftlStyle.BackgroundColor = Color.FromHex("#8932B8");
+ break;
+ case FTLState.Arriving:
+ SetFTLAllowed(false);
+ _ftlStyle.BackgroundColor = Color.FromHex("#F9801D");
+ break;
+ case FTLState.Cooldown:
+ SetFTLAllowed(false);
+ // Scroll to the FTL spot
+ if (_entManager.TryGetComponent(_shuttleEntity, out TransformComponent? shuttleXform))
+ {
+ var targetOffset = _maps.GetGridPosition(_shuttleEntity.Value);
+ MapRadar.SetMap(shuttleXform.MapID, targetOffset, recentering: true);
+ }
+
+ _ftlStyle.BackgroundColor = Color.FromHex("#B02E26");
+ MapRadar.InFtl = false;
+ break;
+ default:
+ throw new NotImplementedException();
+ }
+
+ if (IsFTLBlocked())
+ {
+ MapRebuildButton.Disabled = true;
+ ClearMapObjects();
+ }
+ }
+
+ private void SetFTLAllowed(bool value)
+ {
+ if (value)
+ {
+ MapFTLButton.Disabled = false;
+ }
+ else
+ {
+ // Unselect FTL
+ MapFTLButton.Pressed = false;
+ MapRadar.FtlMode = false;
+ MapFTLButton.Disabled = true;
+ }
+ }
+
+ private void FtlPreviewToggled(BaseButton.ButtonToggledEventArgs obj)
+ {
+ MapRadar.FtlMode = obj.Pressed;
+ }
+
+ public void SetConsole(EntityUid? console)
+ {
+ _console = console;
+ }
+
+ public void SetShuttle(EntityUid? shuttle)
+ {
+ _shuttleEntity = shuttle;
+ MapRadar.SetShuttle(shuttle);
+ }
+
+ private void OnVisChange(Control obj)
+ {
+ if (!obj.Visible)
+ return;
+
+ // Centre map screen to the shuttle.
+ if (_shuttleEntity != null)
+ {
+ var mapPos = _xformSystem.GetMapCoordinates(_shuttleEntity.Value);
+ MapRadar.SetMap(mapPos.MapId, mapPos.Position);
+ }
+ }
+
+ ///
+ /// Does a sonar-like effect on the map.
+ ///
+ public void PingMap()
+ {
+ if (_console != null)
+ {
+ _audio.PlayEntity(new SoundPathSpecifier("/Audio/Effects/Shuttle/radar_ping.ogg"), Filter.Local(), _console.Value, true);
+ }
+
+ RebuildMapObjects();
+ BumpMapDequeue();
+
+ _nextPing = _timing.CurTime + _pingCooldown;
+ MapRebuildButton.Disabled = true;
+ }
+
+ private void BumpMapDequeue()
+ {
+ _nextMapDequeue = _timing.CurTime + TimeSpan.FromSeconds(_random.NextFloat(_minMapDequeue, _maxMapDequeue));
+ }
+
+ private void MapRebuildPressed(BaseButton.ButtonEventArgs obj)
+ {
+ PingMap();
+ }
+
+ ///
+ /// Clears all sector objects across all maps (e.g. if we start FTLing or need to re-ping).
+ ///
+ private void ClearMapObjects()
+ {
+ _mapObjectControls.Clear();
+ HyperspaceDestinations.DisposeAllChildren();
+ _pendingMapObjects.Clear();
+ _mapObjects.Clear();
+ _mapHeadings.Clear();
+ }
+
+ ///
+ /// Gets all map objects at time of ping and adds them to pending to be added over time.
+ ///
+ private void RebuildMapObjects()
+ {
+ ClearMapObjects();
+
+ if (_shuttleEntity == null)
+ return;
+
+ var mapComps = _entManager.AllEntityQueryEnumerator();
+ MapId ourMap = MapId.Nullspace;
+
+ if (_entManager.TryGetComponent(_shuttleEntity, out TransformComponent? shuttleXform))
+ {
+ ourMap = shuttleXform.MapID;
+ }
+
+ while (mapComps.MoveNext(out var mapComp, out var mapXform, out var mapMetadata))
+ {
+ if (!_shuttles.CanFTLTo(_shuttleEntity.Value, mapComp.MapId))
+ continue;
+
+ var mapName = mapMetadata.EntityName;
+
+ if (string.IsNullOrEmpty(mapName))
+ {
+ mapName = Loc.GetString("shuttle-console-unknown");
+ }
+
+ var heading = new CollapsibleHeading(mapName);
+
+ heading.MinHeight = 32f;
+ heading.AddStyleClass(ContainerButton.StyleClassButton);
+ heading.HorizontalAlignment = HAlignment.Stretch;
+ heading.Label.HorizontalAlignment = HAlignment.Center;
+ heading.Label.HorizontalExpand = true;
+ heading.HorizontalExpand = true;
+
+ var gridContents = new BoxContainer()
+ {
+ Orientation = LayoutOrientation.Vertical,
+ VerticalExpand = true,
+ };
+
+ var body = new CollapsibleBody()
+ {
+ HorizontalAlignment = HAlignment.Stretch,
+ VerticalAlignment = VAlignment.Top,
+ HorizontalExpand = true,
+ Children =
+ {
+ gridContents
+ }
+ };
+
+ var mapButton = new Collapsible(heading, body);
+
+ heading.OnToggled += args =>
+ {
+ if (args.Pressed)
+ {
+ HideOtherCollapsibles(mapButton);
+ }
+ };
+
+ _mapHeadings.Add(mapComp.MapId, gridContents);
+
+ foreach (var grid in _mapManager.GetAllMapGrids(mapComp.MapId))
+ {
+ var gridObj = new GridMapObject()
+ {
+ Name = _entManager.GetComponent(grid.Owner).EntityName,
+ Entity = grid.Owner
+ };
+
+ // Always show our shuttle immediately
+ if (grid.Owner == _shuttleEntity)
+ {
+ AddMapObject(mapComp.MapId, gridObj);
+ }
+ else
+ {
+ _pendingMapObjects.Add((mapComp.MapId, gridObj));
+ }
+ }
+
+ foreach (var (beacon, _) in _shuttles.GetExclusions(mapComp.MapId, _exclusions))
+ {
+ _pendingMapObjects.Add((mapComp.MapId, beacon));
+ }
+
+ foreach (var (beacon, _) in _shuttles.GetBeacons(mapComp.MapId, _beacons))
+ {
+ _pendingMapObjects.Add((mapComp.MapId, beacon));
+ }
+
+ HyperspaceDestinations.AddChild(mapButton);
+
+ // Zoom in to our map
+ if (mapComp.MapId == MapRadar.ViewingMap)
+ {
+ mapButton.BodyVisible = true;
+ }
+ }
+
+ // Need to sort from furthest way to nearest (as we will pop from the end of the list first).
+ // Also prioritise those on our map first.
+ var shuttlePos = _xformSystem.GetWorldPosition(_shuttleEntity.Value);
+
+ _pendingMapObjects.Sort((x, y) =>
+ {
+ if (x.mapId == ourMap && y.mapId != ourMap)
+ return 1;
+
+ if (y.mapId == ourMap && x.mapId != ourMap)
+ return -1;
+
+ var yMapPos = _shuttles.GetMapCoordinates(y.mapobj);
+ var xMapPos = _shuttles.GetMapCoordinates(x.mapobj);
+
+ return (yMapPos.Position - shuttlePos).Length().CompareTo((xMapPos.Position - shuttlePos).Length());
+ });
+ }
+
+ ///
+ /// Hides other maps upon the specified collapsible being selected (AKA hacky collapsible groups).
+ ///
+ private void HideOtherCollapsibles(Collapsible collapsible)
+ {
+ foreach (var child in HyperspaceDestinations.Children)
+ {
+ if (child is not Collapsible childCollapse || childCollapse == collapsible)
+ continue;
+
+ childCollapse.BodyVisible = false;
+ }
+ }
+
+ ///
+ /// Returns true if we shouldn't be able to select the FTL button.
+ ///
+ private bool IsFTLBlocked()
+ {
+ switch (_state)
+ {
+ case FTLState.Available:
+ return false;
+ default:
+ return true;
+ }
+ }
+
+ private void OnMapObjectPress(IMapObject mapObject)
+ {
+ if (IsFTLBlocked())
+ return;
+
+ var coordinates = _shuttles.GetMapCoordinates(mapObject);
+
+ // If it's our map then scroll, otherwise just set position there.
+ MapRadar.SetMap(coordinates.MapId, coordinates.Position, recentering: true);
+ }
+
+ public void SetMap(MapId mapId, Vector2 position)
+ {
+ MapRadar.SetMap(mapId, position);
+ MapRadar.Offset = position;
+ }
+
+ ///
+ /// Adds a map object to the specified sector map.
+ ///
+ private void AddMapObject(MapId mapId, IMapObject mapObj)
+ {
+ var gridContents = _mapHeadings[mapId];
+ var existing = _mapObjects.GetOrNew(mapId);
+ existing.Add(mapObj);
+
+ var gridButton = new Button()
+ {
+ Text = mapObj.Name,
+ HorizontalExpand = true,
+ };
+
+ var gridContainer = new BoxContainer()
+ {
+ Children =
+ {
+ new Control()
+ {
+ MinWidth = 32f,
+ },
+ gridButton
+ }
+ };
+
+ _mapObjectControls.Add(gridContainer, mapObj.Name);
+ gridContents.AddChild(gridContainer);
+
+ gridButton.OnPressed += args =>
+ {
+ OnMapObjectPress(mapObj);
+ };
+
+ if (gridContents.ChildCount > 1)
+ {
+ // Re-sort the children
+ _sortChildren.Clear();
+
+ foreach (var child in gridContents.Children)
+ {
+ DebugTools.Assert(_mapObjectControls.ContainsKey(child));
+ _sortChildren.Add(child);
+ }
+
+ foreach (var child in _sortChildren)
+ {
+ child.Orphan();
+ }
+
+ _sortChildren.Sort((x, y) =>
+ {
+ var xText = _mapObjectControls[x];
+ var yText = _mapObjectControls[y];
+
+ return string.Compare(xText, yText, StringComparison.CurrentCultureIgnoreCase);
+ });
+
+ foreach (var control in _sortChildren)
+ {
+ gridContents.AddChild(control);
+ }
+ }
+ }
+
+ protected override void FrameUpdate(FrameEventArgs args)
+ {
+ base.FrameUpdate(args);
+
+ var curTime = _timing.CurTime;
+
+ if (_nextMapDequeue < curTime && _pendingMapObjects.Count > 0)
+ {
+ var mapObj = _pendingMapObjects[^1];
+ _pendingMapObjects.RemoveAt(_pendingMapObjects.Count - 1);
+ AddMapObject(mapObj.mapId, mapObj.mapobj);
+ BumpMapDequeue();
+ }
+
+ if (!IsFTLBlocked() && _nextPing < curTime)
+ {
+ MapRebuildButton.Disabled = false;
+ }
+
+ var ftlDiff = (float) (_nextFtlTime - _timing.CurTime).TotalSeconds;
+
+ float ftlRatio;
+
+ if (_ftlDuration.Equals(0f))
+ {
+ ftlRatio = 1f;
+ }
+ else
+ {
+ ftlRatio = Math.Clamp(1f - (ftlDiff / _ftlDuration), 0f, 1f);
+ }
+
+ FTLBar.Value = ftlRatio;
+ }
+
+ protected override void Draw(DrawingHandleScreen handle)
+ {
+ MapRadar.SetMapObjects(_mapObjects);
+ base.Draw(handle);
+ }
+
+ public void Startup()
+ {
+ if (_entManager.TryGetComponent(_shuttleEntity, out TransformComponent? shuttleXform))
+ {
+ SetMap(shuttleXform.MapID, _maps.GetGridPosition((_shuttleEntity.Value, null, shuttleXform)));
+ }
+ }
+}
diff --git a/Content.Client/Shuttles/UI/NavScreen.xaml b/Content.Client/Shuttles/UI/NavScreen.xaml
new file mode 100644
index 00000000000..c97aeda05be
--- /dev/null
+++ b/Content.Client/Shuttles/UI/NavScreen.xaml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Content.Client/Shuttles/UI/NavScreen.xaml.cs b/Content.Client/Shuttles/UI/NavScreen.xaml.cs
new file mode 100644
index 00000000000..b7b757ea483
--- /dev/null
+++ b/Content.Client/Shuttles/UI/NavScreen.xaml.cs
@@ -0,0 +1,85 @@
+using Content.Shared.Shuttles.BUIStates;
+using Robust.Client.AutoGenerated;
+using Robust.Client.Graphics;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.XAML;
+using Robust.Shared.Map;
+using Robust.Shared.Physics.Components;
+
+namespace Content.Client.Shuttles.UI;
+
+[GenerateTypedNameReferences]
+public sealed partial class NavScreen : BoxContainer
+{
+ [Dependency] private readonly IEntityManager _entManager = default!;
+ private SharedTransformSystem _xformSystem;
+
+ private EntityUid? _shuttleEntity;
+
+ public NavScreen()
+ {
+ RobustXamlLoader.Load(this);
+ IoCManager.InjectDependencies(this);
+ _xformSystem = _entManager.System();
+
+ IFFToggle.OnToggled += OnIFFTogglePressed;
+ IFFToggle.Pressed = NavRadar.ShowIFF;
+
+ DockToggle.OnToggled += OnDockTogglePressed;
+ DockToggle.Pressed = NavRadar.ShowDocks;
+ }
+
+ public void SetShuttle(EntityUid? shuttle)
+ {
+ _shuttleEntity = shuttle;
+ }
+
+ private void OnIFFTogglePressed(BaseButton.ButtonEventArgs args)
+ {
+ NavRadar.ShowIFF ^= true;
+ args.Button.Pressed = NavRadar.ShowIFF;
+ }
+
+ private void OnDockTogglePressed(BaseButton.ButtonEventArgs args)
+ {
+ NavRadar.ShowDocks ^= true;
+ args.Button.Pressed = NavRadar.ShowDocks;
+ }
+
+ public void UpdateState(NavInterfaceState scc)
+ {
+ NavRadar.UpdateState(scc);
+ }
+
+ public void SetMatrix(EntityCoordinates? coordinates, Angle? angle)
+ {
+ _shuttleEntity = coordinates?.EntityId;
+ NavRadar.SetMatrix(coordinates, angle);
+ }
+
+ protected override void Draw(DrawingHandleScreen handle)
+ {
+ base.Draw(handle);
+
+ if (!_entManager.TryGetComponent(_shuttleEntity, out TransformComponent? gridXform) ||
+ !_entManager.TryGetComponent(_shuttleEntity, out PhysicsComponent? gridBody))
+ {
+ return;
+ }
+
+ var (_, worldRot, worldMatrix) = _xformSystem.GetWorldPositionRotationMatrix(gridXform);
+ var worldPos = worldMatrix.Transform(gridBody.LocalCenter);
+
+ // Get the positive reduced angle.
+ var displayRot = -worldRot.Reduced();
+
+ GridPosition.Text = $"{worldPos.X:0.0}, {worldPos.Y:0.0}";
+ GridOrientation.Text = $"{displayRot.Degrees:0.0}";
+
+ var gridVelocity = gridBody.LinearVelocity;
+ gridVelocity = displayRot.RotateVec(gridVelocity);
+ // Get linear velocity relative to the console entity
+ GridLinearVelocity.Text = $"{gridVelocity.X + 10f * float.Epsilon:0.0}, {gridVelocity.Y + 10f * float.Epsilon:0.0}";
+ GridAngularVelocity.Text = $"{-gridBody.AngularVelocity + 10f * float.Epsilon:0.0}";
+ }
+}
diff --git a/Content.Client/Shuttles/UI/RadarConsoleWindow.xaml b/Content.Client/Shuttles/UI/RadarConsoleWindow.xaml
index 26aca5da629..f62e59b4ad1 100644
--- a/Content.Client/Shuttles/UI/RadarConsoleWindow.xaml
+++ b/Content.Client/Shuttles/UI/RadarConsoleWindow.xaml
@@ -4,7 +4,7 @@
Title="{Loc 'radar-console-window-title'}"
SetSize="648 648"
MinSize="256 256">
-
diff --git a/Content.Client/Shuttles/UI/RadarConsoleWindow.xaml.cs b/Content.Client/Shuttles/UI/RadarConsoleWindow.xaml.cs
index 1a6f216e8b3..7f1149365b2 100644
--- a/Content.Client/Shuttles/UI/RadarConsoleWindow.xaml.cs
+++ b/Content.Client/Shuttles/UI/RadarConsoleWindow.xaml.cs
@@ -9,20 +9,15 @@ namespace Content.Client.Shuttles.UI;
[GenerateTypedNameReferences]
public sealed partial class RadarConsoleWindow : FancyWindow,
- IComputerWindow
+ IComputerWindow
{
public RadarConsoleWindow()
{
RobustXamlLoader.Load(this);
}
- public void UpdateState(RadarConsoleBoundInterfaceState scc)
+ public void UpdateState(NavInterfaceState scc)
{
RadarScreen.UpdateState(scc);
}
-
- public void SetMatrix(EntityCoordinates? coordinates, Angle? angle)
- {
- RadarScreen.SetMatrix(coordinates, angle);
- }
}
diff --git a/Content.Client/Shuttles/UI/RadarControl.cs b/Content.Client/Shuttles/UI/RadarControl.cs
deleted file mode 100644
index 45e6da22f42..00000000000
--- a/Content.Client/Shuttles/UI/RadarControl.cs
+++ /dev/null
@@ -1,433 +0,0 @@
-using System.Numerics;
-using Content.Client.UserInterface.Controls;
-using Content.Shared.Shuttles.BUIStates;
-using Content.Shared.Shuttles.Components;
-using JetBrains.Annotations;
-using Robust.Client.Graphics;
-using Robust.Client.UserInterface;
-using Robust.Client.UserInterface.Controls;
-using Robust.Shared.Collections;
-using Robust.Shared.Input;
-using Robust.Shared.Map;
-using Robust.Shared.Map.Components;
-using Robust.Shared.Physics;
-using Robust.Shared.Physics.Components;
-using Robust.Shared.Utility;
-
-namespace Content.Client.Shuttles.UI;
-
-///
-/// Displays nearby grids inside of a control.
-///
-public sealed class RadarControl : MapGridControl
-{
- [Dependency] private readonly IEntityManager _entManager = default!;
- [Dependency] private readonly IMapManager _mapManager = default!;
- private SharedTransformSystem _transform;
-
- private const float GridLinesDistance = 32f;
-
- ///
- /// Used to transform all of the radar objects. Typically is a shuttle console parented to a grid.
- ///
- private EntityCoordinates? _coordinates;
-
- private Angle? _rotation;
-
- ///
- /// Shows a label on each radar object.
- ///
- private Dictionary _iffControls = new();
-
- private Dictionary> _docks = new();
-
- public bool ShowIFF { get; set; } = true;
- public bool ShowDocks { get; set; } = true;
-
- ///
- /// Currently hovered docked to show on the map.
- ///
- public NetEntity? HighlightedDock;
-
- ///
- /// Raised if the user left-clicks on the radar control with the relevant entitycoordinates.
- ///
- public Action? OnRadarClick;
-
- private List> _grids = new();
-
- public RadarControl() : base(64f, 256f, 256f)
- {
- _transform = _entManager.System();
- }
-
- public void SetMatrix(EntityCoordinates? coordinates, Angle? angle)
- {
- _coordinates = coordinates;
- _rotation = angle;
- }
-
- protected override void KeyBindUp(GUIBoundKeyEventArgs args)
- {
- base.KeyBindUp(args);
-
- if (_coordinates == null || _rotation == null || args.Function != EngineKeyFunctions.UIClick ||
- OnRadarClick == null)
- {
- return;
- }
-
- var a = InverseScalePosition(args.RelativePosition);
- var relativeWorldPos = new Vector2(a.X, -a.Y);
- relativeWorldPos = _rotation.Value.RotateVec(relativeWorldPos);
- var coords = _coordinates.Value.Offset(relativeWorldPos);
- OnRadarClick?.Invoke(coords);
- }
-
- ///
- /// Gets the entitycoordinates of where the mouseposition is, relative to the control.
- ///
- [PublicAPI]
- public EntityCoordinates GetMouseCoordinates(ScreenCoordinates screen)
- {
- if (_coordinates == null || _rotation == null)
- {
- return EntityCoordinates.Invalid;
- }
-
- var pos = screen.Position / UIScale - GlobalPosition;
-
- var a = InverseScalePosition(pos);
- var relativeWorldPos = new Vector2(a.X, -a.Y);
- relativeWorldPos = _rotation.Value.RotateVec(relativeWorldPos);
- var coords = _coordinates.Value.Offset(relativeWorldPos);
- return coords;
- }
-
- public void UpdateState(RadarConsoleBoundInterfaceState ls)
- {
- WorldMaxRange = ls.MaxRange;
-
- if (WorldMaxRange < WorldRange)
- {
- ActualRadarRange = WorldMaxRange;
- }
-
- if (WorldMaxRange < WorldMinRange)
- WorldMinRange = WorldMaxRange;
-
- ActualRadarRange = Math.Clamp(ActualRadarRange, WorldMinRange, WorldMaxRange);
-
- _docks.Clear();
-
- foreach (var state in ls.Docks)
- {
- var coordinates = state.Coordinates;
- var grid = _docks.GetOrNew(_entManager.GetEntity(coordinates.NetEntity));
- grid.Add(state);
- }
- }
-
- protected override void Draw(DrawingHandleScreen handle)
- {
- base.Draw(handle);
-
- var fakeAA = new Color(0.08f, 0.08f, 0.08f);
-
- handle.DrawCircle(new Vector2(MidPoint, MidPoint), ScaledMinimapRadius + 1, fakeAA);
- handle.DrawCircle(new Vector2(MidPoint, MidPoint), ScaledMinimapRadius, Color.Black);
-
- // No data
- if (_coordinates == null || _rotation == null)
- {
- Clear();
- return;
- }
-
- var gridLines = new Color(0.08f, 0.08f, 0.08f);
- var gridLinesRadial = 8;
- var gridLinesEquatorial = (int) Math.Floor(WorldRange / GridLinesDistance);
-
- for (var i = 1; i < gridLinesEquatorial + 1; i++)
- {
- handle.DrawCircle(new Vector2(MidPoint, MidPoint), GridLinesDistance * MinimapScale * i, gridLines, false);
- }
-
- for (var i = 0; i < gridLinesRadial; i++)
- {
- Angle angle = (Math.PI / gridLinesRadial) * i;
- var aExtent = angle.ToVec() * ScaledMinimapRadius;
- handle.DrawLine(new Vector2(MidPoint, MidPoint) - aExtent, new Vector2(MidPoint, MidPoint) + aExtent, gridLines);
- }
-
- var metaQuery = _entManager.GetEntityQuery();
- var xformQuery = _entManager.GetEntityQuery();
- var fixturesQuery = _entManager.GetEntityQuery();
- var bodyQuery = _entManager.GetEntityQuery();
-
- if (!xformQuery.TryGetComponent(_coordinates.Value.EntityId, out var xform)
- || xform.MapID == MapId.Nullspace)
- {
- Clear();
- return;
- }
-
- var (pos, rot) = _transform.GetWorldPositionRotation(xform);
- var offset = _coordinates.Value.Position;
- var offsetMatrix = Matrix3.CreateInverseTransform(pos, rot + _rotation.Value);
-
- // Draw our grid in detail
- var ourGridId = xform.GridUid;
- if (_entManager.TryGetComponent(ourGridId, out var ourGrid) &&
- fixturesQuery.HasComponent(ourGridId.Value))
- {
- var ourGridMatrix = _transform.GetWorldMatrix(ourGridId.Value);
- Matrix3.Multiply(in ourGridMatrix, in offsetMatrix, out var matrix);
-
- DrawGrid(handle, matrix, ourGrid, Color.MediumSpringGreen, true);
- DrawDocks(handle, ourGridId.Value, matrix);
- }
-
- var invertedPosition = _coordinates.Value.Position - offset;
- invertedPosition.Y = -invertedPosition.Y;
- // Don't need to transform the InvWorldMatrix again as it's already offset to its position.
-
- // Draw radar position on the station
- handle.DrawCircle(ScalePosition(invertedPosition), 5f, Color.Lime);
-
- var shown = new HashSet();
-
- _grids.Clear();
- _mapManager.FindGridsIntersecting(xform.MapID, new Box2(pos - MaxRadarRangeVector, pos + MaxRadarRangeVector), ref _grids, approx: true, includeMap: false);
-
- // Draw other grids... differently
- foreach (var grid in _grids)
- {
- var gUid = grid.Owner;
- if (gUid == ourGridId || !fixturesQuery.HasComponent(gUid))
- continue;
-
- var gridBody = bodyQuery.GetComponent(gUid);
- if (gridBody.Mass < 10f)
- {
- ClearLabel(gUid);
- continue;
- }
-
- _entManager.TryGetComponent(gUid, out var iff);
-
- // Hide it entirely.
- if (iff != null &&
- (iff.Flags & IFFFlags.Hide) != 0x0)
- {
- continue;
- }
-
- shown.Add(gUid);
- var name = metaQuery.GetComponent(gUid).EntityName;
-
- if (name == string.Empty)
- name = Loc.GetString("shuttle-console-unknown");
-
- var gridMatrix = _transform.GetWorldMatrix(gUid);
- Matrix3.Multiply(in gridMatrix, in offsetMatrix, out var matty);
- var color = iff?.Color ?? Color.Gold;
-
- // Others default:
- // Color.FromHex("#FFC000FF")
- // Hostile default: Color.Firebrick
-
- if (ShowIFF &&
- (iff == null && IFFComponent.ShowIFFDefault ||
- (iff.Flags & IFFFlags.HideLabel) == 0x0))
- {
- var gridBounds = grid.Comp.LocalAABB;
- Label label;
-
- if (!_iffControls.TryGetValue(gUid, out var control))
- {
- label = new Label()
- {
- HorizontalAlignment = HAlignment.Left,
- };
-
- _iffControls[gUid] = label;
- AddChild(label);
- }
- else
- {
- label = (Label) control;
- }
-
- label.FontColorOverride = color;
- var gridCentre = matty.Transform(gridBody.LocalCenter);
- gridCentre.Y = -gridCentre.Y;
- var distance = gridCentre.Length();
-
- // y-offset the control to always render below the grid (vertically)
- var yOffset = Math.Max(gridBounds.Height, gridBounds.Width) * MinimapScale / 1.8f / UIScale;
-
- // The actual position in the UI. We offset the matrix position to render it off by half its width
- // plus by the offset.
- var uiPosition = ScalePosition(gridCentre) / UIScale - new Vector2(label.Width / 2f, -yOffset);
-
- // Look this is uggo so feel free to cleanup. We just need to clamp the UI position to within the viewport.
- uiPosition = new Vector2(Math.Clamp(uiPosition.X, 0f, Width - label.Width),
- Math.Clamp(uiPosition.Y, 10f, Height - label.Height));
-
- label.Visible = true;
- label.Text = Loc.GetString("shuttle-console-iff-label", ("name", name), ("distance", $"{distance:0.0}"));
- LayoutContainer.SetPosition(label, uiPosition);
- }
- else
- {
- ClearLabel(gUid);
- }
-
- // Detailed view
- DrawGrid(handle, matty, grid, color, true);
-
- DrawDocks(handle, gUid, matty);
- }
-
- foreach (var (ent, _) in _iffControls)
- {
- if (shown.Contains(ent)) continue;
- ClearLabel(ent);
- }
- }
-
- private void Clear()
- {
- foreach (var (_, label) in _iffControls)
- {
- label.Dispose();
- }
-
- _iffControls.Clear();
- }
-
- private void ClearLabel(EntityUid uid)
- {
- if (!_iffControls.TryGetValue(uid, out var label)) return;
- label.Dispose();
- _iffControls.Remove(uid);
- }
-
- private void DrawDocks(DrawingHandleScreen handle, EntityUid uid, Matrix3 matrix)
- {
- if (!ShowDocks)
- return;
-
- const float DockScale = 1f;
-
- if (_docks.TryGetValue(uid, out var docks))
- {
- foreach (var state in docks)
- {
- var position = state.Coordinates.Position;
- var uiPosition = matrix.Transform(position);
-
- if (uiPosition.Length() > WorldRange - DockScale)
- continue;
-
- var color = HighlightedDock == state.Entity ? state.HighlightedColor : state.Color;
-
- uiPosition.Y = -uiPosition.Y;
-
- var verts = new[]
- {
- matrix.Transform(position + new Vector2(-DockScale, -DockScale)),
- matrix.Transform(position + new Vector2(DockScale, -DockScale)),
- matrix.Transform(position + new Vector2(DockScale, DockScale)),
- matrix.Transform(position + new Vector2(-DockScale, DockScale)),
- };
-
- for (var i = 0; i < verts.Length; i++)
- {
- var vert = verts[i];
- vert.Y = -vert.Y;
- verts[i] = ScalePosition(vert);
- }
-
- handle.DrawPrimitives(DrawPrimitiveTopology.TriangleFan, verts, color.WithAlpha(0.8f));
- handle.DrawPrimitives(DrawPrimitiveTopology.LineStrip, verts, color);
- }
- }
- }
-
- private void DrawGrid(DrawingHandleScreen handle, Matrix3 matrix, MapGridComponent grid, Color color, bool drawInterior)
- {
- var rator = grid.GetAllTilesEnumerator();
- var edges = new ValueList();
-
- while (rator.MoveNext(out var tileRef))
- {
- // TODO: Short-circuit interior chunk nodes
- // This can be optimised a lot more if required.
- Vector2? tileVec = null;
-
- // Iterate edges and see which we can draw
- for (var i = 0; i < 4; i++)
- {
- var dir = (DirectionFlag) Math.Pow(2, i);
- var dirVec = dir.AsDir().ToIntVec();
-
- if (!grid.GetTileRef(tileRef.Value.GridIndices + dirVec).Tile.IsEmpty)
- continue;
-
- Vector2 start;
- Vector2 end;
- tileVec ??= (Vector2) tileRef.Value.GridIndices * grid.TileSize;
-
- // Draw line
- // Could probably rotate this but this might be faster?
- switch (dir)
- {
- case DirectionFlag.South:
- start = tileVec.Value;
- end = tileVec.Value + new Vector2(grid.TileSize, 0f);
- break;
- case DirectionFlag.East:
- start = tileVec.Value + new Vector2(grid.TileSize, 0f);
- end = tileVec.Value + new Vector2(grid.TileSize, grid.TileSize);
- break;
- case DirectionFlag.North:
- start = tileVec.Value + new Vector2(grid.TileSize, grid.TileSize);
- end = tileVec.Value + new Vector2(0f, grid.TileSize);
- break;
- case DirectionFlag.West:
- start = tileVec.Value + new Vector2(0f, grid.TileSize);
- end = tileVec.Value;
- break;
- default:
- throw new NotImplementedException();
- }
-
- var adjustedStart = matrix.Transform(start);
- var adjustedEnd = matrix.Transform(end);
-
- if (adjustedStart.Length() > ActualRadarRange || adjustedEnd.Length() > ActualRadarRange)
- continue;
-
- start = ScalePosition(new Vector2(adjustedStart.X, -adjustedStart.Y));
- end = ScalePosition(new Vector2(adjustedEnd.X, -adjustedEnd.Y));
-
- edges.Add(start);
- edges.Add(end);
- }
- }
-
- handle.DrawPrimitives(DrawPrimitiveTopology.LineList, edges.Span, color);
- }
-
- private Vector2 ScalePosition(Vector2 value)
- {
- return value * MinimapScale + MidpointVector;
- }
-
- private Vector2 InverseScalePosition(Vector2 value)
- {
- return (value - MidpointVector) / MinimapScale;
- }
-}
diff --git a/Content.Client/Shuttles/UI/ShuttleConsoleWindow.xaml b/Content.Client/Shuttles/UI/ShuttleConsoleWindow.xaml
index 32438632609..ec5340e6b47 100644
--- a/Content.Client/Shuttles/UI/ShuttleConsoleWindow.xaml
+++ b/Content.Client/Shuttles/UI/ShuttleConsoleWindow.xaml
@@ -2,109 +2,42 @@
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:ui="clr-namespace:Content.Client.Shuttles.UI"
Title="{Loc 'shuttle-console-window-title'}"
- SetSize="1180 648"
- MinSize="788 320">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ SetSize="960 762"
+ MinSize="960 762">
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
+
diff --git a/Content.Client/Shuttles/UI/ShuttleConsoleWindow.xaml.cs b/Content.Client/Shuttles/UI/ShuttleConsoleWindow.xaml.cs
index d67227549a9..a4b42fb672c 100644
--- a/Content.Client/Shuttles/UI/ShuttleConsoleWindow.xaml.cs
+++ b/Content.Client/Shuttles/UI/ShuttleConsoleWindow.xaml.cs
@@ -1,340 +1,148 @@
+using System.Numerics;
using Content.Client.Computer;
using Content.Client.UserInterface.Controls;
using Content.Shared.Shuttles.BUIStates;
-using Content.Shared.Shuttles.Components;
-using Content.Shared.Shuttles.Systems;
using Robust.Client.AutoGenerated;
-using Robust.Client.Graphics;
-using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Map;
-using Robust.Shared.Physics.Components;
-using Robust.Shared.Timing;
-using Robust.Shared.Utility;
namespace Content.Client.Shuttles.UI;
[GenerateTypedNameReferences]
public sealed partial class ShuttleConsoleWindow : FancyWindow,
- IComputerWindow
+ IComputerWindow
{
- private readonly IEntityManager _entManager;
- private readonly IGameTiming _timing;
+ [Dependency] private readonly IEntityManager _entManager = default!;
- private EntityUid? _shuttleEntity;
+ private ShuttleConsoleMode _mode = ShuttleConsoleMode.Nav;
- ///
- /// Currently selected dock button for camera.
- ///
- private BaseButton? _selectedDock;
+ public event Action? RequestFTL;
+ public event Action? RequestBeaconFTL;
- ///
- /// Stored by grid entityid then by states
- ///
- private readonly Dictionary> _docks = new();
-
- private readonly Dictionary _destinations = new();
-
- ///
- /// Next FTL state change.
- ///
- public TimeSpan FTLTime;
-
- public Action? UndockPressed;
- public Action? StartAutodockPressed;
- public Action? StopAutodockPressed;
- public Action? DestinationPressed;
+ public event Action? DockRequest;
+ public event Action? UndockRequest;
public ShuttleConsoleWindow()
{
RobustXamlLoader.Load(this);
- _entManager = IoCManager.Resolve();
- _timing = IoCManager.Resolve();
-
- WorldRangeChange(RadarScreen.WorldRange);
- RadarScreen.WorldRangeChanged += WorldRangeChange;
-
- IFFToggle.OnToggled += OnIFFTogglePressed;
- IFFToggle.Pressed = RadarScreen.ShowIFF;
-
- DockToggle.OnToggled += OnDockTogglePressed;
- DockToggle.Pressed = RadarScreen.ShowDocks;
-
- UndockButton.OnPressed += OnUndockPressed;
- }
-
- private void WorldRangeChange(float value)
- {
- RadarRange.Text = $"{value:0}";
- }
-
- private void OnIFFTogglePressed(BaseButton.ButtonEventArgs args)
- {
- RadarScreen.ShowIFF ^= true;
- args.Button.Pressed = RadarScreen.ShowIFF;
- }
-
- private void OnDockTogglePressed(BaseButton.ButtonEventArgs args)
- {
- RadarScreen.ShowDocks ^= true;
- args.Button.Pressed = RadarScreen.ShowDocks;
- }
+ IoCManager.InjectDependencies(this);
- private void OnUndockPressed(BaseButton.ButtonEventArgs args)
- {
- if (DockingScreen.ViewedDock == null) return;
- UndockPressed?.Invoke(DockingScreen.ViewedDock.Value);
- }
+ // Mode switching
+ NavModeButton.OnPressed += NavPressed;
+ MapModeButton.OnPressed += MapPressed;
+ DockModeButton.OnPressed += DockPressed;
- public void SetMatrix(EntityCoordinates? coordinates, Angle? angle)
- {
- _shuttleEntity = coordinates?.EntityId;
- RadarScreen.SetMatrix(coordinates, angle);
- }
+ // Modes are exclusive
+ var group = new ButtonGroup();
- public void UpdateState(ShuttleConsoleBoundInterfaceState scc)
- {
- UpdateDocks(scc.Docks);
- UpdateFTL(scc.Destinations, scc.FTLState, scc.FTLTime);
- RadarScreen.UpdateState(scc);
- MaxRadarRange.Text = $"{scc.MaxRange:0}";
- }
+ NavModeButton.Group = group;
+ MapModeButton.Group = group;
+ DockModeButton.Group = group;
- private void UpdateFTL(List<(NetEntity Entity, string Destination, bool Enabled)> destinations, FTLState state, TimeSpan time)
- {
- HyperspaceDestinations.DisposeAllChildren();
- _destinations.Clear();
+ NavModeButton.Pressed = true;
+ SetupMode(_mode);
- if (destinations.Count == 0)
- {
- HyperspaceDestinations.AddChild(new Label()
- {
- Text = Loc.GetString("shuttle-console-hyperspace-none"),
- HorizontalAlignment = HAlignment.Center,
- });
- }
- else
+ MapContainer.RequestFTL += (coords, angle) =>
{
- destinations.Sort((x, y) => string.Compare(x.Destination, y.Destination, StringComparison.Ordinal));
-
- foreach (var destination in destinations)
- {
- var button = new Button()
- {
- Disabled = !destination.Enabled,
- Text = destination.Destination,
- };
-
- _destinations[button] = destination.Entity;
- button.OnPressed += OnHyperspacePressed;
- HyperspaceDestinations.AddChild(button);
- }
- }
-
- string stateText;
+ RequestFTL?.Invoke(coords, angle);
+ };
- switch (state)
+ MapContainer.RequestBeaconFTL += (ent, angle) =>
{
- case Shared.Shuttles.Systems.FTLState.Available:
- stateText = Loc.GetString("shuttle-console-ftl-available");
- break;
- case Shared.Shuttles.Systems.FTLState.Starting:
- stateText = Loc.GetString("shuttle-console-ftl-starting");
- break;
- case Shared.Shuttles.Systems.FTLState.Travelling:
- stateText = Loc.GetString("shuttle-console-ftl-travelling");
- break;
- case Shared.Shuttles.Systems.FTLState.Cooldown:
- stateText = Loc.GetString("shuttle-console-ftl-cooldown");
- break;
- case Shared.Shuttles.Systems.FTLState.Arriving:
- stateText = Loc.GetString("shuttle-console-ftl-arriving");
- break;
- default:
- throw new ArgumentOutOfRangeException(nameof(state), state, null);
- }
+ RequestBeaconFTL?.Invoke(ent, angle);
+ };
- FTLState.Text = stateText;
- // Add a buffer due to lag or whatever
- time += TimeSpan.FromSeconds(0.3);
- FTLTime = time;
- FTLTimer.Text = GetFTLText();
- }
-
- private string GetFTLText()
- {
- return $"{Math.Max(0, (FTLTime - _timing.CurTime).TotalSeconds):0.0}";
- }
+ DockContainer.DockRequest += (entity, netEntity) =>
+ {
+ DockRequest?.Invoke(entity, netEntity);
+ };
- private void OnHyperspacePressed(BaseButton.ButtonEventArgs obj)
- {
- var ent = _destinations[obj.Button];
- DestinationPressed?.Invoke(ent);
+ DockContainer.UndockRequest += entity =>
+ {
+ UndockRequest?.Invoke(entity);
+ };
}
- #region Docking
-
- private void UpdateDocks(List docks)
+ private void ClearModes(ShuttleConsoleMode mode)
{
- // TODO: We should check for changes so any existing highlighted doesn't delete.
- // We also need to make up some pseudonumber as well for these.
- _docks.Clear();
-
- foreach (var dock in docks)
+ if (mode != ShuttleConsoleMode.Nav)
{
- var grid = _docks.GetOrNew(dock.Coordinates.NetEntity);
- grid.Add(dock);
+ NavContainer.Visible = false;
}
- DockPorts.DisposeAllChildren();
- DockingScreen.Docks = _docks;
- var shuttleNetEntity = _entManager.GetNetEntity(_shuttleEntity);
-
- if (shuttleNetEntity != null && _docks.TryGetValue(shuttleNetEntity.Value, out var gridDocks))
+ if (mode != ShuttleConsoleMode.Map)
{
- var index = 1;
-
- foreach (var state in gridDocks)
- {
- var pressed = state.Entity == DockingScreen.ViewedDock;
-
- string suffix;
-
- if (state.Connected)
- {
- suffix = Loc.GetString("shuttle-console-docked", ("index", index));
- }
- else
- {
- suffix = $"{index}";
- }
-
- var button = new Button()
- {
- Text = Loc.GetString("shuttle-console-dock-button", ("suffix", suffix)),
- ToggleMode = true,
- Pressed = pressed,
- Margin = new Thickness(0f, 1f),
- };
-
- if (pressed)
- {
- _selectedDock = button;
- }
+ MapContainer.Visible = false;
+ MapContainer.SetMap(MapId.Nullspace, Vector2.Zero);
+ }
- button.OnMouseEntered += args => OnDockMouseEntered(args, state);
- button.OnMouseExited += args => OnDockMouseExited(args, state);
- button.OnToggled += args => OnDockToggled(args, state);
- DockPorts.AddChild(button);
- index++;
- }
+ if (mode != ShuttleConsoleMode.Dock)
+ {
+ DockContainer.Visible = false;
}
}
- private void OnDockMouseEntered(GUIMouseHoverEventArgs obj, DockingInterfaceState state)
+ private void NavPressed(BaseButton.ButtonEventArgs obj)
{
- RadarScreen.HighlightedDock = state.Entity;
+ SwitchMode(ShuttleConsoleMode.Nav);
}
- private void OnDockMouseExited(GUIMouseHoverEventArgs obj, DockingInterfaceState state)
+ private void MapPressed(BaseButton.ButtonEventArgs obj)
{
- RadarScreen.HighlightedDock = null;
+ SwitchMode(ShuttleConsoleMode.Map);
}
- ///
- /// Shows a docking camera instead of radar screen.
- ///
- private void OnDockToggled(BaseButton.ButtonEventArgs obj, DockingInterfaceState state)
+ private void DockPressed(BaseButton.ButtonEventArgs obj)
{
- if (_selectedDock != null)
- {
- // If it got untoggled via other means then we'll stop viewing the old dock.
- if (DockingScreen.ViewedDock != null && DockingScreen.ViewedDock != state.Entity)
- {
- StopAutodockPressed?.Invoke(DockingScreen.ViewedDock.Value);
- }
-
- _selectedDock.Pressed = false;
- _selectedDock = null;
- }
-
- if (!obj.Button.Pressed)
- {
- if (DockingScreen.ViewedDock != null)
- {
- StopAutodockPressed?.Invoke(DockingScreen.ViewedDock.Value);
- DockingScreen.ViewedDock = null;
- }
-
- UndockButton.Disabled = true;
- DockingScreen.Visible = false;
- RadarScreen.Visible = true;
- }
- else
- {
- if (_shuttleEntity != null)
- {
- DockingScreen.Coordinates = _entManager.GetCoordinates(state.Coordinates);
- DockingScreen.Angle = state.Angle;
- }
- else
- {
- DockingScreen.Coordinates = null;
- DockingScreen.Angle = null;
- }
-
- UndockButton.Disabled = false;
- RadarScreen.Visible = false;
- DockingScreen.Visible = true;
- DockingScreen.ViewedDock = state.Entity;
- StartAutodockPressed?.Invoke(state.Entity);
- DockingScreen.GridEntity = _shuttleEntity;
- _selectedDock = obj.Button;
- }
+ SwitchMode(ShuttleConsoleMode.Dock);
}
- public override void Close()
+ private void SetupMode(ShuttleConsoleMode mode)
{
- base.Close();
- if (DockingScreen.ViewedDock != null)
+ switch (mode)
{
- StopAutodockPressed?.Invoke(DockingScreen.ViewedDock.Value);
+ case ShuttleConsoleMode.Nav:
+ NavContainer.Visible = true;
+ break;
+ case ShuttleConsoleMode.Map:
+ MapContainer.Visible = true;
+ MapContainer.Startup();
+ break;
+ case ShuttleConsoleMode.Dock:
+ DockContainer.Visible = true;
+ break;
+ default:
+ throw new NotImplementedException();
}
}
- #endregion
-
- protected override void Draw(DrawingHandleScreen handle)
+ public void SwitchMode(ShuttleConsoleMode mode)
{
- base.Draw(handle);
-
- if (!_entManager.TryGetComponent(_shuttleEntity, out var gridBody) ||
- !_entManager.TryGetComponent(_shuttleEntity, out var gridXform))
- {
+ if (_mode == mode)
return;
- }
-
- if (_entManager.TryGetComponent(_shuttleEntity, out var metadata) && metadata.EntityPaused)
- {
- FTLTime += _timing.FrameTime;
- }
- FTLTimer.Text = GetFTLText();
-
- var (_, worldRot, worldMatrix) = gridXform.GetWorldPositionRotationMatrix();
- var worldPos = worldMatrix.Transform(gridBody.LocalCenter);
+ _mode = mode;
+ ClearModes(mode);
+ SetupMode(_mode);
+ }
- // Get the positive reduced angle.
- var displayRot = -worldRot.Reduced();
+ public enum ShuttleConsoleMode : byte
+ {
+ Nav,
+ Map,
+ Dock,
+ }
- GridPosition.Text = $"{worldPos.X:0.0}, {worldPos.Y:0.0}";
- GridOrientation.Text = $"{displayRot.Degrees:0.0}";
+ public void UpdateState(EntityUid owner, ShuttleBoundUserInterfaceState cState)
+ {
+ var coordinates = _entManager.GetCoordinates(cState.NavState.Coordinates);
+ NavContainer.SetShuttle(coordinates?.EntityId);
+ MapContainer.SetShuttle(coordinates?.EntityId);
+ MapContainer.SetConsole(owner);
- var gridVelocity = gridBody.LinearVelocity;
- gridVelocity = displayRot.RotateVec(gridVelocity);
- // Get linear velocity relative to the console entity
- GridLinearVelocity.Text = $"{gridVelocity.X:0.0}, {gridVelocity.Y:0.0}";
- GridAngularVelocity.Text = $"{-gridBody.AngularVelocity:0.0}";
+ NavContainer.UpdateState(cState.NavState);
+ MapContainer.UpdateState(cState.MapState);
+ DockContainer.UpdateState(coordinates?.EntityId, cState.DockState);
}
}
diff --git a/Content.Client/Shuttles/UI/ShuttleDockControl.xaml b/Content.Client/Shuttles/UI/ShuttleDockControl.xaml
new file mode 100644
index 00000000000..b1bbb4c6290
--- /dev/null
+++ b/Content.Client/Shuttles/UI/ShuttleDockControl.xaml
@@ -0,0 +1 @@
+
diff --git a/Content.Client/Shuttles/UI/ShuttleDockControl.xaml.cs b/Content.Client/Shuttles/UI/ShuttleDockControl.xaml.cs
new file mode 100644
index 00000000000..961ec35cdb3
--- /dev/null
+++ b/Content.Client/Shuttles/UI/ShuttleDockControl.xaml.cs
@@ -0,0 +1,458 @@
+using System.Numerics;
+using Content.Client.Shuttles.Systems;
+using Content.Shared.Shuttles.BUIStates;
+using Content.Shared.Shuttles.Components;
+using Content.Shared.Shuttles.Systems;
+using Robust.Client.AutoGenerated;
+using Robust.Client.Graphics;
+using Robust.Client.UserInterface;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.XAML;
+using Robust.Shared.Map;
+using Robust.Shared.Map.Components;
+using Robust.Shared.Timing;
+
+namespace Content.Client.Shuttles.UI;
+
+[GenerateTypedNameReferences]
+public sealed partial class ShuttleDockControl : BaseShuttleControl
+{
+ [Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly IMapManager _mapManager = default!;
+ private readonly DockingSystem _dockSystem;
+ private readonly SharedShuttleSystem _shuttles;
+ private readonly SharedTransformSystem _xformSystem;
+
+ public NetEntity? HighlightedDock;
+
+ public NetEntity? ViewedDock => _viewedState?.Entity;
+ private DockingPortState? _viewedState;
+
+ public EntityUid? GridEntity;
+
+ private EntityCoordinates? _coordinates;
+ private Angle? _angle;
+
+ public DockingInterfaceState? DockState = null;
+
+ private List> _grids = new();
+
+ private readonly HashSet _drawnDocks = new();
+ private readonly Dictionary _dockButtons = new();
+
+ ///
+ /// Store buttons for every other dock
+ ///
+ private readonly Dictionary _dockContainers = new();
+
+ private static readonly TimeSpan DockChangeCooldown = TimeSpan.FromSeconds(0.5);
+
+ ///
+ /// Rate-limiting for docking changes
+ ///
+ private TimeSpan _nextDockChange;
+
+ public event Action? OnViewDock;
+ public event Action? DockRequest;
+ public event Action? UndockRequest;
+
+ public ShuttleDockControl() : base(2f, 32f, 8f)
+ {
+ RobustXamlLoader.Load(this);
+ _dockSystem = EntManager.System();
+ _shuttles = EntManager.System();
+ _xformSystem = EntManager.System();
+ MinSize = new Vector2(SizeFull, SizeFull);
+ }
+
+ public void SetViewedDock(DockingPortState? dockState)
+ {
+ _viewedState = dockState;
+
+ if (dockState != null)
+ {
+ _coordinates = EntManager.GetCoordinates(dockState.Coordinates);
+ _angle = dockState.Angle;
+ OnViewDock?.Invoke(dockState.Entity);
+ }
+ else
+ {
+ _coordinates = null;
+ _angle = null;
+ }
+ }
+
+ protected override void FrameUpdate(FrameEventArgs args)
+ {
+ base.FrameUpdate(args);
+ HideDocks();
+ _drawnDocks.Clear();
+ }
+
+ protected override void Draw(DrawingHandleScreen handle)
+ {
+ base.Draw(handle);
+
+ DrawBacking(handle);
+
+ if (_coordinates == null ||
+ _angle == null ||
+ DockState == null ||
+ !EntManager.TryGetComponent(GridEntity, out var gridXform))
+ {
+ DrawNoSignal(handle);
+ return;
+ }
+
+ DrawCircles(handle);
+ var gridNent = EntManager.GetNetEntity(GridEntity);
+ var mapPos = _xformSystem.ToMapCoordinates(_coordinates.Value);
+ var ourGridMatrix = _xformSystem.GetWorldMatrix(gridXform.Owner);
+ var dockMatrix = Matrix3.CreateTransform(_coordinates.Value.Position, Angle.Zero);
+ Matrix3.Multiply(dockMatrix, ourGridMatrix, out var offsetMatrix);
+
+ offsetMatrix = offsetMatrix.Invert();
+
+ // Draw nearby grids
+ var controlBounds = SizeBox.Scale(1.25f);
+ _grids.Clear();
+ _mapManager.FindGridsIntersecting(gridXform.MapID, new Box2(mapPos.Position - WorldRangeVector, mapPos.Position + WorldRangeVector), ref _grids);
+
+ // offset the dotted-line position to the bounds.
+ Vector2? viewedDockPos = _viewedState != null ? MidPointVector : null;
+
+ if (viewedDockPos != null)
+ {
+ viewedDockPos = viewedDockPos.Value + _angle.Value.RotateVec(new Vector2(0f,-0.6f) * MinimapScale);
+ }
+
+ var canDockChange = _timing.CurTime > _nextDockChange;
+ var lineOffset = (float) _timing.RealTime.TotalSeconds * 30f;
+
+ foreach (var grid in _grids)
+ {
+ EntManager.TryGetComponent(grid.Owner, out IFFComponent? iffComp);
+
+ if (grid.Owner != GridEntity && !_shuttles.CanDraw(grid.Owner, iffComp: iffComp))
+ continue;
+
+ var gridMatrix = _xformSystem.GetWorldMatrix(grid.Owner);
+ Matrix3.Multiply(in gridMatrix, in offsetMatrix, out var matty);
+ var color = _shuttles.GetIFFColor(grid.Owner, grid.Owner == GridEntity, component: iffComp);
+
+ DrawGrid(handle, matty, grid, color);
+
+ // Draw any docks on that grid
+ if (!DockState.Docks.TryGetValue(EntManager.GetNetEntity(grid), out var gridDocks))
+ continue;
+
+ foreach (var dock in gridDocks)
+ {
+ if (ViewedDock == dock.Entity)
+ continue;
+
+ var position = matty.Transform(dock.Coordinates.Position);
+
+ var otherDockRotation = Matrix3.CreateRotation(dock.Angle);
+ var scaledPos = ScalePosition(position with {Y = -position.Y});
+
+ if (!controlBounds.Contains(scaledPos.Floored()))
+ continue;
+
+ // Draw the dock's collision
+ var collisionBL = matty.Transform(dock.Coordinates.Position +
+ otherDockRotation.Transform(new Vector2(-0.2f, -0.7f)));
+ var collisionBR = matty.Transform(dock.Coordinates.Position +
+ otherDockRotation.Transform(new Vector2(0.2f, -0.7f)));
+ var collisionTR = matty.Transform(dock.Coordinates.Position +
+ otherDockRotation.Transform(new Vector2(0.2f, -0.5f)));
+ var collisionTL = matty.Transform(dock.Coordinates.Position +
+ otherDockRotation.Transform(new Vector2(-0.2f, -0.5f)));
+
+ var verts = new[]
+ {
+ collisionBL,
+ collisionBR,
+ collisionBR,
+ collisionTR,
+ collisionTR,
+ collisionTL,
+ collisionTL,
+ collisionBL,
+ };
+
+ for (var i = 0; i < verts.Length; i++)
+ {
+ var vert = verts[i];
+ vert.Y = -vert.Y;
+ verts[i] = ScalePosition(vert);
+ }
+
+ var collisionCenter = verts[0] + verts[1] + verts[3] + verts[5];
+
+ var otherDockConnection = Color.ToSrgb(Color.Pink);
+ handle.DrawPrimitives(DrawPrimitiveTopology.TriangleFan, verts, otherDockConnection.WithAlpha(0.2f));
+ handle.DrawPrimitives(DrawPrimitiveTopology.LineList, verts, otherDockConnection);
+
+ // Draw the dock itself
+ var dockBL = matty.Transform(dock.Coordinates.Position + new Vector2(-0.5f, -0.5f));
+ var dockBR = matty.Transform(dock.Coordinates.Position + new Vector2(0.5f, -0.5f));
+ var dockTR = matty.Transform(dock.Coordinates.Position + new Vector2(0.5f, 0.5f));
+ var dockTL = matty.Transform(dock.Coordinates.Position + new Vector2(-0.5f, 0.5f));
+
+ verts = new[]
+ {
+ dockBL,
+ dockBR,
+ dockBR,
+ dockTR,
+ dockTR,
+ dockTL,
+ dockTL,
+ dockBL
+ };
+
+ for (var i = 0; i < verts.Length; i++)
+ {
+ var vert = verts[i];
+ vert.Y = -vert.Y;
+ verts[i] = ScalePosition(vert);
+ }
+
+ Color otherDockColor;
+
+ if (HighlightedDock == dock.Entity)
+ {
+ otherDockColor = Color.ToSrgb(Color.Magenta);
+ }
+ else
+ {
+ otherDockColor = Color.ToSrgb(Color.Purple);
+ }
+
+ /*
+ * Can draw in these conditions:
+ * 1. Same grid
+ * 2. It's in range
+ *
+ * We don't want to draw stuff far away that's docked because it will just overlap our buttons
+ */
+
+ var canDraw = grid.Owner == GridEntity;
+ _dockButtons.TryGetValue(dock, out var dockButton);
+
+ // Rate limit
+ if (dockButton != null && dock.GridDockedWith != null)
+ {
+ dockButton.Disabled = !canDockChange;
+ }
+
+ // If the dock is in range then also do highlighting
+ if (viewedDockPos != null && dock.Coordinates.NetEntity != gridNent)
+ {
+ collisionCenter /= 4;
+ var range = viewedDockPos.Value - collisionCenter;
+
+ if (range.Length() < SharedDockingSystem.DockingHiglightRange * MinimapScale)
+ {
+ if (_viewedState?.GridDockedWith == null)
+ {
+ var coordsOne = EntManager.GetCoordinates(_viewedState!.Coordinates);
+ var coordsTwo = EntManager.GetCoordinates(dock.Coordinates);
+ var mapOne = _xformSystem.ToMapCoordinates(coordsOne);
+ var mapTwo = _xformSystem.ToMapCoordinates(coordsTwo);
+
+ var rotA = _xformSystem.GetWorldRotation(coordsOne.EntityId) + _viewedState!.Angle;
+ var rotB = _xformSystem.GetWorldRotation(coordsTwo.EntityId) + dock.Angle;
+
+ var distance = (mapOne.Position - mapTwo.Position).Length();
+
+ var inAlignment = _dockSystem.InAlignment(mapOne, rotA, mapTwo, rotB);
+ var canDock = distance < SharedDockingSystem.DockRange && inAlignment;
+
+ if (dockButton != null)
+ dockButton.Disabled = !canDock || !canDockChange;
+
+ var lineColor = inAlignment ? Color.Lime : Color.Red;
+ handle.DrawDottedLine(viewedDockPos.Value, collisionCenter, lineColor, offset: lineOffset);
+ }
+
+ canDraw = true;
+ }
+ else
+ {
+ if (dockButton != null)
+ dockButton.Disabled = true;
+ }
+ }
+
+ handle.DrawPrimitives(DrawPrimitiveTopology.TriangleFan, verts, otherDockColor.WithAlpha(0.2f));
+ handle.DrawPrimitives(DrawPrimitiveTopology.LineList, verts, otherDockColor);
+
+ // Position the dock control above it
+ var container = _dockContainers[dock];
+ container.Visible = canDraw;
+
+ if (canDraw)
+ {
+ // Because it's being layed out top-down we have to arrange for first frame.
+ container.Arrange(PixelRect);
+ var containerPos = scaledPos - container.DesiredSize / 2 - new Vector2(0f, 0.75f) * MinimapScale;
+ SetPosition(container, containerPos);
+ }
+
+ _drawnDocks.Add(dock);
+ }
+ }
+
+ // Draw the dock's collision
+ var invertedPosition = Vector2.Zero;
+ invertedPosition.Y = -invertedPosition.Y;
+ var rotation = Matrix3.CreateRotation(-_angle.Value + MathF.PI);
+ var ourDockConnection = new UIBox2(
+ ScalePosition(rotation.Transform(new Vector2(-0.2f, -0.7f))),
+ ScalePosition(rotation.Transform(new Vector2(0.2f, -0.5f))));
+
+ var ourDock = new UIBox2(
+ ScalePosition(rotation.Transform(new Vector2(-0.5f, 0.5f))),
+ ScalePosition(rotation.Transform(new Vector2(0.5f, -0.5f))));
+
+ var dockColor = Color.Magenta;
+ var connectionColor = Color.Pink;
+
+ handle.DrawRect(ourDockConnection, connectionColor.WithAlpha(0.2f));
+ handle.DrawRect(ourDockConnection, connectionColor, filled: false);
+
+ // Draw the dock itself
+ handle.DrawRect(ourDock, dockColor.WithAlpha(0.2f));
+ handle.DrawRect(ourDock, dockColor, filled: false);
+ }
+
+ private void HideDocks()
+ {
+ foreach (var (dock, control) in _dockContainers)
+ {
+ if (_drawnDocks.Contains(dock))
+ continue;
+
+ control.Visible = false;
+ }
+ }
+
+ public void BuildDocks(EntityUid? shuttle)
+ {
+ var viewedEnt = ViewedDock;
+ _viewedState = null;
+
+ foreach (var btn in _dockButtons.Values)
+ {
+ btn.Dispose();
+ }
+
+ foreach (var container in _dockContainers.Values)
+ {
+ container.Dispose();
+ }
+
+ _dockButtons.Clear();
+ _dockContainers.Clear();
+
+ if (DockState == null)
+ return;
+
+ var gridNent = EntManager.GetNetEntity(GridEntity);
+
+ foreach (var (otherShuttle, docks) in DockState.Docks)
+ {
+ // If it's our shuttle we add a view button
+
+ foreach (var dock in docks)
+ {
+ if (dock.Entity == viewedEnt)
+ {
+ _viewedState = dock;
+ }
+
+ var container = new BoxContainer()
+ {
+ Orientation = BoxContainer.LayoutOrientation.Vertical,
+ Margin = new Thickness(3),
+ };
+
+ var panel = new PanelContainer()
+ {
+ HorizontalAlignment = HAlignment.Center,
+ VerticalAlignment = VAlignment.Center,
+ PanelOverride = new StyleBoxFlat(new Color(30, 30, 34, 200)),
+ Children =
+ {
+ container,
+ }
+ };
+
+ Button button;
+
+ if (otherShuttle == gridNent)
+ {
+ button = new Button()
+ {
+ Text = Loc.GetString("shuttle-console-view"),
+ };
+
+ button.OnPressed += args =>
+ {
+ SetViewedDock(dock);
+ };
+ }
+ else
+ {
+ if (dock.Connected)
+ {
+ button = new Button()
+ {
+ Text = Loc.GetString("shuttle-console-undock"),
+ };
+
+ button.OnPressed += args =>
+ {
+ _nextDockChange = _timing.CurTime + DockChangeCooldown;
+ UndockRequest?.Invoke(dock.Entity);
+ };
+ }
+ else
+ {
+ button = new Button()
+ {
+ Text = Loc.GetString("shuttle-console-dock"),
+ Disabled = true,
+ };
+
+ button.OnPressed += args =>
+ {
+ if (ViewedDock == null)
+ return;
+
+ _nextDockChange = _timing.CurTime + DockChangeCooldown;
+ DockRequest?.Invoke(ViewedDock.Value, dock.Entity);
+ };
+ }
+
+ _dockButtons.Add(dock, button);
+ }
+
+ container.AddChild(new Label()
+ {
+ Text = dock.Name,
+ HorizontalAlignment = HAlignment.Center,
+ });
+
+ button.HorizontalAlignment = HAlignment.Center;
+ container.AddChild(button);
+
+ AddChild(panel);
+ panel.Measure(Vector2Helpers.Infinity);
+ _dockContainers[dock] = panel;
+ }
+ }
+ }
+}
diff --git a/Content.Client/Shuttles/UI/ShuttleMapControl.xaml b/Content.Client/Shuttles/UI/ShuttleMapControl.xaml
new file mode 100644
index 00000000000..18abb9c9bc2
--- /dev/null
+++ b/Content.Client/Shuttles/UI/ShuttleMapControl.xaml
@@ -0,0 +1 @@
+
diff --git a/Content.Client/Shuttles/UI/ShuttleMapControl.xaml.cs b/Content.Client/Shuttles/UI/ShuttleMapControl.xaml.cs
new file mode 100644
index 00000000000..5800af2d878
--- /dev/null
+++ b/Content.Client/Shuttles/UI/ShuttleMapControl.xaml.cs
@@ -0,0 +1,609 @@
+using System.Buffers;
+using System.Numerics;
+using Content.Client.Shuttles.Systems;
+using Content.Shared.Shuttles.Components;
+using Content.Shared.Shuttles.UI.MapObjects;
+using Robust.Client.AutoGenerated;
+using Robust.Client.Graphics;
+using Robust.Client.Input;
+using Robust.Client.ResourceManagement;
+using Robust.Client.UserInterface;
+using Robust.Client.UserInterface.XAML;
+using Robust.Shared.Collections;
+using Robust.Shared.Input;
+using Robust.Shared.Map;
+using Robust.Shared.Map.Components;
+using Robust.Shared.Physics.Components;
+using Robust.Shared.Timing;
+using Robust.Shared.Utility;
+
+namespace Content.Client.Shuttles.UI;
+
+[GenerateTypedNameReferences]
+public sealed partial class ShuttleMapControl : BaseShuttleControl
+{
+ [Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly IInputManager _inputs = default!;
+ [Dependency] private readonly IMapManager _mapManager = default!;
+ private readonly ShuttleSystem _shuttles;
+ private readonly SharedTransformSystem _xformSystem;
+
+ protected override bool Draggable => true;
+
+ public bool ShowBeacons = true;
+ public MapId ViewingMap = MapId.Nullspace;
+
+ private EntityUid? _shuttleEntity;
+
+ private readonly Font _font;
+
+ private readonly EntityQuery _physicsQuery;
+
+ ///
+ /// Toggles FTL mode on. This shows a pre-vis for FTLing a grid.
+ ///
+ public bool FtlMode;
+
+ private Angle _ftlAngle;
+
+ ///
+ /// Are we currently in FTL.
+ ///
+ public bool InFtl;
+
+ ///
+ /// Raised when a request to FTL to a particular spot is raised.
+ ///
+ public event Action? RequestFTL;
+
+ public event Action? RequestBeaconFTL;
+
+ ///
+ /// Set every draw to determine the beacons that are clickable for mouse events
+ ///
+ private List _beacons = new();
+
+ // Per frame data to avoid re-allocating
+ private readonly List _mapObjects = new();
+ private readonly Dictionary> _verts = new();
+ private readonly Dictionary> _edges = new();
+ private readonly Dictionary> _strings = new();
+ private readonly List _viewportExclusions = new();
+
+ public ShuttleMapControl() : base(256f, 512f, 512f)
+ {
+ RobustXamlLoader.Load(this);
+ _shuttles = EntManager.System();
+ _xformSystem = EntManager.System();
+ var cache = IoCManager.Resolve();
+
+ _physicsQuery = EntManager.GetEntityQuery();
+
+ _font = new VectorFont(cache.GetResource("/EngineFonts/NotoSans/NotoSans-Regular.ttf"), 10);
+ }
+
+ public void SetMap(MapId mapId, Vector2 offset, bool recentering = false)
+ {
+ ViewingMap = mapId;
+ TargetOffset = offset;
+ Recentering = recentering;
+ }
+
+ public void SetShuttle(EntityUid? entity)
+ {
+ _shuttleEntity = entity;
+ }
+
+ protected override void MouseMove(GUIMouseMoveEventArgs args)
+ {
+ // No move for you.
+ if (FtlMode)
+ return;
+
+ base.MouseMove(args);
+ }
+
+ protected override void KeyBindUp(GUIBoundKeyEventArgs args)
+ {
+ if (FtlMode && ViewingMap != MapId.Nullspace)
+ {
+ if (args.Function == EngineKeyFunctions.UIClick)
+ {
+ var mapUid = _mapManager.GetMapEntityId(ViewingMap);
+
+ var beaconsOnly = EntManager.TryGetComponent(mapUid, out FTLDestinationComponent? destComp) &&
+ destComp.BeaconsOnly;
+
+ var mapTransform = Matrix3.CreateInverseTransform(Offset, Angle.Zero);
+
+ if (beaconsOnly && TryGetBeacon(_beacons, mapTransform, args.RelativePosition, PixelRect, out var foundBeacon, out _))
+ {
+ RequestBeaconFTL?.Invoke(foundBeacon.Entity, _ftlAngle);
+ }
+ else
+ {
+ // We'll send the "adjusted" position and server will adjust it back when relevant.
+ var mapCoords = new MapCoordinates(InverseMapPosition(args.RelativePosition), ViewingMap);
+ RequestFTL?.Invoke(mapCoords, _ftlAngle);
+ }
+ }
+ }
+
+ base.KeyBindUp(args);
+ }
+
+ protected override void MouseWheel(GUIMouseWheelEventArgs args)
+ {
+ // Scroll handles FTL rotation if you're in FTL mode.
+ if (FtlMode)
+ {
+ _ftlAngle += Angle.FromDegrees(15f) * args.Delta.Y;
+ _ftlAngle = _ftlAngle.Reduced();
+ return;
+ }
+
+ base.MouseWheel(args);
+ }
+
+ private void DrawParallax(DrawingHandleScreen handle)
+ {
+ if (!EntManager.TryGetComponent(_shuttleEntity, out TransformComponent? shuttleXform) || shuttleXform.MapUid == null)
+ return;
+
+ // TODO: Figure out how the fuck to make this common between the 3 slightly different parallax methods and move to parallaxsystem.
+ // Draw background texture
+ var tex = _shuttles.GetTexture(shuttleXform.MapUid.Value);
+
+ // Size of the texture in world units.
+ var size = tex.Size * MinimapScale * 1f;
+
+ var position = ScalePosition(new Vector2(-Offset.X, Offset.Y));
+ var slowness = 1f;
+
+ // The "home" position is the effective origin of this layer.
+ // Parallax shifting is relative to the home, and shifts away from the home and towards the Eye centre.
+ // The effects of this are such that a slowness of 1 anchors the layer to the centre of the screen, while a slowness of 0 anchors the layer to the world.
+ // (For values 0.0 to 1.0 this is in effect a lerp, but it's deliberately unclamped.)
+ // The ParallaxAnchor adapts the parallax for station positioning and possibly map-specific tweaks.
+ var home = Vector2.Zero;
+ var scrolled = Vector2.Zero;
+
+ // Origin - start with the parallax shift itself.
+ var originBL = (position - home) * slowness + scrolled;
+
+ // Place at the home.
+ originBL += home;
+
+ // Centre the image.
+ originBL -= size / 2;
+
+ // Remove offset so we can floor.
+ var botLeft = new Vector2(0f, 0f);
+ var topRight = botLeft + Size;
+
+ var flooredBL = botLeft - originBL;
+
+ // Floor to background size.
+ flooredBL = (flooredBL / size).Floored() * size;
+
+ // Re-offset.
+ flooredBL += originBL;
+
+ for (var x = flooredBL.X; x < topRight.X; x += size.X)
+ {
+ for (var y = flooredBL.Y; y < topRight.Y; y += size.Y)
+ {
+ handle.DrawTextureRect(tex, new UIBox2(x, y, x + size.X, y + size.Y));
+ }
+ }
+ }
+
+ ///
+ /// Gets the map objects that intersect the viewport.
+ ///
+ ///
+ ///
+ private List GetViewportMapObjects(Matrix3 matty, List mapObjects)
+ {
+ var results = new List();
+ var viewBox = SizeBox.Scale(1.2f);
+
+ foreach (var mapObj in mapObjects)
+ {
+ var mapCoords = _shuttles.GetMapCoordinates(mapObj);
+
+ var relativePos = matty.Transform(mapCoords.Position);
+ relativePos = relativePos with { Y = -relativePos.Y };
+ var uiPosition = ScalePosition(relativePos);
+
+ if (!viewBox.Contains(uiPosition.Floored()))
+ continue;
+
+ results.Add(mapObj);
+ }
+
+ return results;
+ }
+
+ protected override void Draw(DrawingHandleScreen handle)
+ {
+ base.Draw(handle);
+
+ if (ViewingMap == MapId.Nullspace)
+ return;
+
+ var mapObjects = _mapObjects;
+ DrawRecenter();
+
+ if (InFtl || mapObjects.Count == 0)
+ {
+ DrawBacking(handle);
+ DrawNoSignal(handle);
+ return;
+ }
+
+ DrawParallax(handle);
+
+ var viewedMapUid = _mapManager.GetMapEntityId(ViewingMap);
+ var matty = Matrix3.CreateInverseTransform(Offset, Angle.Zero);
+ var realTime = _timing.RealTime;
+ var viewBox = new Box2(Offset - WorldRangeVector, Offset + WorldRangeVector);
+ var viewportObjects = GetViewportMapObjects(matty, mapObjects);
+ _viewportExclusions.Clear();
+
+ // Draw our FTL range + no FTL zones
+ // Do it up here because we want this layered below most things.
+ if (FtlMode)
+ {
+ if (EntManager.TryGetComponent(_shuttleEntity, out var shuttleXform))
+ {
+ var gridUid = _shuttleEntity.Value;
+ var gridPhysics = _physicsQuery.GetComponent(gridUid);
+ var (gridPos, gridRot) = _xformSystem.GetWorldPositionRotation(shuttleXform);
+ gridPos = Maps.GetGridPosition((gridUid, gridPhysics), gridPos, gridRot);
+
+ var gridRelativePos = matty.Transform(gridPos);
+ gridRelativePos = gridRelativePos with { Y = -gridRelativePos.Y };
+ var gridUiPos = ScalePosition(gridRelativePos);
+
+ var range = _shuttles.GetFTLRange(gridUid);
+ range *= MinimapScale;
+ handle.DrawCircle(gridUiPos, range, Color.Gold, filled: false);
+ }
+ }
+
+ var exclusionColor = Color.Red;
+
+ // Exclusions need a bumped range so we check all the ones on the map.
+ foreach (var mapObj in mapObjects)
+ {
+ if (mapObj is not ShuttleExclusionObject exclusion)
+ continue;
+
+ // Check if it even intersects the viewport.
+ var coords = EntManager.GetCoordinates(exclusion.Coordinates);
+ var mapCoords = _xformSystem.ToMapCoordinates(coords);
+ var enlargedBounds = viewBox.Enlarged(exclusion.Range);
+
+ if (mapCoords.MapId != ViewingMap ||
+ !enlargedBounds.Contains(mapCoords.Position))
+ {
+ continue;
+ }
+
+ var adjustedPos = matty.Transform(mapCoords.Position);
+ var localPos = ScalePosition(adjustedPos with { Y = -adjustedPos.Y});
+ handle.DrawCircle(localPos, exclusion.Range * MinimapScale, exclusionColor.WithAlpha(0.05f));
+ handle.DrawCircle(localPos, exclusion.Range * MinimapScale, exclusionColor, filled: false);
+
+ _viewportExclusions.Add(exclusion);
+ }
+
+ _verts.Clear();
+ _edges.Clear();
+ _strings.Clear();
+
+ // Add beacons if relevant.
+ var beaconsOnly = _shuttles.IsBeaconMap(viewedMapUid);
+ var controlLocalBounds = PixelRect;
+ _beacons.Clear();
+
+ if (ShowBeacons)
+ {
+ var beaconColor = Color.AliceBlue;
+
+ foreach (var (beaconName, coords, mapO) in GetBeacons(viewportObjects, matty, controlLocalBounds))
+ {
+ var localPos = matty.Transform(coords.Position);
+ localPos = localPos with { Y = -localPos.Y };
+ var beaconUiPos = ScalePosition(localPos);
+ var mapObject = GetMapObject(localPos, Angle.Zero, scale: 0.75f, scalePosition: true);
+
+ var existingVerts = _verts.GetOrNew(beaconColor);
+ var existingEdges = _edges.GetOrNew(beaconColor);
+
+ AddMapObject(existingEdges, existingVerts, mapObject);
+ _beacons.Add(mapO);
+
+ var existingStrings = _strings.GetOrNew(beaconColor);
+ existingStrings.Add((beaconUiPos, beaconName));
+ }
+ }
+
+ foreach (var mapObj in viewportObjects)
+ {
+ if (mapObj is not GridMapObject gridObj || !EntManager.TryGetComponent(gridObj.Entity, out MapGridComponent? mapGrid))
+ continue;
+
+ Entity grid = (gridObj.Entity, mapGrid);
+ IFFComponent? iffComp = null;
+
+ // Rudimentary IFF for now, if IFF hiding on then we don't show on the map at all
+ if (grid.Owner != _shuttleEntity &&
+ EntManager.TryGetComponent(grid, out iffComp) &&
+ (iffComp.Flags & (IFFFlags.Hide | IFFFlags.HideLabel)) != 0x0)
+ {
+ continue;
+ }
+
+ var gridColor = _shuttles.GetIFFColor(grid, self: _shuttleEntity == grid.Owner, component: iffComp);
+
+ var existingVerts = _verts.GetOrNew(gridColor);
+ var existingEdges = _edges.GetOrNew(gridColor);
+
+ var gridPhysics = _physicsQuery.GetComponent(grid.Owner);
+ var (gridPos, gridRot) = _xformSystem.GetWorldPositionRotation(grid.Owner);
+ gridPos = Maps.GetGridPosition((grid, gridPhysics), gridPos, gridRot);
+
+ var gridRelativePos = matty.Transform(gridPos);
+ gridRelativePos = gridRelativePos with { Y = -gridRelativePos.Y };
+ var gridUiPos = ScalePosition(gridRelativePos);
+
+ var mapObject = GetMapObject(gridRelativePos, Angle.Zero, scalePosition: true);
+ AddMapObject(existingEdges, existingVerts, mapObject);
+
+ // Text
+ // Force drawing it at this point.
+ var iffText = _shuttles.GetIFFLabel(grid, self: true, component: iffComp);
+
+ if (string.IsNullOrEmpty(iffText))
+ continue;
+
+ var existingStrings = _strings.GetOrNew(gridColor);
+ existingStrings.Add((gridUiPos, iffText));
+ }
+
+ // Batch the colors whoopie
+ // really only affects forks with lots of grids.
+ foreach (var (color, sendVerts) in _verts)
+ {
+ handle.DrawPrimitives(DrawPrimitiveTopology.TriangleList, sendVerts, color.WithAlpha(0.05f));
+ }
+
+ foreach (var (color, sendEdges) in _edges)
+ {
+ handle.DrawPrimitives(DrawPrimitiveTopology.LineList, sendEdges, color);
+ }
+
+ foreach (var (color, sendStrings) in _strings)
+ {
+ var adjustedColor = Color.FromSrgb(color);
+
+ foreach (var (gridUiPos, iffText) in sendStrings)
+ {
+ var textWidth = handle.GetDimensions(_font, iffText, UIScale);
+ handle.DrawString(_font, gridUiPos + textWidth with { X = -textWidth.X / 2f }, iffText, adjustedColor);
+ }
+ }
+
+ var mousePos = _inputs.MouseScreenPosition;
+ var mouseLocalPos = GetLocalPosition(mousePos);
+
+ // Draw dotted line from our own shuttle entity to mouse.
+ if (FtlMode)
+ {
+ if (mousePos.Window != WindowId.Invalid)
+ {
+ // If mouse inbounds then draw it.
+ if (_shuttleEntity != null && controlLocalBounds.Contains(mouseLocalPos.Floored()) &&
+ EntManager.TryGetComponent(_shuttleEntity, out TransformComponent? shuttleXform) &&
+ shuttleXform.MapID != MapId.Nullspace)
+ {
+ // If it's a beacon only map then snap the mouse to a nearby spot.
+ ShuttleBeaconObject foundBeacon = default;
+
+ // Check for beacons around mouse and snap to that.
+ if (beaconsOnly && TryGetBeacon(viewportObjects, matty, mouseLocalPos, controlLocalBounds, out foundBeacon, out var foundLocalPos))
+ {
+ mouseLocalPos = foundLocalPos;
+ }
+
+ var grid = EntManager.GetComponent(_shuttleEntity.Value);
+
+ var (gridPos, gridRot) = _xformSystem.GetWorldPositionRotation(shuttleXform);
+ gridPos = Maps.GetGridPosition(_shuttleEntity.Value, gridPos, gridRot);
+
+ // do NOT apply LocalCenter operation here because it will be adjusted in FTLFree.
+ var mouseMapPos = InverseMapPosition(mouseLocalPos);
+
+ var ftlFree = (!beaconsOnly || foundBeacon != default) &&
+ _shuttles.FTLFree(_shuttleEntity.Value, new EntityCoordinates(viewedMapUid, mouseMapPos), _ftlAngle, _viewportExclusions);
+
+ var color = ftlFree ? Color.LimeGreen : Color.Magenta;
+
+ var gridRelativePos = matty.Transform(gridPos);
+ gridRelativePos = gridRelativePos with { Y = -gridRelativePos.Y };
+ var gridUiPos = ScalePosition(gridRelativePos);
+
+ // Draw FTL buffer around the mouse.
+ var ourFTLBuffer = _shuttles.GetFTLBufferRange(_shuttleEntity.Value, grid);
+ ourFTLBuffer *= MinimapScale;
+ handle.DrawCircle(mouseLocalPos, ourFTLBuffer, Color.Magenta.WithAlpha(0.01f));
+ handle.DrawCircle(mouseLocalPos, ourFTLBuffer, Color.Magenta, filled: false);
+
+ // Draw line from our shuttle to target
+ // Might need to clip the line if it's too far? But my brain wasn't working so F.
+ handle.DrawDottedLine(gridUiPos, mouseLocalPos, color, (float) realTime.TotalSeconds * 30f);
+
+ // Draw shuttle pre-vis
+ var mouseVerts = GetMapObject(mouseLocalPos, _ftlAngle, scale: MinimapScale);
+
+ handle.DrawPrimitives(DrawPrimitiveTopology.TriangleFan, mouseVerts.Span, color.WithAlpha(0.05f));
+ handle.DrawPrimitives(DrawPrimitiveTopology.LineLoop, mouseVerts.Span, color);
+
+ // Draw a notch indicating direction.
+ var ftlLength = GetMapObjectRadius() + 16f;
+ var ftlEnd = mouseLocalPos + _ftlAngle.RotateVec(new Vector2(0f, -ftlLength));
+
+ handle.DrawLine(mouseLocalPos, ftlEnd, color);
+ }
+ }
+ }
+
+ // Draw the coordinates
+ var mapOffset = MidPointVector;
+
+ if (mousePos.Window != WindowId.Invalid &&
+ controlLocalBounds.Contains(mouseLocalPos.Floored()))
+ {
+ mapOffset = mouseLocalPos;
+ }
+
+ mapOffset = InverseMapPosition(mapOffset);
+ var coordsText = $"{mapOffset.X:0.0}, {mapOffset.Y:0.0}";
+ DrawData(handle, coordsText);
+ }
+
+ private void AddMapObject(List edges, List verts, ValueList mapObject)
+ {
+ var bottom = mapObject[0];
+ var right = mapObject[1];
+ var top = mapObject[2];
+ var left = mapObject[3];
+
+ // Diamond interior
+ verts.Add(bottom);
+ verts.Add(right);
+ verts.Add(top);
+
+ verts.Add(bottom);
+ verts.Add(top);
+ verts.Add(left);
+
+ // Diamond edges
+ edges.Add(bottom);
+ edges.Add(right);
+ edges.Add(right);
+ edges.Add(top);
+ edges.Add(top);
+ edges.Add(left);
+ edges.Add(left);
+ edges.Add(bottom);
+ }
+
+ ///
+ /// Returns the beacons that intersect the viewport.
+ ///
+ private IEnumerable<(string Beacon, MapCoordinates Coordinates, IMapObject MapObject)> GetBeacons(List mapObjs, Matrix3 mapTransform, UIBox2i area)
+ {
+ foreach (var mapO in mapObjs)
+ {
+ if (mapO is not ShuttleBeaconObject beacon)
+ continue;
+
+ var beaconCoords = EntManager.GetCoordinates(beacon.Coordinates).ToMap(EntManager, _xformSystem);
+ var position = mapTransform.Transform(beaconCoords.Position);
+ var localPos = ScalePosition(position with {Y = -position.Y});
+
+ // If beacon not on screen then ignore it.
+ if (!area.Contains(localPos.Floored()))
+ continue;
+
+ yield return (beacon.Name, beaconCoords, mapO);
+ }
+ }
+
+ private float GetMapObjectRadius(float scale = 1f) => WorldRange / 40f * scale;
+
+ private ValueList GetMapObject(Vector2 localPos, Angle angle, float scale = 1f, bool scalePosition = false)
+ {
+ // Constant size diamonds
+ var diamondRadius = GetMapObjectRadius();
+
+ var mapObj = new ValueList(4)
+ {
+ localPos + angle.RotateVec(new Vector2(0f, -2f * diamondRadius)) * scale,
+ localPos + angle.RotateVec(new Vector2(diamondRadius, 0f)) * scale,
+ localPos + angle.RotateVec(new Vector2(0f, 2f * diamondRadius)) * scale,
+ localPos + angle.RotateVec(new Vector2(-diamondRadius, 0f)) * scale,
+ };
+
+ if (scalePosition)
+ {
+ for (var i = 0; i < mapObj.Count; i++)
+ {
+ mapObj[i] = ScalePosition(mapObj[i]);
+ }
+ }
+
+ return mapObj;
+ }
+
+ private bool TryGetBeacon(IEnumerable mapObjects, Matrix3 mapTransform, Vector2 mousePos, UIBox2i area, out ShuttleBeaconObject foundBeacon, out Vector2 foundLocalPos)
+ {
+ // In pixels
+ const float BeaconSnapRange = 32f;
+ float nearestValue = float.MaxValue;
+ foundLocalPos = Vector2.Zero;
+ foundBeacon = default;
+
+ foreach (var mapObj in mapObjects)
+ {
+ if (mapObj is not ShuttleBeaconObject beaconObj)
+ continue;
+
+ var beaconCoords = _xformSystem.ToMapCoordinates(EntManager.GetCoordinates(beaconObj.Coordinates));
+
+ if (beaconCoords.MapId != ViewingMap)
+ continue;
+
+ // Invalid beacon?
+ if (!_shuttles.CanFTLBeacon(beaconObj.Coordinates))
+ continue;
+
+ var position = mapTransform.Transform(beaconCoords.Position);
+ var localPos = ScalePosition(position with {Y = -position.Y});
+
+ // If beacon not on screen then ignore it.
+ if (!area.Contains(localPos.Floored()))
+ continue;
+
+ var distance = (localPos - mousePos).Length();
+
+ if (distance > BeaconSnapRange ||
+ distance > nearestValue)
+ {
+ continue;
+ }
+
+ foundLocalPos = localPos;
+ nearestValue = distance;
+ foundBeacon = beaconObj;
+ }
+
+ return foundBeacon != default;
+ }
+
+ ///
+ /// Sets the map objects for the next draw.
+ ///
+ public void SetMapObjects(Dictionary> mapObjects)
+ {
+ _mapObjects.Clear();
+
+ if (mapObjects.TryGetValue(ViewingMap, out var obbies))
+ {
+ _mapObjects.AddRange(obbies);
+ }
+ }
+}
diff --git a/Content.Client/Shuttles/UI/ShuttleNavControl.xaml b/Content.Client/Shuttles/UI/ShuttleNavControl.xaml
new file mode 100644
index 00000000000..f517a30c181
--- /dev/null
+++ b/Content.Client/Shuttles/UI/ShuttleNavControl.xaml
@@ -0,0 +1 @@
+
diff --git a/Content.Client/Shuttles/UI/ShuttleNavControl.xaml.cs b/Content.Client/Shuttles/UI/ShuttleNavControl.xaml.cs
new file mode 100644
index 00000000000..18122415f5e
--- /dev/null
+++ b/Content.Client/Shuttles/UI/ShuttleNavControl.xaml.cs
@@ -0,0 +1,288 @@
+using System.Numerics;
+using Content.Shared.Shuttles.BUIStates;
+using Content.Shared.Shuttles.Components;
+using Content.Shared.Shuttles.Systems;
+using JetBrains.Annotations;
+using Robust.Client.AutoGenerated;
+using Robust.Client.Graphics;
+using Robust.Client.UserInterface;
+using Robust.Client.UserInterface.XAML;
+using Robust.Shared.Collections;
+using Robust.Shared.Input;
+using Robust.Shared.Map;
+using Robust.Shared.Map.Components;
+using Robust.Shared.Physics;
+using Robust.Shared.Physics.Components;
+using Robust.Shared.Utility;
+
+namespace Content.Client.Shuttles.UI;
+
+[GenerateTypedNameReferences]
+public sealed partial class ShuttleNavControl : BaseShuttleControl
+{
+ [Dependency] private readonly IMapManager _mapManager = default!;
+ private readonly SharedShuttleSystem _shuttles;
+ private readonly SharedTransformSystem _transform;
+
+ ///
+ /// Used to transform all of the radar objects. Typically is a shuttle console parented to a grid.
+ ///
+ private EntityCoordinates? _coordinates;
+
+ private Angle? _rotation;
+
+ private Dictionary> _docks = new();
+
+ public bool ShowIFF { get; set; } = true;
+ public bool ShowDocks { get; set; } = true;
+
+ ///
+ /// Raised if the user left-clicks on the radar control with the relevant entitycoordinates.
+ ///
+ public Action? OnRadarClick;
+
+ private List> _grids = new();
+
+ public ShuttleNavControl() : base(64f, 256f, 256f)
+ {
+ RobustXamlLoader.Load(this);
+ _shuttles = EntManager.System();
+ _transform = EntManager.System();
+ }
+
+ public void SetMatrix(EntityCoordinates? coordinates, Angle? angle)
+ {
+ _coordinates = coordinates;
+ _rotation = angle;
+ }
+
+ protected override void KeyBindUp(GUIBoundKeyEventArgs args)
+ {
+ base.KeyBindUp(args);
+
+ if (_coordinates == null || _rotation == null || args.Function != EngineKeyFunctions.UIClick ||
+ OnRadarClick == null)
+ {
+ return;
+ }
+
+ var a = InverseScalePosition(args.RelativePosition);
+ var relativeWorldPos = new Vector2(a.X, -a.Y);
+ relativeWorldPos = _rotation.Value.RotateVec(relativeWorldPos);
+ var coords = _coordinates.Value.Offset(relativeWorldPos);
+ OnRadarClick?.Invoke(coords);
+ }
+
+ ///
+ /// Gets the entitycoordinates of where the mouseposition is, relative to the control.
+ ///
+ [PublicAPI]
+ public EntityCoordinates GetMouseCoordinates(ScreenCoordinates screen)
+ {
+ if (_coordinates == null || _rotation == null)
+ {
+ return EntityCoordinates.Invalid;
+ }
+
+ var pos = screen.Position / UIScale - GlobalPosition;
+
+ var a = InverseScalePosition(pos);
+ var relativeWorldPos = new Vector2(a.X, -a.Y);
+ relativeWorldPos = _rotation.Value.RotateVec(relativeWorldPos);
+ var coords = _coordinates.Value.Offset(relativeWorldPos);
+ return coords;
+ }
+
+ public void UpdateState(NavInterfaceState state)
+ {
+ SetMatrix(EntManager.GetCoordinates(state.Coordinates), state.Angle);
+
+ WorldMaxRange = state.MaxRange;
+
+ if (WorldMaxRange < WorldRange)
+ {
+ ActualRadarRange = WorldMaxRange;
+ }
+
+ if (WorldMaxRange < WorldMinRange)
+ WorldMinRange = WorldMaxRange;
+
+ ActualRadarRange = Math.Clamp(ActualRadarRange, WorldMinRange, WorldMaxRange);
+
+ _docks = state.Docks;
+ }
+
+ protected override void Draw(DrawingHandleScreen handle)
+ {
+ base.Draw(handle);
+
+ DrawBacking(handle);
+ DrawCircles(handle);
+
+ // No data
+ if (_coordinates == null || _rotation == null)
+ {
+ return;
+ }
+
+ var xformQuery = EntManager.GetEntityQuery();
+ var fixturesQuery = EntManager.GetEntityQuery();
+ var bodyQuery = EntManager.GetEntityQuery();
+
+ if (!xformQuery.TryGetComponent(_coordinates.Value.EntityId, out var xform)
+ || xform.MapID == MapId.Nullspace)
+ {
+ return;
+ }
+
+ var mapPos = _transform.ToMapCoordinates(_coordinates.Value);
+ var offset = _coordinates.Value.Position;
+ var posMatrix = Matrix3.CreateTransform(offset, _rotation.Value);
+ var (_, ourEntRot, ourEntMatrix) = _transform.GetWorldPositionRotationMatrix(_coordinates.Value.EntityId);
+ Matrix3.Multiply(posMatrix, ourEntMatrix, out var ourWorldMatrix);
+ var ourWorldMatrixInvert = ourWorldMatrix.Invert();
+
+ // Draw our grid in detail
+ var ourGridId = xform.GridUid;
+ if (EntManager.TryGetComponent(ourGridId, out var ourGrid) &&
+ fixturesQuery.HasComponent(ourGridId.Value))
+ {
+ var ourGridMatrix = _transform.GetWorldMatrix(ourGridId.Value);
+ Matrix3.Multiply(in ourGridMatrix, in ourWorldMatrixInvert, out var matrix);
+ var color = _shuttles.GetIFFColor(ourGridId.Value, self: true);
+
+ DrawGrid(handle, matrix, (ourGridId.Value, ourGrid), color);
+ DrawDocks(handle, ourGridId.Value, matrix);
+ }
+
+ var invertedPosition = _coordinates.Value.Position - offset;
+ invertedPosition.Y = -invertedPosition.Y;
+ // Don't need to transform the InvWorldMatrix again as it's already offset to its position.
+
+ // Draw radar position on the station
+ var radarPos = invertedPosition;
+ const float radarVertRadius = 2f;
+
+ var radarPosVerts = new Vector2[]
+ {
+ ScalePosition(radarPos + new Vector2(0f, -radarVertRadius)),
+ ScalePosition(radarPos + new Vector2(radarVertRadius / 2f, 0f)),
+ ScalePosition(radarPos + new Vector2(0f, radarVertRadius)),
+ ScalePosition(radarPos + new Vector2(radarVertRadius / -2f, 0f)),
+ };
+
+ handle.DrawPrimitives(DrawPrimitiveTopology.TriangleFan, radarPosVerts, Color.Lime);
+
+ var rot = ourEntRot + _rotation.Value;
+ var viewBounds = new Box2Rotated(new Box2(-WorldRange, -WorldRange, WorldRange, WorldRange).Translated(mapPos.Position), rot, mapPos.Position);
+ var viewAABB = viewBounds.CalcBoundingBox();
+
+ _grids.Clear();
+ _mapManager.FindGridsIntersecting(xform.MapID, new Box2(mapPos.Position - MaxRadarRangeVector, mapPos.Position + MaxRadarRangeVector), ref _grids, approx: true, includeMap: false);
+
+ // Draw other grids... differently
+ foreach (var grid in _grids)
+ {
+ var gUid = grid.Owner;
+ if (gUid == ourGridId || !fixturesQuery.HasComponent(gUid))
+ continue;
+
+ var gridBody = bodyQuery.GetComponent(gUid);
+ EntManager.TryGetComponent(gUid, out var iff);
+
+ if (!_shuttles.CanDraw(gUid, gridBody, iff))
+ continue;
+
+ var gridMatrix = _transform.GetWorldMatrix(gUid);
+ Matrix3.Multiply(in gridMatrix, in ourWorldMatrixInvert, out var matty);
+ var color = _shuttles.GetIFFColor(grid, self: false, iff);
+
+ // Others default:
+ // Color.FromHex("#FFC000FF")
+ // Hostile default: Color.Firebrick
+ var labelName = _shuttles.GetIFFLabel(grid, self: false, iff);
+
+ if (ShowIFF &&
+ labelName != null)
+ {
+ var gridBounds = grid.Comp.LocalAABB;
+
+ var gridCentre = matty.Transform(gridBody.LocalCenter);
+ gridCentre.Y = -gridCentre.Y;
+ var distance = gridCentre.Length();
+ var labelText = Loc.GetString("shuttle-console-iff-label", ("name", labelName),
+ ("distance", $"{distance:0.0}"));
+ var labelDimensions = handle.GetDimensions(Font, labelText, UIScale);
+
+ // y-offset the control to always render below the grid (vertically)
+ var yOffset = Math.Max(gridBounds.Height, gridBounds.Width) * MinimapScale / 1.8f / UIScale;
+
+ // The actual position in the UI. We offset the matrix position to render it off by half its width
+ // plus by the offset.
+ var uiPosition = ScalePosition(gridCentre) / UIScale - new Vector2(labelDimensions.X / 2f, -yOffset);
+
+ // Look this is uggo so feel free to cleanup. We just need to clamp the UI position to within the viewport.
+ uiPosition = new Vector2(Math.Clamp(uiPosition.X, 0f, Width - labelDimensions.X),
+ Math.Clamp(uiPosition.Y, 0f, Height - labelDimensions.Y));
+
+ handle.DrawString(Font, uiPosition, labelText, color);
+ }
+
+ // Detailed view
+ var gridAABB = gridMatrix.TransformBox(grid.Comp.LocalAABB);
+
+ // Skip drawing if it's out of range.
+ if (!gridAABB.Intersects(viewAABB))
+ continue;
+
+ DrawGrid(handle, matty, grid, color);
+ DrawDocks(handle, gUid, matty);
+ }
+ }
+
+ private void DrawDocks(DrawingHandleScreen handle, EntityUid uid, Matrix3 matrix)
+ {
+ if (!ShowDocks)
+ return;
+
+ const float DockScale = 0.6f;
+ var nent = EntManager.GetNetEntity(uid);
+
+ if (_docks.TryGetValue(nent, out var docks))
+ {
+ foreach (var state in docks)
+ {
+ var position = state.Coordinates.Position;
+ var uiPosition = matrix.Transform(position);
+
+ if (uiPosition.Length() > (WorldRange * 2f) - DockScale)
+ continue;
+
+ var color = Color.ToSrgb(Color.Magenta);
+
+ var verts = new[]
+ {
+ matrix.Transform(position + new Vector2(-DockScale, -DockScale)),
+ matrix.Transform(position + new Vector2(DockScale, -DockScale)),
+ matrix.Transform(position + new Vector2(DockScale, DockScale)),
+ matrix.Transform(position + new Vector2(-DockScale, DockScale)),
+ };
+
+ for (var i = 0; i < verts.Length; i++)
+ {
+ var vert = verts[i];
+ vert.Y = -vert.Y;
+ verts[i] = ScalePosition(vert);
+ }
+
+ handle.DrawPrimitives(DrawPrimitiveTopology.TriangleFan, verts, color.WithAlpha(0.8f));
+ handle.DrawPrimitives(DrawPrimitiveTopology.LineStrip, verts, color);
+ }
+ }
+ }
+
+ private Vector2 InverseScalePosition(Vector2 value)
+ {
+ return (value - MidPointVector) / MinimapScale;
+ }
+}
diff --git a/Content.Client/UserInterface/Controls/MapGridControl.cs b/Content.Client/UserInterface/Controls/MapGridControl.cs
deleted file mode 100644
index d56790431fa..00000000000
--- a/Content.Client/UserInterface/Controls/MapGridControl.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-using System.Numerics;
-using Robust.Client.Graphics;
-using Robust.Client.UserInterface;
-using Robust.Shared.Timing;
-
-namespace Content.Client.UserInterface.Controls;
-
-///
-/// Handles generic grid-drawing data, with zoom and dragging.
-///
-public abstract class MapGridControl : Control
-{
- [Dependency] protected readonly IGameTiming Timing = default!;
-
- protected const float ScrollSensitivity = 8f;
-
- ///
- /// UI pixel radius.
- ///
- public const int UIDisplayRadius = 320;
- protected const int MinimapMargin = 4;
-
- protected float WorldMinRange;
- protected float WorldMaxRange;
- public float WorldRange;
-
- ///
- /// We'll lerp between the radarrange and actual range
- ///
- protected float ActualRadarRange;
-
- ///
- /// Controls the maximum distance that will display.
- ///
- public float MaxRadarRange { get; private set; } = 256f * 10f;
-
- public Vector2 MaxRadarRangeVector => new Vector2(MaxRadarRange, MaxRadarRange);
-
- protected Vector2 MidpointVector => new Vector2(MidPoint, MidPoint);
-
- protected int MidPoint => SizeFull / 2;
- protected int SizeFull => (int) ((UIDisplayRadius + MinimapMargin) * 2 * UIScale);
- protected int ScaledMinimapRadius => (int) (UIDisplayRadius * UIScale);
- protected float MinimapScale => WorldRange != 0 ? ScaledMinimapRadius / WorldRange : 0f;
-
- public event Action? WorldRangeChanged;
-
- public MapGridControl(float minRange, float maxRange, float range)
- {
- IoCManager.InjectDependencies(this);
- SetSize = new Vector2(SizeFull, SizeFull);
- RectClipContent = true;
- MouseFilter = MouseFilterMode.Stop;
- ActualRadarRange = WorldRange;
- WorldMinRange = minRange;
- WorldMaxRange = maxRange;
- WorldRange = range;
- ActualRadarRange = range;
- }
-
- protected override void MouseWheel(GUIMouseWheelEventArgs args)
- {
- base.MouseWheel(args);
- AddRadarRange(-args.Delta.Y * 1f / ScrollSensitivity * ActualRadarRange);
- }
-
- public void AddRadarRange(float value)
- {
- ActualRadarRange = Math.Clamp(ActualRadarRange + value, WorldMinRange, WorldMaxRange);
- }
-
- protected override void Draw(DrawingHandleScreen handle)
- {
- base.Draw(handle);
- if (!ActualRadarRange.Equals(WorldRange))
- {
- var diff = ActualRadarRange - WorldRange;
- const float lerpRate = 10f;
-
- WorldRange += (float) Math.Clamp(diff, -lerpRate * MathF.Abs(diff) * Timing.FrameTime.TotalSeconds, lerpRate * MathF.Abs(diff) * Timing.FrameTime.TotalSeconds);
- WorldRangeChanged?.Invoke(WorldRange);
- }
- }
-}
diff --git a/Content.Client/UserInterface/Controls/MapGridControl.xaml b/Content.Client/UserInterface/Controls/MapGridControl.xaml
new file mode 100644
index 00000000000..7003afa5265
--- /dev/null
+++ b/Content.Client/UserInterface/Controls/MapGridControl.xaml
@@ -0,0 +1 @@
+
diff --git a/Content.Client/UserInterface/Controls/MapGridControl.xaml.cs b/Content.Client/UserInterface/Controls/MapGridControl.xaml.cs
new file mode 100644
index 00000000000..adefd3c1aef
--- /dev/null
+++ b/Content.Client/UserInterface/Controls/MapGridControl.xaml.cs
@@ -0,0 +1,243 @@
+using System.Numerics;
+using Robust.Client.AutoGenerated;
+using Robust.Client.Graphics;
+using Robust.Client.ResourceManagement;
+using Robust.Client.UserInterface;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.XAML;
+using Robust.Shared.Input;
+using Robust.Shared.Timing;
+
+namespace Content.Client.UserInterface.Controls;
+
+///
+/// Handles generic grid-drawing data, with zoom and dragging.
+///
+[GenerateTypedNameReferences]
+[Virtual]
+public partial class MapGridControl : LayoutContainer
+{
+ [Dependency] protected readonly IEntityManager EntManager = default!;
+ [Dependency] protected readonly IGameTiming Timing = default!;
+
+ protected static readonly Color BackingColor = new Color(0.08f, 0.08f, 0.08f);
+
+ private Font _largerFont;
+
+ /* Dragging */
+ protected virtual bool Draggable { get; } = false;
+
+ ///
+ /// Control offset from whatever is being tracked.
+ ///
+ public Vector2 Offset;
+
+ ///
+ /// If the control is being recentered what is the target offset to reach.
+ ///
+ public Vector2 TargetOffset;
+
+ private bool _draggin;
+ protected Vector2 StartDragPosition;
+ protected bool Recentering;
+
+ protected const float ScrollSensitivity = 8f;
+
+ protected float RecenterMinimum = 0.05f;
+
+ ///
+ /// UI pixel radius.
+ ///
+ public const int UIDisplayRadius = 320;
+ protected const int MinimapMargin = 4;
+
+ protected float WorldMinRange;
+ protected float WorldMaxRange;
+ public float WorldRange;
+ public Vector2 WorldRangeVector => new Vector2(WorldRange, WorldRange);
+
+ ///
+ /// We'll lerp between the radarrange and actual range
+ ///
+ protected float ActualRadarRange;
+
+ protected float CornerRadarRange => MathF.Sqrt(ActualRadarRange * ActualRadarRange + ActualRadarRange * ActualRadarRange) * 1.1f;
+
+ ///
+ /// Controls the maximum distance that will display.
+ ///
+ public float MaxRadarRange { get; private set; } = 256f * 10f;
+
+ public Vector2 MaxRadarRangeVector => new Vector2(MaxRadarRange, MaxRadarRange);
+
+ protected Vector2 MidPointVector => new Vector2(MidPoint, MidPoint);
+
+ protected int MidPoint => SizeFull / 2;
+ protected int SizeFull => (int) ((UIDisplayRadius + MinimapMargin) * 2 * UIScale);
+ protected int ScaledMinimapRadius => (int) (UIDisplayRadius * UIScale);
+ protected float MinimapScale => WorldRange != 0 ? ScaledMinimapRadius / WorldRange : 0f;
+
+ public event Action? WorldRangeChanged;
+
+ public MapGridControl() : this(32f, 32f, 32f) {}
+
+ public MapGridControl(float minRange, float maxRange, float range)
+ {
+ RobustXamlLoader.Load(this);
+ IoCManager.InjectDependencies(this);
+ SetSize = new Vector2(SizeFull, SizeFull);
+ RectClipContent = true;
+ MouseFilter = MouseFilterMode.Stop;
+ ActualRadarRange = WorldRange;
+ WorldMinRange = minRange;
+ WorldMaxRange = maxRange;
+ WorldRange = range;
+ ActualRadarRange = range;
+
+ var cache = IoCManager.Resolve();
+ _largerFont = new VectorFont(cache.GetResource("/EngineFonts/NotoSans/NotoSans-Regular.ttf"), 16);
+ }
+
+ public void ForceRecenter()
+ {
+ Recentering = true;
+ }
+
+ protected override void KeyBindDown(GUIBoundKeyEventArgs args)
+ {
+ base.KeyBindDown(args);
+
+ if (!Draggable)
+ return;
+
+ if (args.Function == EngineKeyFunctions.Use)
+ {
+ StartDragPosition = args.PointerLocation.Position;
+ _draggin = true;
+ }
+ }
+
+ protected override void KeyBindUp(GUIBoundKeyEventArgs args)
+ {
+ if (!Draggable)
+ return;
+
+ if (args.Function == EngineKeyFunctions.Use)
+ _draggin = false;
+ }
+
+ protected override void MouseMove(GUIMouseMoveEventArgs args)
+ {
+ base.MouseMove(args);
+
+ if (!_draggin)
+ return;
+
+ Recentering = false;
+ Offset -= new Vector2(args.Relative.X, -args.Relative.Y) / MidPoint * WorldRange;
+ }
+
+ protected override void MouseWheel(GUIMouseWheelEventArgs args)
+ {
+ base.MouseWheel(args);
+ AddRadarRange(-args.Delta.Y * 1f / ScrollSensitivity * ActualRadarRange);
+ }
+
+ public void AddRadarRange(float value)
+ {
+ ActualRadarRange = Math.Clamp(ActualRadarRange + value, WorldMinRange, WorldMaxRange);
+ }
+
+ ///
+ /// Converts map coordinates to the local control.
+ ///
+ protected Vector2 ScalePosition(Vector2 value)
+ {
+ return ScalePosition(value, MinimapScale, MidPointVector);
+ }
+
+ protected static Vector2 ScalePosition(Vector2 value, float minimapScale, Vector2 midpointVector)
+ {
+ return value * minimapScale + midpointVector;
+ }
+
+ ///
+ /// Converts local coordinates on the control to map coordinates.
+ ///
+ protected Vector2 InverseMapPosition(Vector2 value)
+ {
+ var inversePos = (value - MidPointVector) / MinimapScale;
+
+ inversePos = inversePos with { Y = -inversePos.Y };
+ inversePos = Matrix3.CreateTransform(Offset, Angle.Zero).Transform(inversePos);
+ return inversePos;
+ }
+
+ ///
+ /// Handles re-centering the control's offset.
+ ///
+ ///
+ public bool DrawRecenter()
+ {
+ // Map re-centering
+ if (Recentering)
+ {
+ var frameTime = Timing.FrameTime;
+ var diff = (TargetOffset - Offset) * (float) frameTime.TotalSeconds;
+
+ if (Offset.LengthSquared() < RecenterMinimum)
+ {
+ Offset = TargetOffset;
+ Recentering = false;
+ }
+ else
+ {
+ Offset += diff * 5f;
+ return false;
+ }
+ }
+
+ return Offset == TargetOffset;
+ }
+
+ protected void DrawBacking(DrawingHandleScreen handle)
+ {
+ var backing = BackingColor;
+ handle.DrawRect(new UIBox2(0f, Height, Width, 0f), backing);
+ }
+
+ protected void DrawNoSignal(DrawingHandleScreen handle)
+ {
+ var greyColor = Color.FromHex("#474F52");
+
+ // Draw funny lines
+ var lineCount = 4f;
+
+ for (var i = 0; i < lineCount; i++)
+ {
+ var angle = Angle.FromDegrees(45 + i * 360f / lineCount);
+ var distance = Width / 2f;
+ var start = MidPointVector + angle.RotateVec(new Vector2(0f, 2.5f * distance / 4f));
+ var end = MidPointVector + angle.RotateVec(new Vector2(0f, 4f * distance / 4f));
+ handle.DrawLine(start, end, greyColor);
+ }
+
+ var signalText = Loc.GetString("shuttle-console-no-signal");
+ var dimensions = handle.GetDimensions(_largerFont, signalText, 1f);
+ var position = MidPointVector - dimensions / 2f;
+ handle.DrawString(_largerFont, position, Loc.GetString("shuttle-console-no-signal"), greyColor);
+ }
+
+ protected override void Draw(DrawingHandleScreen handle)
+ {
+ base.Draw(handle);
+ if (!ActualRadarRange.Equals(WorldRange))
+ {
+ var diff = ActualRadarRange - WorldRange;
+ const float lerpRate = 10f;
+
+ WorldRange += (float) Math.Clamp(diff, -lerpRate * MathF.Abs(diff) * Timing.FrameTime.TotalSeconds, lerpRate * MathF.Abs(diff) * Timing.FrameTime.TotalSeconds);
+ WorldRangeChanged?.Invoke(WorldRange);
+ }
+ }
+}
diff --git a/Content.Server/Salvage/SalvageSystem.Runner.cs b/Content.Server/Salvage/SalvageSystem.Runner.cs
index 3b89135c58e..8a1498cbe96 100644
--- a/Content.Server/Salvage/SalvageSystem.Runner.cs
+++ b/Content.Server/Salvage/SalvageSystem.Runner.cs
@@ -10,6 +10,7 @@
using Content.Shared.Mobs.Components;
using Content.Shared.Mobs.Systems;
using Content.Shared.Salvage.Expeditions;
+using Content.Shared.Shuttles.Components;
using Robust.Shared.Map.Components;
using Robust.Shared.Player;
using Robust.Shared.Utility;
@@ -186,7 +187,7 @@ private void UpdateRunner()
if (shuttleXform.MapUid != uid || HasComp(shuttleUid))
continue;
- _shuttle.FTLTravel(shuttleUid, shuttle, member, ftlTime);
+ _shuttle.FTLToDock(shuttleUid, shuttle, member, ftlTime);
}
break;
diff --git a/Content.Server/Shuttles/Commands/DockCommand.cs b/Content.Server/Shuttles/Commands/DockCommand.cs
index 5f287e03970..62634af2bcd 100644
--- a/Content.Server/Shuttles/Commands/DockCommand.cs
+++ b/Content.Server/Shuttles/Commands/DockCommand.cs
@@ -47,7 +47,7 @@ public void Execute(IConsoleShell shell, string argStr, string[] args)
}
var dockSystem = _entManager.System();
- dockSystem.Dock(airlock1.Value, dock1, airlock2.Value, dock2);
+ dockSystem.Dock((airlock1.Value, dock1), (airlock2.Value, dock2));
if (dock1.DockedWith == airlock2)
{
diff --git a/Content.Server/Shuttles/Components/AutoDockComponent.cs b/Content.Server/Shuttles/Components/AutoDockComponent.cs
deleted file mode 100644
index fa4cd4dfaf3..00000000000
--- a/Content.Server/Shuttles/Components/AutoDockComponent.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-namespace Content.Server.Shuttles.Components;
-
-///
-/// Added to entities when they are actively trying to dock with something else.
-/// We track it because checking every dock constantly would be expensive.
-///
-[RegisterComponent]
-public sealed partial class AutoDockComponent : Component
-{
- ///
- /// Track who has requested autodocking so we can know when to be removed.
- ///
- public HashSet Requesters = new();
-}
diff --git a/Content.Server/Shuttles/Components/FTLBeaconComponent.cs b/Content.Server/Shuttles/Components/FTLBeaconComponent.cs
new file mode 100644
index 00000000000..06606336e33
--- /dev/null
+++ b/Content.Server/Shuttles/Components/FTLBeaconComponent.cs
@@ -0,0 +1,10 @@
+namespace Content.Server.Shuttles.Components;
+
+///
+/// Shows up on a shuttle's map as an FTL target.
+///
+[RegisterComponent]
+public sealed partial class FTLBeaconComponent : Component
+{
+
+}
diff --git a/Content.Server/Shuttles/Components/FTLComponent.cs b/Content.Server/Shuttles/Components/FTLComponent.cs
index e8bcbb459e1..077fe087489 100644
--- a/Content.Server/Shuttles/Components/FTLComponent.cs
+++ b/Content.Server/Shuttles/Components/FTLComponent.cs
@@ -2,6 +2,7 @@
using Content.Shared.Tag;
using Robust.Shared.Audio;
using Robust.Shared.Map;
+using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Shuttles.Components;
@@ -25,25 +26,19 @@ public sealed partial class FTLComponent : Component
public float Accumulator = 0f;
///
- /// Target Uid to dock with at the end of FTL.
+ /// Coordinates to arrive it: May be relative to another grid (for docking) or map coordinates.
///
- [ViewVariables(VVAccess.ReadWrite), DataField("targetUid")]
- public EntityUid? TargetUid;
-
- [ViewVariables(VVAccess.ReadWrite), DataField("targetCoordinates")]
+ [ViewVariables(VVAccess.ReadWrite), DataField]
public EntityCoordinates TargetCoordinates;
- ///
- /// Should we dock with the target when arriving or show up nearby.
- ///
- [ViewVariables(VVAccess.ReadWrite), DataField("dock")]
- public bool Dock;
+ [DataField]
+ public Angle TargetAngle;
///
/// If we're docking after FTL what is the prioritised dock tag (if applicable).
///
- [ViewVariables(VVAccess.ReadWrite), DataField("priorityTag", customTypeSerializer:typeof(PrototypeIdSerializer))]
- public string? PriorityTag;
+ [ViewVariables(VVAccess.ReadWrite), DataField]
+ public ProtoId? PriorityTag;
[ViewVariables(VVAccess.ReadWrite), DataField("soundTravel")]
public SoundSpecifier? TravelSound = new SoundPathSpecifier("/Audio/DeltaV/Effects/Shuttle/hyperspace_progress.ogg") // DeltaV - Replace FTL sound
@@ -51,5 +46,6 @@ public sealed partial class FTLComponent : Component
Params = AudioParams.Default.WithVolume(-3f).WithLoop(true)
};
+ [DataField]
public EntityUid? TravelStream;
}
diff --git a/Content.Server/Shuttles/Components/FTLDestinationComponent.cs b/Content.Server/Shuttles/Components/FTLDestinationComponent.cs
deleted file mode 100644
index 6eedcbd8ce0..00000000000
--- a/Content.Server/Shuttles/Components/FTLDestinationComponent.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using Content.Shared.Whitelist;
-
-namespace Content.Server.Shuttles.Components;
-
-[RegisterComponent]
-public sealed partial class FTLDestinationComponent : Component
-{
- ///
- /// Should this destination be restricted in some form from console visibility.
- ///
- [ViewVariables(VVAccess.ReadWrite), DataField("whitelist")]
- public EntityWhitelist? Whitelist;
-
- ///
- /// Is this destination visible but available to be warped to?
- ///
- [ViewVariables(VVAccess.ReadWrite), DataField("enabled")]
- public bool Enabled = true;
-}
diff --git a/Content.Server/Shuttles/Components/FTLExclusionComponent.cs b/Content.Server/Shuttles/Components/FTLExclusionComponent.cs
new file mode 100644
index 00000000000..db6538462d5
--- /dev/null
+++ b/Content.Server/Shuttles/Components/FTLExclusionComponent.cs
@@ -0,0 +1,16 @@
+using Content.Shared.Shuttles.Systems;
+
+namespace Content.Server.Shuttles.Components;
+
+///
+/// Prevents FTL from occuring around this entity.
+///
+[RegisterComponent, Access(typeof(SharedShuttleSystem))]
+public sealed partial class FTLExclusionComponent : Component
+{
+ [DataField]
+ public bool Enabled = true;
+
+ [DataField(required: true)]
+ public float Range = 32f;
+}
diff --git a/Content.Server/Shuttles/Components/RecentlyDockedComponent.cs b/Content.Server/Shuttles/Components/RecentlyDockedComponent.cs
deleted file mode 100644
index 6b0667d1e6c..00000000000
--- a/Content.Server/Shuttles/Components/RecentlyDockedComponent.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-namespace Content.Server.Shuttles.Components;
-
-///
-/// Added to that have recently undocked.
-/// This checks for whether they've left the specified radius before allowing them to automatically dock again.
-///
-[RegisterComponent]
-public sealed partial class RecentlyDockedComponent : Component
-{
- [DataField("lastDocked")]
- public EntityUid LastDocked;
-
- [ViewVariables(VVAccess.ReadWrite), DataField("radius")]
- public float Radius = 1.5f;
-}
diff --git a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs
index 037fcc75665..9a615a23d81 100644
--- a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs
+++ b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs
@@ -437,7 +437,7 @@ public override void Update(float frameTime)
if (xform.MapUid != arrivalsXform.MapUid)
{
if (arrivals.IsValid())
- _shuttles.FTLTravel(uid, shuttle, arrivals, dock: true);
+ _shuttles.FTLToDock(uid, shuttle, arrivals);
comp.NextArrivalsTime = _timing.CurTime + TimeSpan.FromSeconds(tripTime);
}
@@ -447,7 +447,7 @@ public override void Update(float frameTime)
var targetGrid = _station.GetLargestGrid(data);
if (targetGrid != null)
- _shuttles.FTLTravel(uid, shuttle, targetGrid.Value, dock: true);
+ _shuttles.FTLToDock(uid, shuttle, targetGrid.Value);
// The ArrivalsCooldown includes the trip there, so we only need to add the time taken for
// the trip back.
@@ -567,7 +567,7 @@ private void SetupShuttle(EntityUid uid, StationArrivalsComponent component)
var arrivalsComp = EnsureComp(component.Shuttle);
arrivalsComp.Station = uid;
EnsureComp(uid);
- _shuttles.FTLTravel(component.Shuttle, shuttleComp, arrivals, hyperspaceTime: RoundStartFTLDuration, dock: true);
+ _shuttles.FTLToDock(component.Shuttle, shuttleComp, arrivals, hyperspaceTime: RoundStartFTLDuration);
arrivalsComp.NextTransfer = _timing.CurTime + TimeSpan.FromSeconds(_cfgManager.GetCVar(CCVars.ArrivalsCooldown));
}
diff --git a/Content.Server/Shuttles/Systems/DockingSystem.AutoDock.cs b/Content.Server/Shuttles/Systems/DockingSystem.AutoDock.cs
deleted file mode 100644
index a09fff5189c..00000000000
--- a/Content.Server/Shuttles/Systems/DockingSystem.AutoDock.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-using Content.Server.Shuttles.Components;
-using Content.Shared.Shuttles.Components;
-using Content.Shared.Shuttles.Events;
-
-namespace Content.Server.Shuttles.Systems;
-
-public sealed partial class DockingSystem
-{
- private void UpdateAutodock()
- {
- // Work out what we can autodock with, what we shouldn't, and when we should stop tracking.
- // Autodocking only stops when the client closes that dock viewport OR they lose pilotcomponent.
- var dockingQuery = GetEntityQuery();
- var xformQuery = GetEntityQuery();
- var recentQuery = GetEntityQuery();
- var query = EntityQueryEnumerator();
-
- while (query.MoveNext(out var dockUid, out var comp))
- {
- if (comp.Requesters.Count == 0 || !dockingQuery.TryGetComponent(dockUid, out var dock))
- {
- RemComp(dockUid);
- continue;
- }
-
- // Don't re-dock if we're already docked or recently were.
- if (dock.Docked || recentQuery.HasComponent(dockUid))
- continue;
-
- var dockable = GetDockable(dockUid, xformQuery.GetComponent(dockUid));
-
- if (dockable == null)
- continue;
-
- TryDock(dockUid, dock, dockable.Value);
- }
-
- // Work out recent docks that have gone past their designated threshold.
- var checkedRecent = new HashSet();
- var recentQueryEnumerator = EntityQueryEnumerator();
-
- while (recentQueryEnumerator.MoveNext(out var uid, out var comp, out var xform))
- {
- if (!checkedRecent.Add(uid))
- continue;
-
- if (!dockingQuery.HasComponent(uid))
- {
- RemCompDeferred(uid);
- continue;
- }
-
- if (!xformQuery.TryGetComponent(comp.LastDocked, out var otherXform))
- {
- RemCompDeferred(uid);
- continue;
- }
-
- var worldPos = _transform.GetWorldPosition(xform, xformQuery);
- var otherWorldPos = _transform.GetWorldPosition(otherXform, xformQuery);
-
- if ((worldPos - otherWorldPos).Length() < comp.Radius)
- continue;
-
- Log.Debug($"Removed RecentlyDocked from {ToPrettyString(uid)} and {ToPrettyString(comp.LastDocked)}");
- RemComp(uid);
- RemComp(comp.LastDocked);
- }
- }
-
- private void OnRequestUndock(EntityUid uid, ShuttleConsoleComponent component, UndockRequestMessage args)
- {
- var dork = GetEntity(args.DockEntity);
-
- Log.Debug($"Received undock request for {ToPrettyString(dork)}");
-
- // TODO: Validation
- if (!TryComp(dork, out var dock) ||
- !dock.Docked ||
- HasComp(Transform(uid).GridUid))
- {
- return;
- }
-
- Undock(dork, dock);
- }
-
- private void OnRequestAutodock(EntityUid uid, ShuttleConsoleComponent component, AutodockRequestMessage args)
- {
- var dork = GetEntity(args.DockEntity);
- Log.Debug($"Received autodock request for {ToPrettyString(dork)}");
- var player = args.Session.AttachedEntity;
-
- if (player == null ||
- !HasComp(dork) ||
- HasComp(Transform(uid).GridUid))
- {
- return;
- }
-
- // TODO: Validation
- var comp = EnsureComp(dork);
- comp.Requesters.Add(player.Value);
- }
-
- private void OnRequestStopAutodock(EntityUid uid, ShuttleConsoleComponent component, StopAutodockRequestMessage args)
- {
- var dork = GetEntity(args.DockEntity);
- Log.Debug($"Received stop autodock request for {ToPrettyString(dork)}");
-
- var player = args.Session.AttachedEntity;
-
- // TODO: Validation
- if (player == null || !TryComp(dork, out var comp))
- return;
-
- comp.Requesters.Remove(player.Value);
-
- if (comp.Requesters.Count == 0)
- RemComp(dork);
- }
-}
diff --git a/Content.Server/Shuttles/Systems/DockingSystem.Shuttle.cs b/Content.Server/Shuttles/Systems/DockingSystem.Shuttle.cs
index 0fa82c303f6..4ce52947366 100644
--- a/Content.Server/Shuttles/Systems/DockingSystem.Shuttle.cs
+++ b/Content.Server/Shuttles/Systems/DockingSystem.Shuttle.cs
@@ -19,13 +19,13 @@ public sealed partial class DockingSystem
public Angle GetAngle(EntityUid uid, TransformComponent xform, EntityUid targetUid, TransformComponent targetXform, EntityQuery xformQuery)
{
- var (shuttlePos, shuttleRot) = _transform.GetWorldPositionRotation(xform, xformQuery);
- var (targetPos, targetRot) = _transform.GetWorldPositionRotation(targetXform, xformQuery);
+ var (shuttlePos, shuttleRot) = _transform.GetWorldPositionRotation(xform);
+ var (targetPos, targetRot) = _transform.GetWorldPositionRotation(targetXform);
var shuttleCOM = Robust.Shared.Physics.Transform.Mul(new Transform(shuttlePos, shuttleRot),
- Comp(uid).LocalCenter);
+ _physicsQuery.GetComponent(uid).LocalCenter);
var targetCOM = Robust.Shared.Physics.Transform.Mul(new Transform(targetPos, targetRot),
- Comp(targetUid).LocalCenter);
+ _physicsQuery.GetComponent(targetUid).LocalCenter);
var mapDiff = shuttleCOM - targetCOM;
var angle = mapDiff.ToWorldAngle();
@@ -36,7 +36,7 @@ public Angle GetAngle(EntityUid uid, TransformComponent xform, EntityUid targetU
///
/// Checks if 2 docks can be connected by moving the shuttle directly onto docks.
///
- public bool CanDock(
+ private bool CanDock(
DockingComponent shuttleDock,
TransformComponent shuttleDockXform,
DockingComponent gridDock,
@@ -119,37 +119,63 @@ public bool CanDock(
return GetDockingConfigPrivate(shuttleUid, targetGrid, shuttleDocks, gridDocks, priorityTag);
}
- private DockingConfig? GetDockingConfigPrivate(
+ ///
+ /// Tries to get a docking config at the specified coordinates and angle.
+ ///
+ public DockingConfig? GetDockingConfigAt(EntityUid shuttleUid,
+ EntityUid targetGrid,
+ EntityCoordinates coordinates,
+ Angle angle)
+ {
+ var gridDocks = GetDocks(targetGrid);
+ var shuttleDocks = GetDocks(shuttleUid);
+
+ var configs = GetDockingConfigs(shuttleUid, targetGrid, shuttleDocks, gridDocks);
+
+ foreach (var config in configs)
+ {
+ if (config.Coordinates.Equals(coordinates) && config.Angle.EqualsApprox(angle, 0.01))
+ {
+ return config;
+ }
+ }
+
+ return null;
+ }
+
+ ///
+ /// Gets all docking configs between the 2 grids.
+ ///
+ private List GetDockingConfigs(
EntityUid shuttleUid,
EntityUid targetGrid,
List<(EntityUid, DockingComponent)> shuttleDocks,
- List<(EntityUid, DockingComponent)> gridDocks,
- string? priorityTag = null)
- {
- if (gridDocks.Count <= 0)
- return null;
+ List<(EntityUid, DockingComponent)> gridDocks)
+ {
+ var validDockConfigs = new List();
- var xformQuery = GetEntityQuery();
- var targetGridGrid = Comp(targetGrid);
- var targetGridXform = xformQuery.GetComponent(targetGrid);
+ if (gridDocks.Count <= 0)
+ return validDockConfigs;
+
+ var targetGridGrid = _gridQuery.GetComponent(targetGrid);
+ var targetGridXform = _xformQuery.GetComponent(targetGrid);
var targetGridAngle = _transform.GetWorldRotation(targetGridXform).Reduced();
var shuttleFixturesComp = Comp(shuttleUid);
- var shuttleAABB = Comp(shuttleUid).LocalAABB;
+ var shuttleAABB = _gridQuery.GetComponent(shuttleUid).LocalAABB;
var isMap = HasComp(targetGrid);
- var validDockConfigs = new List();
var grids = new List>();
if (shuttleDocks.Count > 0)
{
// We'll try all combinations of shuttle docks and see which one is most suitable
foreach (var (dockUid, shuttleDock) in shuttleDocks)
{
- var shuttleDockXform = xformQuery.GetComponent(dockUid);
+ var shuttleDockXform = _xformQuery.GetComponent(dockUid);
foreach (var (gridDockUid, gridDock) in gridDocks)
{
- var gridXform = xformQuery.GetComponent(gridDockUid);
+ var gridXform = _xformQuery.GetComponent(gridDockUid);
if (!CanDock(
shuttleDock, shuttleDockXform,
@@ -167,15 +193,15 @@ public bool CanDock(
}
// Can't just use the AABB as we want to get bounds as tight as possible.
- var spawnPosition = new EntityCoordinates(targetGrid, matty.Transform(Vector2.Zero));
- spawnPosition = new EntityCoordinates(targetGridXform.MapUid!.Value, spawnPosition.ToMapPos(EntityManager, _transform));
+ var gridPosition = new EntityCoordinates(targetGrid, matty.Transform(Vector2.Zero));
+ var spawnPosition = new EntityCoordinates(targetGridXform.MapUid!.Value, gridPosition.ToMapPos(EntityManager, _transform));
// TODO: use tight bounds
var dockedBounds = new Box2Rotated(shuttleAABB.Translated(spawnPosition.Position), targetAngle, spawnPosition.Position);
// Check if there's no intersecting grids (AKA oh god it's docking at cargo).
grids.Clear();
- _mapManager.FindGridsIntersecting(targetGridXform.MapID, dockedBounds, ref grids);
+ _mapManager.FindGridsIntersecting(targetGridXform.MapID, dockedBounds, ref grids, includeMap: false);
if (grids.Any(o => o.Owner != targetGrid && o.Owner != targetGridXform.MapUid))
{
continue;
@@ -204,9 +230,9 @@ public bool CanDock(
if (!CanDock(
other,
- xformQuery.GetComponent(otherUid),
+ _xformQuery.GetComponent(otherUid),
otherGrid,
- xformQuery.GetComponent(otherGridUid),
+ _xformQuery.GetComponent(otherGridUid),
shuttleAABB,
targetGridAngle,
shuttleFixturesComp, targetGridGrid,
@@ -234,7 +260,7 @@ public bool CanDock(
validDockConfigs.Add(new DockingConfig()
{
Docks = dockedPorts,
- Coordinates = spawnPosition,
+ Coordinates = gridPosition,
Area = dockedAABB,
Angle = targetAngle,
});
@@ -242,9 +268,23 @@ public bool CanDock(
}
}
+ return validDockConfigs;
+ }
+
+ private DockingConfig? GetDockingConfigPrivate(
+ EntityUid shuttleUid,
+ EntityUid targetGrid,
+ List<(EntityUid, DockingComponent)> shuttleDocks,
+ List<(EntityUid, DockingComponent)> gridDocks,
+ string? priorityTag = null)
+ {
+ var validDockConfigs = GetDockingConfigs(shuttleUid, targetGrid, shuttleDocks, gridDocks);
+
if (validDockConfigs.Count <= 0)
return null;
+ var targetGridAngle = _transform.GetWorldRotation(targetGrid).Reduced();
+
// Prioritise by priority docks, then by maximum connected ports, then by most similar angle.
validDockConfigs = validDockConfigs
.OrderByDescending(x => x.Docks.Any(docks =>
diff --git a/Content.Server/Shuttles/Systems/DockingSystem.cs b/Content.Server/Shuttles/Systems/DockingSystem.cs
index 7f698850450..afe03af1bb8 100644
--- a/Content.Server/Shuttles/Systems/DockingSystem.cs
+++ b/Content.Server/Shuttles/Systems/DockingSystem.cs
@@ -5,7 +5,10 @@
using Content.Server.Shuttles.Events;
using Content.Shared.Doors;
using Content.Shared.Doors.Components;
+using Content.Shared.Popups;
+using Content.Shared.Shuttles.Components;
using Content.Shared.Shuttles.Events;
+using Content.Shared.Shuttles.Systems;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Physics;
@@ -17,27 +20,32 @@
namespace Content.Server.Shuttles.Systems
{
- public sealed partial class DockingSystem : EntitySystem
+ public sealed partial class DockingSystem : SharedDockingSystem
{
[Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly DoorSystem _doorSystem = default!;
- [Dependency] private readonly FixtureSystem _fixtureSystem = default!;
+ [Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly PathfindingSystem _pathfinding = default!;
[Dependency] private readonly ShuttleConsoleSystem _console = default!;
[Dependency] private readonly SharedJointSystem _jointSystem = default!;
- [Dependency] private readonly SharedPhysicsSystem _physics = default!;
+ [Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
- private const string DockingFixture = "docking";
private const string DockingJoint = "docking";
- private const float DockingRadius = 0.20f;
+ private EntityQuery _gridQuery;
private EntityQuery _physicsQuery;
+ private EntityQuery _xformQuery;
+
+ private readonly HashSet> _dockingSet = new();
+ private readonly HashSet> _dockingBoltSet = new();
public override void Initialize()
{
base.Initialize();
+ _gridQuery = GetEntityQuery();
_physicsQuery = GetEntityQuery();
+ _xformQuery = GetEntityQuery();
SubscribeLocalEvent(OnStartup);
SubscribeLocalEvent(OnShutdown);
@@ -48,95 +56,42 @@ public override void Initialize()
// Yes this isn't in shuttle console; it may be used by other systems technically.
// in which case I would also add their subs here.
- SubscribeLocalEvent(OnRequestAutodock);
- SubscribeLocalEvent(OnRequestStopAutodock);
+ SubscribeLocalEvent(OnRequestDock);
SubscribeLocalEvent(OnRequestUndock);
}
- public override void Update(float frameTime)
- {
- base.Update(frameTime);
- UpdateAutodock();
- }
-
- private void OnAutoClose(EntityUid uid, DockingComponent component, BeforeDoorAutoCloseEvent args)
- {
- // We'll just pin the door open when docked.
- if (component.Docked)
- args.Cancel();
- }
-
- private Entity? GetDockable(EntityUid uid, TransformComponent dockingXform)
+ ///
+ /// Sets the docks for the provided entity as enabled or disabled.
+ ///
+ public void SetDocks(EntityUid gridUid, bool enabled)
{
- // Did you know Saltern is the most dockable station?
+ _dockingSet.Clear();
+ _lookup.GetChildEntities(gridUid, _dockingSet);
- // Assume the docking port itself (and its body) is valid
-
- if (!HasComp(dockingXform.GridUid))
+ foreach (var dock in _dockingSet)
{
- return null;
+ Undock(dock);
+ dock.Comp.Enabled = enabled;
}
+ }
- var transform = _physics.GetPhysicsTransform(uid, dockingXform);
- var dockingFixture = _fixtureSystem.GetFixtureOrNull(uid, DockingFixture);
-
- if (dockingFixture == null)
- return null;
-
- Box2? aabb = null;
-
- for (var i = 0; i < dockingFixture.Shape.ChildCount; i++)
- {
- aabb = aabb?.Union(dockingFixture.Shape.ComputeAABB(transform, i)) ?? dockingFixture.Shape.ComputeAABB(transform, i);
- }
-
- if (aabb == null)
- return null;
-
- var enlargedAABB = aabb.Value.Enlarged(DockingRadius * 1.5f);
+ public void SetDockBolts(EntityUid gridUid, bool enabled)
+ {
+ _dockingBoltSet.Clear();
+ _lookup.GetChildEntities(gridUid, _dockingBoltSet);
- // Get any docking ports in range on other grids.
- var grids = new List>();
- _mapManager.FindGridsIntersecting(dockingXform.MapID, enlargedAABB, ref grids);
- foreach (var otherGrid in grids)
+ foreach (var entity in _dockingBoltSet)
{
- if (otherGrid.Owner == dockingXform.GridUid)
- continue;
-
- foreach (var ent in otherGrid.Comp.GetAnchoredEntities(enlargedAABB))
- {
- if (!TryComp(ent, out DockingComponent? otherDocking) ||
- !otherDocking.Enabled ||
- !TryComp(ent, out FixturesComponent? otherBody))
- {
- continue;
- }
-
- var otherTransform = _physics.GetPhysicsTransform(ent);
- var otherDockingFixture = _fixtureSystem.GetFixtureOrNull(ent, DockingFixture, manager: otherBody);
-
- if (otherDockingFixture == null)
- {
- DebugTools.Assert(false);
- Log.Error($"Found null docking fixture on {ent}");
- continue;
- }
-
- for (var i = 0; i < otherDockingFixture.Shape.ChildCount; i++)
- {
- var otherAABB = otherDockingFixture.Shape.ComputeAABB(otherTransform, i);
-
- if (!aabb.Value.Intersects(otherAABB))
- continue;
-
- // TODO: Need CollisionManager's GJK for accurate bounds
- // Realistically I want 2 fixtures anyway but I'll deal with that later.
- return (ent, otherDocking);
- }
- }
+ _doorSystem.TryClose(entity);
+ _doorSystem.SetBoltsDown((entity.Owner, entity.Comp2), enabled);
}
+ }
- return null;
+ private void OnAutoClose(EntityUid uid, DockingComponent component, BeforeDoorAutoCloseEvent args)
+ {
+ // We'll just pin the door open when docked.
+ if (component.Docked)
+ args.Cancel();
}
private void OnShutdown(EntityUid uid, DockingComponent component, ComponentShutdown args)
@@ -147,6 +102,13 @@ private void OnShutdown(EntityUid uid, DockingComponent component, ComponentShut
return;
}
+ var gridUid = Transform(uid).GridUid;
+
+ if (gridUid != null && !Terminating(gridUid.Value))
+ {
+ _console.RefreshShuttleConsoles();
+ }
+
Cleanup(uid, component);
}
@@ -166,12 +128,6 @@ private void Cleanup(EntityUid dockAUid, DockingComponent dockA)
Log.Error($"Tried to cleanup {dockAUid} but not docked?");
dockA.DockedWith = null;
- if (dockA.DockJoint != null)
- {
- // We'll still cleanup the dock joint on release at least
- _jointSystem.RemoveJoint(dockA.DockJoint);
- }
-
return;
}
@@ -200,12 +156,16 @@ private void Cleanup(EntityUid dockAUid, DockingComponent dockA)
RaiseLocalEvent(msg);
}
- private void OnStartup(EntityUid uid, DockingComponent component, ComponentStartup args)
+ private void OnStartup(Entity entity, ref ComponentStartup args)
{
+ var uid = entity.Owner;
+ var component = entity.Comp;
+
// Use startup so transform already initialized
- if (!EntityManager.GetComponent(uid).Anchored) return;
+ if (!EntityManager.GetComponent(uid).Anchored)
+ return;
- EnableDocking(uid, component);
+ SetDockingEnabled((uid, component), true);
// This little gem is for docking deserialization
if (component.DockedWith != null)
@@ -217,75 +177,62 @@ private void OnStartup(EntityUid uid, DockingComponent component, ComponentStart
var otherDock = EntityManager.GetComponent(component.DockedWith.Value);
DebugTools.Assert(otherDock.DockedWith != null);
- Dock(uid, component, component.DockedWith.Value, otherDock);
+ Dock((uid, component), (component.DockedWith.Value, otherDock));
DebugTools.Assert(component.Docked && otherDock.Docked);
}
}
- private void OnAnchorChange(EntityUid uid, DockingComponent component, ref AnchorStateChangedEvent args)
+ private void OnAnchorChange(Entity entity, ref AnchorStateChangedEvent args)
{
if (args.Anchored)
{
- EnableDocking(uid, component);
+ SetDockingEnabled(entity, true);
}
else
{
- DisableDocking(uid, component);
+ SetDockingEnabled(entity, false);
}
_console.RefreshShuttleConsoles();
}
- private void OnDockingReAnchor(EntityUid uid, DockingComponent component, ref ReAnchorEvent args)
+ private void OnDockingReAnchor(Entity entity, ref ReAnchorEvent args)
{
+ var uid = entity.Owner;
+ var component = entity.Comp;
+
if (!component.Docked)
return;
var otherDock = component.DockedWith;
var other = Comp(otherDock!.Value);
- Undock(uid, component);
- Dock(uid, component, otherDock.Value, other);
+ Undock(entity);
+ Dock((uid, component), (otherDock.Value, other));
_console.RefreshShuttleConsoles();
}
- private void DisableDocking(EntityUid uid, DockingComponent component)
+ public void SetDockingEnabled(Entity entity, bool value)
{
- if (!component.Enabled)
+ if (entity.Comp.Enabled == value)
return;
- component.Enabled = false;
+ entity.Comp.Enabled = value;
- if (component.DockedWith != null)
+ if (!entity.Comp.Enabled && entity.Comp.DockedWith != null)
{
- Undock(uid, component);
+ Undock(entity);
}
}
- private void EnableDocking(EntityUid uid, DockingComponent component)
- {
- if (component.Enabled)
- return;
-
- if (!TryComp(uid, out PhysicsComponent? physicsComponent))
- return;
-
- component.Enabled = true;
-
- var shape = new PhysShapeCircle(DockingRadius, new Vector2(0f, -0.5f));
-
- // Listen it makes intersection tests easier; you can probably dump this but it requires a bunch more boilerplate
- // TODO: I want this to ideally be 2 fixtures to force them to have some level of alignment buuuttt
- // I also need collisionmanager for that yet again so they get dis.
- // TODO: CollisionManager is fine so get to work sloth chop chop.
- _fixtureSystem.TryCreateFixture(uid, shape, DockingFixture, hard: false, body: physicsComponent);
- }
-
///
/// Docks 2 ports together and assumes it is valid.
///
- public void Dock(EntityUid dockAUid, DockingComponent dockA, EntityUid dockBUid, DockingComponent dockB)
+ public void Dock(Entity dockA, Entity dockB)
{
+ var dockAUid = dockA.Owner;
+ var dockBUid = dockB.Owner;
+
if (dockBUid.GetHashCode() < dockAUid.GetHashCode())
{
(dockA, dockB) = (dockB, dockA);
@@ -322,10 +269,10 @@ public void Dock(EntityUid dockAUid, DockingComponent dockA, EntityUid dockBUid,
WeldJoint joint;
// Pre-existing joint so use that.
- if (dockA.DockJointId != null)
+ if (dockA.Comp.DockJointId != null)
{
- DebugTools.Assert(dockB.DockJointId == dockA.DockJointId);
- joint = _jointSystem.GetOrCreateWeldJoint(gridA, gridB, dockA.DockJointId);
+ DebugTools.Assert(dockB.Comp.DockJointId == dockA.Comp.DockJointId);
+ joint = _jointSystem.GetOrCreateWeldJoint(gridA, gridB, dockA.Comp.DockJointId);
}
else
{
@@ -345,15 +292,15 @@ public void Dock(EntityUid dockAUid, DockingComponent dockA, EntityUid dockBUid,
joint.Stiffness = stiffness;
joint.Damping = damping;
- dockA.DockJoint = joint;
- dockA.DockJointId = joint.ID;
+ dockA.Comp.DockJoint = joint;
+ dockA.Comp.DockJointId = joint.ID;
- dockB.DockJoint = joint;
- dockB.DockJointId = joint.ID;
+ dockB.Comp.DockJoint = joint;
+ dockB.Comp.DockJointId = joint.ID;
}
- dockA.DockedWith = dockBUid;
- dockB.DockedWith = dockAUid;
+ dockA.Comp.DockedWith = dockBUid;
+ dockB.Comp.DockedWith = dockAUid;
if (TryComp(dockAUid, out DoorComponent? doorA))
{
@@ -381,8 +328,8 @@ public void Dock(EntityUid dockAUid, DockingComponent dockA, EntityUid dockBUid,
if (_pathfinding.TryCreatePortal(dockAXform.Coordinates, dockBXform.Coordinates, out var handle))
{
- dockA.PathfindHandle = handle;
- dockB.PathfindHandle = handle;
+ dockA.Comp.PathfindHandle = handle;
+ dockB.Comp.PathfindHandle = handle;
}
var msg = new DockEvent
@@ -393,89 +340,135 @@ public void Dock(EntityUid dockAUid, DockingComponent dockA, EntityUid dockBUid,
GridBUid = gridB,
};
+ _console.RefreshShuttleConsoles();
RaiseLocalEvent(dockAUid, msg);
RaiseLocalEvent(dockBUid, msg);
RaiseLocalEvent(msg);
}
- private bool CanDock(EntityUid dockAUid, EntityUid dockBUid, DockingComponent dockA, DockingComponent dockB)
+ ///
+ /// Attempts to dock 2 ports together and will return early if it's not possible.
+ ///
+ private void TryDock(Entity dockA, Entity dockB)
{
- if (!dockA.Enabled ||
- !dockB.Enabled ||
- dockA.DockedWith != null ||
- dockB.DockedWith != null)
- {
- return false;
- }
+ if (!CanDock(dockA, dockB))
+ return;
+
+ Dock(dockA, dockB);
+ }
- var fixtureA = _fixtureSystem.GetFixtureOrNull(dockAUid, DockingFixture);
- var fixtureB = _fixtureSystem.GetFixtureOrNull(dockBUid, DockingFixture);
+ public void Undock(Entity dock)
+ {
+ if (dock.Comp.DockedWith == null)
+ return;
+
+ OnUndock(dock.Owner);
+ OnUndock(dock.Comp.DockedWith.Value);
+ Cleanup(dock.Owner, dock);
+ _console.RefreshShuttleConsoles();
+ }
+
+ private void OnUndock(EntityUid dockUid)
+ {
+ if (TerminatingOrDeleted(dockUid))
+ return;
- if (fixtureA == null || fixtureB == null)
+ if (TryComp(dockUid, out var airlock))
+ _doorSystem.SetBoltsDown((dockUid, airlock), false);
+
+ if (TryComp(dockUid, out DoorComponent? door) && _doorSystem.TryClose(dockUid, door))
+ door.ChangeAirtight = true;
+ }
+
+ private void OnRequestUndock(EntityUid uid, ShuttleConsoleComponent component, UndockRequestMessage args)
+ {
+ if (!TryGetEntity(args.DockEntity, out var dockEnt) ||
+ !TryComp(dockEnt, out DockingComponent? dockComp))
{
- return false;
+ _popup.PopupCursor(Loc.GetString("shuttle-console-undock-fail"));
+ return;
}
- var transformA = _physics.GetPhysicsTransform(dockAUid);
- var transformB = _physics.GetPhysicsTransform(dockBUid);
- var intersect = false;
+ var dock = (dockEnt.Value, dockComp);
- for (var i = 0; i < fixtureA.Shape.ChildCount; i++)
+ if (!CanUndock(dock))
{
- var aabb = fixtureA.Shape.ComputeAABB(transformA, i);
+ _popup.PopupCursor(Loc.GetString("shuttle-console-undock-fail"));
+ return;
+ }
- for (var j = 0; j < fixtureB.Shape.ChildCount; j++)
- {
- var otherAABB = fixtureB.Shape.ComputeAABB(transformB, j);
- if (!aabb.Intersects(otherAABB))
- continue;
+ Undock(dock);
+ }
- // TODO: Need collisionmanager's GJK for accurate checks don't @ me son
- intersect = true;
- break;
- }
+ private void OnRequestDock(EntityUid uid, ShuttleConsoleComponent component, DockRequestMessage args)
+ {
+ var shuttleUid = Transform(uid).GridUid;
- if (intersect)
- break;
+ if (!CanShuttleDock(shuttleUid))
+ {
+ _popup.PopupCursor(Loc.GetString("shuttle-console-dock-fail"));
+ return;
}
- return intersect;
- }
+ if (!TryGetEntity(args.DockEntity, out var ourDock) ||
+ !TryGetEntity(args.TargetDockEntity, out var targetDock) ||
+ !TryComp(ourDock, out DockingComponent? ourDockComp) ||
+ !TryComp(targetDock, out DockingComponent? targetDockComp))
+ {
+ _popup.PopupCursor(Loc.GetString("shuttle-console-dock-fail"));
+ return;
+ }
- ///
- /// Attempts to dock 2 ports together and will return early if it's not possible.
- ///
- private void TryDock(EntityUid dockAUid, DockingComponent dockA, Entity dockB)
- {
- if (!CanDock(dockAUid, dockB, dockA, dockB))
+ // Cheating?
+ if (!TryComp(ourDock, out TransformComponent? xformA) ||
+ xformA.GridUid != shuttleUid)
+ {
+ _popup.PopupCursor(Loc.GetString("shuttle-console-dock-fail"));
+ return;
+ }
+
+ // TODO: Move the CanDock stuff to the port state and also validate that stuff
+ // Also need to check preventpilot + enabled / dockedwith
+ if (!CanDock((ourDock.Value, ourDockComp), (targetDock.Value, targetDockComp)))
+ {
+ _popup.PopupCursor(Loc.GetString("shuttle-console-dock-fail"));
return;
+ }
- Dock(dockAUid, dockA, dockB, dockB);
+ Dock((ourDock.Value, ourDockComp), (targetDock.Value, targetDockComp));
}
- public void Undock(EntityUid dockUid, DockingComponent dock)
+ public bool CanUndock(Entity dock)
{
- if (dock.DockedWith == null)
- return;
+ if (!Resolve(dock, ref dock.Comp) ||
+ !dock.Comp.Docked)
+ {
+ return false;
+ }
- OnUndock(dockUid, dock.DockedWith.Value);
- OnUndock(dock.DockedWith.Value, dockUid);
- Cleanup(dockUid, dock);
+ return true;
}
- private void OnUndock(EntityUid dockUid, EntityUid other)
+ ///
+ /// Returns true if both docks can connect. Does not consider whether the shuttle allows it.
+ ///
+ public bool CanDock(Entity dockA, Entity dockB)
{
- if (TerminatingOrDeleted(dockUid))
- return;
-
- if (TryComp(dockUid, out var airlock))
- _doorSystem.SetBoltsDown((dockUid, airlock), false);
+ if (!dockA.Comp.Enabled ||
+ !dockB.Comp.Enabled ||
+ dockA.Comp.DockedWith != null ||
+ dockB.Comp.DockedWith != null)
+ {
+ return false;
+ }
- if (TryComp(dockUid, out DoorComponent? door) && _doorSystem.TryClose(dockUid, door))
- door.ChangeAirtight = true;
+ var xformA = Transform(dockA);
+ var xformB = Transform(dockB);
+ var (worldPosA, worldRotA) = XformSystem.GetWorldPositionRotation(xformA);
+ var (worldPosB, worldRotB) = XformSystem.GetWorldPositionRotation(xformB);
- var recentlyDocked = EnsureComp(dockUid);
- recentlyDocked.LastDocked = other;
+ return CanDock(new MapCoordinates(worldPosA, xformA.MapID), worldRotA,
+ new MapCoordinates(worldPosB, xformB.MapID), worldRotB);
}
}
}
diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs
index 15907221b35..6d2c28edcfc 100644
--- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs
+++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs
@@ -163,15 +163,15 @@ private void UpdateEmergencyConsole(float frameTime)
if (!Deleted(centcomm.Entity))
{
- _shuttle.FTLTravel(comp.EmergencyShuttle.Value, shuttle,
- centcomm.Entity.Value, _consoleAccumulator, TransitTime, true);
+ _shuttle.FTLToDock(comp.EmergencyShuttle.Value, shuttle,
+ centcomm.Entity.Value, _consoleAccumulator, TransitTime);
continue;
}
if (!Deleted(centcomm.MapEntity))
{
// TODO: Need to get non-overlapping positions.
- _shuttle.FTLTravel(comp.EmergencyShuttle.Value, shuttle,
+ _shuttle.FTLToCoordinates(comp.EmergencyShuttle.Value, shuttle,
new EntityCoordinates(centcomm.MapEntity.Value,
_random.NextVector2(1000f)), _consoleAccumulator, TransitTime);
}
@@ -201,7 +201,7 @@ private void UpdateEmergencyConsole(float frameTime)
}
// Don't dock them. If you do end up doing this then stagger launch.
- _shuttle.FTLTravel(uid, shuttle, centcomm.Entity.Value, hyperspaceTime: TransitTime);
+ _shuttle.FTLToDock(uid, shuttle, centcomm.Entity.Value, hyperspaceTime: TransitTime);
RemCompDeferred(uid);
}
@@ -217,15 +217,18 @@ private void UpdateEmergencyConsole(float frameTime)
// All the others.
if (_consoleAccumulator < minTime)
{
- var query = AllEntityQuery();
+ var query = AllEntityQuery();
// Guarantees that emergency shuttle arrives first before anyone else can FTL.
- while (query.MoveNext(out var comp))
+ while (query.MoveNext(out var comp, out var centcommXform))
{
if (Deleted(comp.Entity))
continue;
- _shuttle.AddFTLDestination(comp.Entity.Value, true);
+ if (_shuttle.TryAddFTLDestination(centcommXform.MapID, true, out var ftlComp))
+ {
+ _shuttle.SetFTLWhitelist((centcommXform.MapUid!.Value, ftlComp), null);
+ }
}
}
}
diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs
index 8b2c268300b..a7df41d8877 100644
--- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs
+++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs
@@ -445,7 +445,7 @@ private void AddCentcomm(StationCentcommComponent component)
component.MapEntity = map;
component.Entity = grid;
- _shuttle.AddFTLDestination(grid.Value, false);
+ _shuttle.TryAddFTLDestination(mapId, false, out _);
}
public HashSet GetCentcommMaps()
diff --git a/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs b/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs
index fb32437c6e9..b7f08b4b349 100644
--- a/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs
+++ b/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs
@@ -12,6 +12,7 @@ namespace Content.Server.Shuttles.Systems;
public sealed class RadarConsoleSystem : SharedRadarConsoleSystem
{
+ [Dependency] private readonly ShuttleConsoleSystem _console = default!;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
public override void Initialize()
@@ -39,11 +40,20 @@ protected override void UpdateState(EntityUid uid, RadarConsoleComponent compone
}
if (_uiSystem.TryGetUi(uid, RadarConsoleUiKey.Key, out var bui))
- _uiSystem.SetUiState(bui, new RadarConsoleBoundInterfaceState(
- component.MaxRange,
- GetNetCoordinates(coordinates),
- angle,
- new List()
- ));
+ {
+ NavInterfaceState state;
+ var docks = _console.GetAllDocks();
+
+ if (coordinates != null && angle != null)
+ {
+ state = _console.GetNavState(uid, docks, coordinates.Value, angle.Value);
+ }
+ else
+ {
+ state = _console.GetNavState(uid, docks);
+ }
+
+ _uiSystem.SetUiState(bui, new NavBoundUserInterfaceState(state));
+ }
}
}
diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.Drone.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.Drone.cs
index 99ab54f9afa..2970567b3ee 100644
--- a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.Drone.cs
+++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.Drone.cs
@@ -7,6 +7,20 @@ namespace Content.Server.Shuttles.Systems;
public sealed partial class ShuttleConsoleSystem
{
+ ///
+ /// Gets the drone console target if applicable otherwise returns itself.
+ ///
+ private EntityUid? GetDroneConsole(EntityUid consoleUid)
+ {
+ var getShuttleEv = new ConsoleShuttleEvent
+ {
+ Console = consoleUid,
+ };
+
+ RaiseLocalEvent(consoleUid, ref getShuttleEv);
+ return getShuttleEv.Console;
+ }
+
///
/// Refreshes all drone console entities.
///
diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.FTL.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.FTL.cs
new file mode 100644
index 00000000000..ba188896b1d
--- /dev/null
+++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.FTL.cs
@@ -0,0 +1,160 @@
+using Content.Server.Shuttles.Components;
+using Content.Server.Shuttles.Events;
+using Content.Shared.Shuttles.BUIStates;
+using Content.Shared.Shuttles.Components;
+using Content.Shared.Shuttles.Events;
+using Content.Shared.Shuttles.UI.MapObjects;
+using Robust.Shared.Map;
+using Robust.Shared.Map.Components;
+using Robust.Shared.Physics.Components;
+
+namespace Content.Server.Shuttles.Systems;
+
+public sealed partial class ShuttleConsoleSystem
+{
+ private void InitializeFTL()
+ {
+ SubscribeLocalEvent(OnBeaconStartup);
+ SubscribeLocalEvent(OnBeaconAnchorChanged);
+
+ SubscribeLocalEvent(OnExclusionStartup);
+ }
+
+ private void OnExclusionStartup(Entity ent, ref ComponentStartup args)
+ {
+ RefreshShuttleConsoles();
+ }
+
+ private void OnBeaconStartup(Entity ent, ref ComponentStartup args)
+ {
+ RefreshShuttleConsoles();
+ }
+
+ private void OnBeaconAnchorChanged(Entity ent, ref AnchorStateChangedEvent args)
+ {
+ RefreshShuttleConsoles();
+ }
+
+ private void OnBeaconFTLMessage(Entity ent, ref ShuttleConsoleFTLBeaconMessage args)
+ {
+ var beaconEnt = GetEntity(args.Beacon);
+ if (!_xformQuery.TryGetComponent(beaconEnt, out var targetXform))
+ {
+ return;
+ }
+
+ var nCoordinates = new NetCoordinates(GetNetEntity(targetXform.ParentUid), targetXform.LocalPosition);
+
+ // Check target exists
+ if (!_shuttle.CanFTLBeacon(nCoordinates))
+ {
+ return;
+ }
+
+ var angle = args.Angle.Reduced();
+ var targetCoordinates = new EntityCoordinates(targetXform.MapUid!.Value, _transform.GetWorldPosition(targetXform));
+
+ ConsoleFTL(ent, true, targetCoordinates, angle, targetXform.MapID);
+ }
+
+ private void OnPositionFTLMessage(Entity entity, ref ShuttleConsoleFTLPositionMessage args)
+ {
+ var mapUid = _mapManager.GetMapEntityId(args.Coordinates.MapId);
+
+ // If it's beacons only block all position messages.
+ if (!Exists(mapUid) || _shuttle.IsBeaconMap(mapUid))
+ {
+ return;
+ }
+
+ var targetCoordinates = new EntityCoordinates(mapUid, args.Coordinates.Position);
+ var angle = args.Angle.Reduced();
+ ConsoleFTL(entity, false, targetCoordinates, angle, args.Coordinates.MapId);
+ }
+
+ private void GetBeacons(ref List? beacons)
+ {
+ var beaconQuery = AllEntityQuery();
+
+ while (beaconQuery.MoveNext(out var destUid, out _))
+ {
+ var meta = _metaQuery.GetComponent(destUid);
+ var name = meta.EntityName;
+
+ if (string.IsNullOrEmpty(name))
+ name = Loc.GetString("shuttle-console-unknown");
+
+ // Can't travel to same map (yet)
+ var destXform = _xformQuery.GetComponent(destUid);
+ beacons ??= new List();
+ beacons.Add(new ShuttleBeaconObject(GetNetEntity(destUid), GetNetCoordinates(destXform.Coordinates), name));
+ }
+ }
+
+ private void GetExclusions(ref List? exclusions)
+ {
+ var query = AllEntityQuery();
+
+ while (query.MoveNext(out var uid, out var comp, out var xform))
+ {
+ if (!comp.Enabled)
+ continue;
+
+ exclusions ??= new List();
+ exclusions.Add(new ShuttleExclusionObject(GetNetCoordinates(xform.Coordinates), comp.Range, Loc.GetString("shuttle-console-exclusion")));
+ }
+ }
+
+ ///
+ /// Handles shuttle console FTLs.
+ ///
+ private void ConsoleFTL(Entity ent, bool beacon, EntityCoordinates targetCoordinates, Angle targetAngle, MapId targetMap)
+ {
+ var consoleUid = GetDroneConsole(ent.Owner);
+
+ if (consoleUid == null)
+ return;
+
+ var shuttleUid = _xformQuery.GetComponent(consoleUid.Value).GridUid;
+
+ if (!TryComp(shuttleUid, out ShuttleComponent? shuttleComp))
+ return;
+
+ // Check shuttle can even FTL
+ if (!_shuttle.CanFTL(shuttleUid.Value, out var reason))
+ {
+ // TODO: Session popup
+ return;
+ }
+
+ // Check shuttle can FTL to this target.
+ if (!_shuttle.CanFTLTo(shuttleUid.Value, targetMap))
+ {
+ return;
+ }
+
+ List? exclusions = null;
+ GetExclusions(ref exclusions);
+
+ if (!beacon && !_shuttle.FTLFree(shuttleUid.Value, targetCoordinates, targetAngle, exclusions))
+ {
+ return;
+ }
+
+ if (!TryComp(shuttleUid.Value, out PhysicsComponent? shuttlePhysics))
+ {
+ return;
+ }
+
+ // Client sends the "adjusted" coordinates and we adjust it back to get the actual transform coordinates.
+ var adjustedCoordinates = targetCoordinates.Offset(targetAngle.RotateVec(-shuttlePhysics.LocalCenter));
+
+ var tagEv = new FTLTagEvent();
+ RaiseLocalEvent(shuttleUid.Value, ref tagEv);
+
+ var ev = new ShuttleConsoleFTLTravelStartEvent(ent.Owner);
+ RaiseLocalEvent(ref ev);
+
+ _shuttle.FTLToCoordinates(shuttleUid.Value, shuttleComp, adjustedCoordinates, targetAngle);
+ }
+}
diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs
index 18dd3b0baf0..c47c519d5de 100644
--- a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs
+++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs
@@ -3,7 +3,6 @@
using Content.Server.Shuttles.Components;
using Content.Server.Shuttles.Events;
using Content.Server.Station.Systems;
-using Content.Server.UserInterface;
using Content.Shared.ActionBlocker;
using Content.Shared.Alert;
using Content.Shared.Popups;
@@ -13,12 +12,11 @@
using Content.Shared.Shuttles.Systems;
using Content.Shared.Tag;
using Content.Shared.Movement.Systems;
+using Content.Shared.Shuttles.UI.MapObjects;
using Robust.Server.GameObjects;
using Robust.Shared.Collections;
using Robust.Shared.GameStates;
-using Robust.Shared.Map.Components;
-using Robust.Shared.Physics.Components;
-using Robust.Shared.Timing;
+using Robust.Shared.Map;
using Robust.Shared.Utility;
using Content.Shared.UserInterface;
@@ -26,27 +24,38 @@ namespace Content.Server.Shuttles.Systems;
public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem
{
- [Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly ActionBlockerSystem _blocker = default!;
[Dependency] private readonly AlertsSystem _alertsSystem = default!;
+ [Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
+ [Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly ShuttleSystem _shuttle = default!;
[Dependency] private readonly StationSystem _station = default!;
[Dependency] private readonly TagSystem _tags = default!;
[Dependency] private readonly UserInterfaceSystem _ui = default!;
[Dependency] private readonly SharedContentEyeSystem _eyeSystem = default!;
+ private EntityQuery _metaQuery;
+ private EntityQuery _xformQuery;
+
+ private readonly HashSet> _consoles = new();
+
public override void Initialize()
{
base.Initialize();
+ _metaQuery = GetEntityQuery();
+ _xformQuery = GetEntityQuery();
+
SubscribeLocalEvent(OnConsoleShutdown);
SubscribeLocalEvent(OnConsolePowerChange);
SubscribeLocalEvent(OnConsoleAnchorChange);
SubscribeLocalEvent(OnConsoleUIOpenAttempt);
Subs.BuiEvents(ShuttleConsoleUiKey.Key, subs =>
{
- subs.Event(OnDestinationMessage);
+ subs.Event(OnBeaconFTLMessage);
+ subs.Event(OnPositionFTLMessage);
subs.Event(OnConsoleUIClose);
});
@@ -60,11 +69,12 @@ public override void Initialize()
SubscribeLocalEvent(OnDock);
SubscribeLocalEvent(OnUndock);
- SubscribeLocalEvent(HandlePilotMove);
SubscribeLocalEvent(OnGetState);
SubscribeLocalEvent(OnFtlDestStartup);
SubscribeLocalEvent(OnFtlDestShutdown);
+
+ InitializeFTL();
}
private void OnFtlDestStartup(EntityUid uid, FTLDestinationComponent component, ComponentStartup args)
@@ -77,65 +87,6 @@ private void OnFtlDestShutdown(EntityUid uid, FTLDestinationComponent component,
RefreshShuttleConsoles();
}
- private void OnDestinationMessage(EntityUid uid, ShuttleConsoleComponent component,
- ShuttleConsoleFTLRequestMessage args)
- {
- var destination = GetEntity(args.Destination);
-
- if (!TryComp(destination, out var dest))
- {
- return;
- }
-
- if (!dest.Enabled)
- return;
-
- EntityUid? entity = uid;
-
- var getShuttleEv = new ConsoleShuttleEvent
- {
- Console = uid,
- };
-
- RaiseLocalEvent(entity.Value, ref getShuttleEv);
- entity = getShuttleEv.Console;
-
- if (!TryComp(entity, out var xform) ||
- !TryComp(xform.GridUid, out var shuttle))
- {
- return;
- }
-
- if (dest.Whitelist?.IsValid(entity.Value, EntityManager) == false &&
- dest.Whitelist?.IsValid(xform.GridUid.Value, EntityManager) == false)
- {
- return;
- }
-
- var shuttleUid = xform.GridUid.Value;
-
- if (HasComp(shuttleUid))
- {
- _popup.PopupCursor(Loc.GetString("shuttle-console-in-ftl"), args.Session);
- return;
- }
-
- if (!_shuttle.CanFTL(xform.GridUid, out var reason))
- {
- _popup.PopupCursor(reason, args.Session);
- return;
- }
-
- var dock = HasComp(destination) && HasComp(destination);
- var tagEv = new FTLTagEvent();
- RaiseLocalEvent(xform.GridUid.Value, ref tagEv);
-
- var ev = new ShuttleConsoleFTLTravelStartEvent(uid);
- RaiseLocalEvent(ref ev);
-
- _shuttle.FTLTravel(xform.GridUid.Value, shuttle, destination, dock: dock, priorityTag: tagEv.Tag);
- }
-
private void OnDock(DockEvent ev)
{
RefreshShuttleConsoles();
@@ -146,10 +97,21 @@ private void OnUndock(UndockEvent ev)
RefreshShuttleConsoles();
}
- public void RefreshShuttleConsoles(EntityUid _)
+ ///
+ /// Refreshes all the shuttle console data for a particular grid.
+ ///
+ public void RefreshShuttleConsoles(EntityUid gridUid)
{
- // TODO: Should really call this per shuttle in some instances.
- RefreshShuttleConsoles();
+ var exclusions = new List();
+ GetExclusions(ref exclusions);
+ _consoles.Clear();
+ _lookup.GetChildEntities(gridUid, _consoles);
+ DockingInterfaceState? dockState = null;
+
+ foreach (var entity in _consoles)
+ {
+ UpdateState(entity, ref dockState);
+ }
}
///
@@ -157,12 +119,14 @@ public void RefreshShuttleConsoles(EntityUid _)
///
public void RefreshShuttleConsoles()
{
- var docks = GetAllDocks();
+ var exclusions = new List();
+ GetExclusions(ref exclusions);
var query = AllEntityQuery();
+ DockingInterfaceState? dockState = null;
- while (query.MoveNext(out var uid, out var _))
+ while (query.MoveNext(out var uid, out _))
{
- UpdateState(uid, docks);
+ UpdateState(uid,ref dockState);
}
}
@@ -177,12 +141,6 @@ private void OnConsoleUIClose(EntityUid uid, ShuttleConsoleComponent component,
return;
}
- // In case they D/C should still clean them up.
- foreach (var comp in EntityQuery(true))
- {
- comp.Requesters.Remove(user);
- }
-
RemovePilot(user);
}
@@ -196,12 +154,14 @@ private void OnConsoleUIOpenAttempt(EntityUid uid, ShuttleConsoleComponent compo
private void OnConsoleAnchorChange(EntityUid uid, ShuttleConsoleComponent component,
ref AnchorStateChangedEvent args)
{
- UpdateState(uid);
+ DockingInterfaceState? dockState = null;
+ UpdateState(uid, ref dockState);
}
private void OnConsolePowerChange(EntityUid uid, ShuttleConsoleComponent component, ref PowerChangedEvent args)
{
- UpdateState(uid);
+ DockingInterfaceState? dockState = null;
+ UpdateState(uid, ref dockState);
}
private bool TryPilot(EntityUid user, EntityUid uid)
@@ -239,33 +199,38 @@ private void OnGetState(EntityUid uid, PilotComponent component, ref ComponentGe
///
/// Returns the position and angle of all dockingcomponents.
///
- private List GetAllDocks()
+ public Dictionary> GetAllDocks()
{
// TODO: NEED TO MAKE SURE THIS UPDATES ON ANCHORING CHANGES!
- var result = new List();
- var query = AllEntityQuery();
+ var result = new Dictionary>();
+ var query = AllEntityQuery();
- while (query.MoveNext(out var uid, out var comp, out var xform))
+ while (query.MoveNext(out var uid, out var comp, out var xform, out var metadata))
{
if (xform.ParentUid != xform.GridUid)
continue;
- var state = new DockingInterfaceState()
+ var gridDocks = result.GetOrNew(GetNetEntity(xform.GridUid.Value));
+
+ var state = new DockingPortState()
{
+ Name = metadata.EntityName,
Coordinates = GetNetCoordinates(xform.Coordinates),
Angle = xform.LocalRotation,
Entity = GetNetEntity(uid),
- Connected = comp.Docked,
- Color = comp.RadarColor,
- HighlightedColor = comp.HighlightedRadarColor,
+ GridDockedWith =
+ _xformQuery.TryGetComponent(comp.DockedWith, out var otherDockXform) ?
+ GetNetEntity(otherDockXform.GridUid) :
+ null,
};
- result.Add(state);
+
+ gridDocks.Add(state);
}
return result;
}
- private void UpdateState(EntityUid consoleUid, List? docks = null)
+ private void UpdateState(EntityUid consoleUid, ref DockingInterfaceState? dockState)
{
EntityUid? entity = consoleUid;
@@ -278,77 +243,26 @@ private void UpdateState(EntityUid consoleUid, List? dock
entity = getShuttleEv.Console;
TryComp(entity, out var consoleXform);
- TryComp(entity, out var radar);
- var range = radar?.MaxRange ?? SharedRadarConsoleSystem.DefaultMaxRange;
-
var shuttleGridUid = consoleXform?.GridUid;
- var destinations = new List<(NetEntity, string, bool)>();
- var ftlState = FTLState.Available;
- var ftlTime = TimeSpan.Zero;
+ NavInterfaceState navState;
+ ShuttleMapInterfaceState mapState;
+ dockState ??= GetDockState();
- if (TryComp(shuttleGridUid, out var shuttleFtl))
+ if (shuttleGridUid != null && entity != null)
{
- ftlState = shuttleFtl.State;
- ftlTime = _timing.CurTime + TimeSpan.FromSeconds(shuttleFtl.Accumulator);
+ navState = GetNavState(entity.Value, dockState.Docks);
+ mapState = GetMapState(shuttleGridUid.Value);
}
-
- // Mass too large
- if (entity != null && shuttleGridUid != null &&
- (!TryComp(shuttleGridUid, out var shuttleBody) || shuttleBody.Mass < 1000f))
+ else
{
- var metaQuery = GetEntityQuery();
-
- // Can't go anywhere when in FTL.
- var locked = shuttleFtl != null || Paused(shuttleGridUid.Value);
-
- // Can't cache it because it may have a whitelist for the particular console.
- // Include paused as we still want to show CentCom.
- var destQuery = AllEntityQuery();
-
- while (destQuery.MoveNext(out var destUid, out var comp))
- {
- // Can't warp to itself or if it's not on the whitelist (console or shuttle).
- if (destUid == shuttleGridUid ||
- comp.Whitelist?.IsValid(entity.Value) == false &&
- (shuttleGridUid == null || comp.Whitelist?.IsValid(shuttleGridUid.Value, EntityManager) == false))
- {
- continue;
- }
-
- var meta = metaQuery.GetComponent(destUid);
- var name = meta.EntityName;
-
- if (string.IsNullOrEmpty(name))
- name = Loc.GetString("shuttle-console-unknown");
-
- var canTravel = !locked &&
- comp.Enabled &&
- (!TryComp(destUid, out var ftl) || ftl.State == FTLState.Cooldown);
-
- // Can't travel to same map (yet)
- if (canTravel && consoleXform?.MapUid == Transform(destUid).MapUid)
- {
- canTravel = false;
- }
-
- destinations.Add((GetNetEntity(destUid), name, canTravel));
- }
+ navState = new NavInterfaceState(0f, null, null, new Dictionary>());
+ mapState = new ShuttleMapInterfaceState(FTLState.Invalid, 0f, new List(), new List());
}
- docks ??= GetAllDocks();
-
if (_ui.TryGetUi(consoleUid, ShuttleConsoleUiKey.Key, out var bui))
{
- _ui.SetUiState(bui, new ShuttleConsoleBoundInterfaceState(
- ftlState,
- ftlTime,
- destinations,
- range,
- GetNetCoordinates(consoleXform?.Coordinates),
- consoleXform?.LocalRotation,
- docks
- ));
+ _ui.SetUiState(bui, new ShuttleBoundUserInterfaceState(navState, mapState, dockState));
}
}
@@ -376,27 +290,6 @@ public override void Update(float frameTime)
}
}
- ///
- /// If pilot is moved then we'll stop them from piloting.
- ///
- private void HandlePilotMove(EntityUid uid, PilotComponent component, ref MoveEvent args)
- {
- if (component.Console == null || component.Position == null)
- {
- DebugTools.Assert(component.Position == null && component.Console == null);
- EntityManager.RemoveComponent(uid);
- return;
- }
-
- if (args.NewPosition.TryDistance(EntityManager, component.Position.Value, out var distance) &&
- distance < PilotComponent.BreakDistance)
- {
- return;
- }
-
- RemovePilot(uid, component);
- }
-
protected override void HandlePilotShutdown(EntityUid uid, PilotComponent component, ComponentShutdown args)
{
base.HandlePilotShutdown(uid, component, args);
@@ -467,4 +360,70 @@ public void ClearPilots(ShuttleConsoleComponent component)
RemovePilot(pilot, pilotComponent);
}
}
+
+ ///
+ /// Specific for a particular shuttle.
+ ///
+ public NavInterfaceState GetNavState(Entity entity, Dictionary> docks)
+ {
+ if (!Resolve(entity, ref entity.Comp1, ref entity.Comp2))
+ return new NavInterfaceState(SharedRadarConsoleSystem.DefaultMaxRange, null, null, docks);
+
+ return GetNavState(
+ entity,
+ docks,
+ entity.Comp2.Coordinates,
+ entity.Comp2.LocalRotation);
+ }
+
+ public NavInterfaceState GetNavState(
+ Entity entity,
+ Dictionary> docks,
+ EntityCoordinates coordinates,
+ Angle angle)
+ {
+ if (!Resolve(entity, ref entity.Comp1, ref entity.Comp2))
+ return new NavInterfaceState(SharedRadarConsoleSystem.DefaultMaxRange, GetNetCoordinates(coordinates), angle, docks);
+
+ return new NavInterfaceState(
+ entity.Comp1.MaxRange,
+ GetNetCoordinates(coordinates),
+ angle,
+ docks);
+ }
+
+ ///
+ /// Global for all shuttles.
+ ///
+ ///
+ public DockingInterfaceState GetDockState()
+ {
+ var docks = GetAllDocks();
+ return new DockingInterfaceState(docks);
+ }
+
+ ///
+ /// Specific to a particular shuttle.
+ ///
+ public ShuttleMapInterfaceState GetMapState(Entity shuttle)
+ {
+ FTLState ftlState = FTLState.Available;
+ float stateDuration = 0f;
+
+ if (Resolve(shuttle, ref shuttle.Comp, false) && shuttle.Comp.LifeStage < ComponentLifeStage.Stopped)
+ {
+ ftlState = shuttle.Comp.State;
+ stateDuration = _shuttle.GetStateDuration(shuttle.Comp);
+ }
+
+ List? beacons = null;
+ List? exclusions = null;
+ GetBeacons(ref beacons);
+ GetExclusions(ref exclusions);
+
+ return new ShuttleMapInterfaceState(
+ ftlState, stateDuration,
+ beacons ?? new List(),
+ exclusions ?? new List());
+ }
}
diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs
index d976b634d5b..8a935637655 100644
--- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs
+++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs
@@ -3,16 +3,16 @@
using System.Numerics;
using Content.Server.Shuttles.Components;
using Content.Server.Shuttles.Events;
-using Content.Server.Station.Systems;
+using Content.Server.Station.Events;
using Content.Shared.Body.Components;
using Content.Shared.Buckle.Components;
-using Content.Shared.Doors.Components;
using Content.Shared.Ghost;
using Content.Shared.Maps;
using Content.Shared.Parallax;
using Content.Shared.Shuttles.Components;
using Content.Shared.Shuttles.Systems;
using Content.Shared.StatusEffect;
+using Content.Shared.Whitelist;
using JetBrains.Annotations;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Components;
@@ -21,8 +21,8 @@
using Robust.Shared.Map.Components;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
-using Robust.Shared.Player;
using Robust.Shared.Utility;
+using FTLMapComponent = Content.Shared.Shuttles.Components.FTLMapComponent;
namespace Content.Server.Shuttles.Systems;
@@ -32,18 +32,11 @@ public sealed partial class ShuttleSystem
* This is a way to move a shuttle from one location to another, via an intermediate map for fanciness.
*/
- private MapId? _hyperSpaceMap;
-
public const float DefaultStartupTime = 5.5f;
public const float DefaultTravelTime = 20f;
public const float DefaultArrivalTime = 5f;
private const float FTLCooldown = 10f;
- private const float ShuttleFTLRange = 100f;
-
- ///
- /// Minimum mass a grid needs to be to block a shuttle recall.
- ///
- public const float ShuttleFTLMassThreshold = 300f;
+ public const float FTLMassLimit = 100000f;
// I'm too lazy to make CVars.
@@ -51,7 +44,7 @@ public sealed partial class ShuttleSystem
{
Params = AudioParams.Default.WithVolume(-5f),
};
- // private SoundSpecifier _travelSound = new SoundPathSpecifier();
+
private readonly SoundSpecifier _arrivalSound = new SoundPathSpecifier("/Audio/Effects/Shuttle/hyperspace_end.ogg")
{
Params = AudioParams.Default.WithVolume(-5f),
@@ -59,7 +52,9 @@ public sealed partial class ShuttleSystem
private readonly TimeSpan _hyperspaceKnockdownTime = TimeSpan.FromSeconds(5);
+ ///
/// Left-side of the station we're allowed to use
+ ///
private float _index;
///
@@ -72,12 +67,7 @@ public sealed partial class ShuttleSystem
///
private const int FTLProximityIterations = 3;
- ///
- /// Minimum mass for an FTL destination
- ///
- public const float FTLDestinationMass = 500f;
-
- private HashSet _lookupEnts = new();
+ private readonly HashSet _lookupEnts = new();
private EntityQuery _bodyQuery;
private EntityQuery _buckleQuery;
@@ -88,68 +78,112 @@ public sealed partial class ShuttleSystem
private void InitializeFTL()
{
+ SubscribeLocalEvent(OnStationPostInit);
_bodyQuery = GetEntityQuery();
_buckleQuery = GetEntityQuery();
_ghostQuery = GetEntityQuery();
_physicsQuery = GetEntityQuery();
_statusQuery = GetEntityQuery();
_xformQuery = GetEntityQuery();
-
- SubscribeLocalEvent(OnStationGridAdd);
}
- private void OnStationGridAdd(StationGridAddedEvent ev)
+ private void OnStationPostInit(ref StationPostInitEvent ev)
{
- if (HasComp(ev.GridId) ||
- TryComp(ev.GridId, out var body) &&
- body.Mass > FTLDestinationMass)
+ // Add all grid maps as ftl destinations that anyone can FTL to.
+ foreach (var gridUid in ev.Station.Comp.Grids)
{
- AddFTLDestination(ev.GridId, true);
+ var gridXform = _xformQuery.GetComponent(gridUid);
+
+ if (gridXform.MapUid == null)
+ {
+ continue;
+ }
+
+ TryAddFTLDestination(gridXform.MapID, true, out _);
}
}
- public bool CanFTL(EntityUid? uid, [NotNullWhen(false)] out string? reason)
+ ///
+ /// Ensures the FTL map exists and returns it.
+ ///
+ private EntityUid EnsureFTLMap()
{
- if (HasComp(uid))
+ var query = AllEntityQuery();
+
+ while (query.MoveNext(out var uid, out _))
{
- reason = Loc.GetString("shuttle-console-prevent");
- return false;
+ return uid;
}
- if (uid != null)
- {
- var ev = new ConsoleFTLAttemptEvent(uid.Value, false, string.Empty);
- RaiseLocalEvent(uid.Value, ref ev, true);
+ var mapId = _mapManager.CreateMap();
+ var mapUid = _mapManager.GetMapEntityId(mapId);
+ var ftlMap = AddComp(mapUid);
- if (ev.Cancelled)
- {
- reason = ev.Reason;
- return false;
- }
+ _metadata.SetEntityName(mapUid, "FTL");
+ Log.Debug($"Setup hyperspace map at {mapUid}");
+ DebugTools.Assert(!_mapManager.IsMapPaused(mapId));
+ var parallax = EnsureComp(mapUid);
+ parallax.Parallax = ftlMap.Parallax;
+
+ return mapUid;
+ }
+
+ public float GetStateDuration(FTLComponent component)
+ {
+ var state = component.State;
+
+ switch (state)
+ {
+ case FTLState.Starting:
+ case FTLState.Travelling:
+ case FTLState.Arriving:
+ case FTLState.Cooldown:
+ return component.Accumulator;
+ case FTLState.Available:
+ return 0f;
+ default:
+ throw new NotImplementedException();
}
+ }
- reason = null;
- return true;
+ ///
+ /// Updates the whitelist for this FTL destination.
+ ///
+ ///
+ ///
+ public void SetFTLWhitelist(Entity entity, EntityWhitelist? whitelist)
+ {
+ if (!Resolve(entity, ref entity.Comp))
+ return;
+
+ if (entity.Comp.Whitelist == whitelist)
+ return;
+
+ entity.Comp.Whitelist = whitelist;
+ _console.RefreshShuttleConsoles();
+ Dirty(entity);
}
///
- /// Adds a target for hyperspace to every shuttle console.
+ /// Adds the target map as available for FTL.
///
- public FTLDestinationComponent AddFTLDestination(EntityUid uid, bool enabled)
+ public bool TryAddFTLDestination(MapId mapId, bool enabled, [NotNullWhen(true)] out FTLDestinationComponent? component)
{
- if (TryComp(uid, out var destination) && destination.Enabled == enabled)
- return destination;
+ var mapUid = _mapManager.GetMapEntityId(mapId);
+ component = null;
- destination = EnsureComp(uid);
+ if (!Exists(mapUid))
+ return false;
- if (HasComp(uid))
- {
- enabled = false;
- }
+ component = EnsureComp(mapUid);
- destination.Enabled = enabled;
+ if (component.Enabled == enabled)
+ return true;
+
+ component.Enabled = enabled;
_console.RefreshShuttleConsoles();
- return destination;
+ Dirty(mapUid, component);
+ return true;
}
[PublicAPI]
@@ -162,52 +196,111 @@ public void RemoveFTLDestination(EntityUid uid)
}
///
- /// Moves a shuttle from its current position to the target one. Goes through the hyperspace map while the timer is running.
+ /// Returns true if the grid can FTL. Used to block protected shuttles like the emergency shuttle.
+ ///
+ public bool CanFTL(EntityUid shuttleUid, [NotNullWhen(false)] out string? reason)
+ {
+ if (HasComp(shuttleUid))
+ {
+ reason = Loc.GetString("shuttle-console-in-ftl");
+ return false;
+ }
+
+ if (TryComp(shuttleUid, out PhysicsComponent? shuttlePhysics) && shuttlePhysics.Mass > 300f)
+ {
+ reason = Loc.GetString("shuttle-console-mass");
+ return false;
+ }
+
+ if (HasComp(shuttleUid))
+ {
+ reason = Loc.GetString("shuttle-console-prevent");
+ return false;
+ }
+
+ var ev = new ConsoleFTLAttemptEvent(shuttleUid, false, string.Empty);
+ RaiseLocalEvent(shuttleUid, ref ev, true);
+
+ if (ev.Cancelled)
+ {
+ reason = ev.Reason;
+ return false;
+ }
+
+ reason = null;
+ return true;
+ }
+
+ ///
+ /// Moves a shuttle from its current position to the target one without any checks. Goes through the hyperspace map while the timer is running.
///
- public void FTLTravel(
+ public void FTLToCoordinates(
EntityUid shuttleUid,
ShuttleComponent component,
EntityCoordinates coordinates,
+ Angle angle,
float startupTime = DefaultStartupTime,
float hyperspaceTime = DefaultTravelTime,
string? priorityTag = null)
{
if (!TrySetupFTL(shuttleUid, component, out var hyperspace))
- return;
+ return;
hyperspace.StartupTime = startupTime;
hyperspace.TravelTime = hyperspaceTime;
hyperspace.Accumulator = hyperspace.StartupTime;
hyperspace.TargetCoordinates = coordinates;
- hyperspace.Dock = false;
+ hyperspace.TargetAngle = angle;
hyperspace.PriorityTag = priorityTag;
- _console.RefreshShuttleConsoles();
- var ev = new FTLRequestEvent(_mapManager.GetMapEntityId(coordinates.ToMap(EntityManager, _transform).MapId));
+
+ _console.RefreshShuttleConsoles(shuttleUid);
+
+ var mapId = coordinates.GetMapId(EntityManager);
+ var mapUid = _mapManager.GetMapEntityId(mapId);
+ var ev = new FTLRequestEvent(mapUid);
RaiseLocalEvent(shuttleUid, ref ev, true);
}
///
- /// Moves a shuttle from its current position to docked on the target one. Goes through the hyperspace map while the timer is running.
+ /// Moves a shuttle from its current position to docked on the target one.
+ /// If no docks are free when FTLing it will arrive in proximity
///
- public void FTLTravel(
+ public void FTLToDock(
EntityUid shuttleUid,
ShuttleComponent component,
EntityUid target,
float startupTime = DefaultStartupTime,
float hyperspaceTime = DefaultTravelTime,
- bool dock = false,
string? priorityTag = null)
{
if (!TrySetupFTL(shuttleUid, component, out var hyperspace))
return;
+ var config = _dockSystem.GetDockingConfig(shuttleUid, target, priorityTag);
hyperspace.StartupTime = startupTime;
hyperspace.TravelTime = hyperspaceTime;
hyperspace.Accumulator = hyperspace.StartupTime;
- hyperspace.TargetUid = target;
- hyperspace.Dock = dock;
hyperspace.PriorityTag = priorityTag;
- _console.RefreshShuttleConsoles();
+
+ _console.RefreshShuttleConsoles(shuttleUid);
+
+ // Valid dock for now time so just use that as the target.
+ if (config != null)
+ {
+ hyperspace.TargetCoordinates = config.Coordinates;
+ hyperspace.TargetAngle = config.Angle;
+ }
+ else if (TryGetFTLProximity(shuttleUid, target, out var coords, out var targAngle))
+ {
+ hyperspace.TargetCoordinates = coords;
+ hyperspace.TargetAngle = targAngle;
+ }
+ else
+ {
+ // FTL back to its own position.
+ hyperspace.TargetCoordinates = Transform(shuttleUid).Coordinates;
+ Log.Error($"Unable to FTL grid {ToPrettyString(shuttleUid)} to target properly?");
+ }
}
private bool TrySetupFTL(EntityUid uid, ShuttleComponent shuttle, [NotNullWhen(true)] out FTLComponent? component)
@@ -216,20 +309,14 @@ private bool TrySetupFTL(EntityUid uid, ShuttleComponent shuttle, [NotNullWhen(t
if (HasComp(uid))
{
- Log.Warning($"Tried queuing {ToPrettyString(uid)} which already has HyperspaceComponent?");
+ Log.Warning($"Tried queuing {ToPrettyString(uid)} which already has {nameof(FTLComponent)}?");
return false;
}
- if (TryComp(uid, out var dest))
- {
- dest.Enabled = false;
- }
-
_thruster.DisableLinearThrusters(shuttle);
_thruster.EnableLinearThrustDirection(shuttle, DirectionFlag.North);
_thruster.SetAngularThrust(shuttle, false);
- // TODO: Maybe move this to docking instead?
- SetDocks(uid, false);
+ _dockSystem.SetDocks(uid, false);
component = AddComp(uid);
component.State = FTLState.Starting;
@@ -241,228 +328,226 @@ private bool TrySetupFTL(EntityUid uid, ShuttleComponent shuttle, [NotNullWhen(t
_transform.SetLocalPosition(audio.Value.Entity, gridPhysics.LocalCenter);
}
+ // TODO: Play previs here for docking arrival.
+
// Make sure the map is setup before we leave to avoid pop-in (e.g. parallax).
- SetupHyperspace();
+ EnsureFTLMap();
return true;
}
+ ///
+ /// Transitions shuttle to FTL map.
+ ///
+ private void UpdateFTLStarting(Entity entity)
+ {
+ var uid = entity.Owner;
+ var comp = entity.Comp1;
+ var xform = _xformQuery.GetComponent(entity);
+ DoTheDinosaur(xform);
+
+ comp.State = FTLState.Travelling;
+ var fromMapUid = xform.MapUid;
+ var fromMatrix = _transform.GetWorldMatrix(xform);
+ var fromRotation = _transform.GetWorldRotation(xform);
+
+ var width = Comp(uid).LocalAABB.Width;
+ var ftlMap = EnsureFTLMap();
+ var body = _physicsQuery.GetComponent(entity);
+ var shuttleCenter = body.LocalCenter;
+
+ // Offset the start by buffer range just to avoid overlap.
+ var ftlStart = new EntityCoordinates(ftlMap, new Vector2(_index + width / 2f, 0f) - shuttleCenter);
+
+ _transform.SetCoordinates(entity.Owner, ftlStart);
+
+ // Reset rotation so they always face the same direction.
+ xform.LocalRotation = Angle.Zero;
+ _index += width + Buffer;
+ comp.Accumulator += comp.TravelTime - DefaultArrivalTime;
+
+ Enable(uid, component: body);
+ _physics.SetLinearVelocity(uid, new Vector2(0f, 20f), body: body);
+ _physics.SetAngularVelocity(uid, 0f, body: body);
+ _physics.SetLinearDamping(body, 0f);
+ _physics.SetAngularDamping(body, 0f);
+
+ _dockSystem.SetDockBolts(uid, true);
+ _console.RefreshShuttleConsoles(uid);
+
+ var ev = new FTLStartedEvent(uid, comp.TargetCoordinates, fromMapUid, fromMatrix, fromRotation);
+ RaiseLocalEvent(uid, ref ev, true);
+
+ // Audio
+ var wowdio = _audio.PlayPvs(comp.TravelSound, uid);
+ comp.TravelStream = wowdio?.Entity;
+ if (wowdio?.Component != null)
+ {
+ wowdio.Value.Component.Flags |= AudioFlags.GridAudio;
+
+ if (_physicsQuery.TryGetComponent(uid, out var gridPhysics))
+ {
+ _transform.SetLocalPosition(wowdio.Value.Entity, gridPhysics.LocalCenter);
+ }
+ }
+ }
+
+ ///