From a07fdd78840407917fd19750b183dd88e6b9be8f Mon Sep 17 00:00:00 2001 From: Remuchi <72476615+Remuchi@users.noreply.github.com> Date: Fri, 28 Jun 2024 19:23:19 +0700 Subject: [PATCH] =?UTF-8?q?[Tweak]=20=D0=A2=D0=BE=D1=80=D0=B3=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=81=D1=82=D0=B0=D0=BD=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=80=D0=B3=D0=BE=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=B0=20=D0=BE=D1=82=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=83=D1=8E=20=D0=BA=D0=B0=D1=80=D1=82=D1=83?= =?UTF-8?q?=20(#391)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: торговая станция вынесена на отдельную карту * tweak: отключить случайный поворот и офсет станции --- .../Cargo/Systems/CargoSystem.Orders.cs | 50 +++++--- .../Cargo/Systems/CargoSystem.Shuttle.cs | 116 +++++++++++++++--- Content.Server/Cargo/Systems/CargoSystem.cs | 8 ++ Content.Shared/CCVar/CCVars.cs | 4 +- Resources/Maps/Shuttles/trading_outpost.yml | 7 +- .../Prototypes/Entities/Stations/base.yml | 12 +- 6 files changed, 153 insertions(+), 44 deletions(-) diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index 9ce414adc3..9bccabe98c 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -57,7 +57,7 @@ namespace Content.Server.Cargo.Systems return; _audio.PlayPvs(component.ConfirmSound, uid); - UpdateBankAccount(stationUid.Value, bank, (int) price); + UpdateBankAccount(stationUid.Value, bank, (int)price); QueueDel(args.Used); } @@ -100,7 +100,8 @@ namespace Content.Server.Cargo.Systems #region Interface - private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, CargoConsoleApproveOrderMessage args) + private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, + CargoConsoleApproveOrderMessage args) { if (args.Session.AttachedEntity is not { Valid: true } player) return; @@ -184,7 +185,9 @@ namespace Content.Server.Cargo.Systems 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))); + ConsolePopup(args.Session, + Loc.GetString("cargo-console-trade-station", + ("destination", MetaData(tradeDestination.Value).EntityName))); // Log order approval _adminLogger.Add(LogType.Action, LogImpact.Low, @@ -195,7 +198,8 @@ namespace Content.Server.Cargo.Systems UpdateOrders(station.Value, orderDatabase); } - private EntityUid? TryFulfillOrder(StationDataComponent stationData, CargoOrderData order, StationCargoOrderDatabaseComponent orderDatabase) + private EntityUid? TryFulfillOrder(StationDataComponent stationData, CargoOrderData order, + StationCargoOrderDatabaseComponent orderDatabase) { // No slots at the trade station _listEnts.Clear(); @@ -219,7 +223,8 @@ namespace Content.Server.Cargo.Systems { tradeDestination = trade; order.NumDispatched++; - if (order.OrderQuantity <= order.NumDispatched) //Spawn a crate on free pellets until the order is fulfilled. + if (order.OrderQuantity <= + order.NumDispatched) //Spawn a crate on free pellets until the order is fulfilled. break; } } @@ -234,16 +239,15 @@ namespace Content.Server.Cargo.Systems private void GetTradeStations(StationDataComponent data, ref List ents) { - foreach (var gridUid in data.Grids) + var tradeStationQuery = AllEntityQuery(); + while (tradeStationQuery.MoveNext(out var uid, out _)) { - if (!_tradeQuery.HasComponent(gridUid)) - continue; - - ents.Add(gridUid); + ents.Add(uid); } } - private void OnRemoveOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, CargoConsoleRemoveOrderMessage args) + private void OnRemoveOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, + CargoConsoleRemoveOrderMessage args) { var station = _station.GetOwningStation(uid); @@ -253,7 +257,8 @@ namespace Content.Server.Cargo.Systems RemoveOrder(station.Value, args.OrderId, orderDatabase); } - private void OnAddOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, CargoConsoleAddOrderMessage args) + private void OnAddOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, + CargoConsoleAddOrderMessage args) { if (args.Session.AttachedEntity is not { Valid: true } player) return; @@ -286,7 +291,6 @@ namespace Content.Server.Cargo.Systems // Log order addition _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):user} added order [orderId:{data.OrderId}, quantity:{data.OrderQuantity}, product:{data.ProductId}, requester:{data.Requester}, reason:{data.Reason}]"); - } private void OnOrderUIOpened(EntityUid uid, CargoOrderConsoleComponent component, BoundUIOpenedEvent args) @@ -325,9 +329,11 @@ namespace Content.Server.Cargo.Systems _audio.PlayPvs(_audio.GetSound(component.ErrorSound), uid); } - private static CargoOrderData GetOrderData(CargoConsoleAddOrderMessage args, CargoProductPrototype cargoProduct, int id) + private static CargoOrderData GetOrderData(CargoConsoleAddOrderMessage args, CargoProductPrototype cargoProduct, + int id) { - return new CargoOrderData(id, cargoProduct.Product, cargoProduct.Cost, args.Amount, args.Requester, args.Reason); + return new CargoOrderData(id, cargoProduct.Product, cargoProduct.Cost, args.Amount, args.Requester, + args.Reason); } public static int GetOutstandingOrderCount(StationCargoOrderDatabaseComponent component) @@ -422,6 +428,7 @@ namespace Content.Server.Cargo.Systems { orderDB.Orders.RemoveAt(sequenceIdx); } + UpdateOrders(dbUid, orderDB); } @@ -433,7 +440,8 @@ namespace Content.Server.Cargo.Systems component.Orders.Clear(); } - private static bool PopFrontOrder(StationCargoOrderDatabaseComponent orderDB, [NotNullWhen(true)] out CargoOrderData? orderOut) + private static bool PopFrontOrder(StationCargoOrderDatabaseComponent orderDB, + [NotNullWhen(true)] out CargoOrderData? orderOut) { var orderIdx = orderDB.Orders.FindIndex(order => order.Approved); if (orderIdx == -1) @@ -450,13 +458,15 @@ namespace Content.Server.Cargo.Systems // Order is complete. Remove from the queue. orderDB.Orders.RemoveAt(orderIdx); } + return true; } /// /// Tries to fulfill the next outstanding order. /// - private bool FulfillNextOrder(StationCargoOrderDatabaseComponent orderDB, EntityCoordinates spawn, string? paperProto) + private bool FulfillNextOrder(StationCargoOrderDatabaseComponent orderDB, EntityCoordinates spawn, + string? paperProto) { if (!PopFrontOrder(orderDB, out var order)) return false; @@ -497,7 +507,6 @@ namespace Content.Server.Cargo.Systems } return true; - } private void DeductFunds(StationBankAccountComponent component, int amount) @@ -507,11 +516,12 @@ namespace Content.Server.Cargo.Systems #region Station - private bool TryGetOrderDatabase([NotNullWhen(true)] EntityUid? stationUid, [MaybeNullWhen(false)] out StationCargoOrderDatabaseComponent dbComp) + private bool TryGetOrderDatabase([NotNullWhen(true)] EntityUid? stationUid, + [MaybeNullWhen(false)] out StationCargoOrderDatabaseComponent dbComp) { return TryComp(stationUid, out dbComp); } #endregion } -} +} \ No newline at end of file diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs index 3bcd6d8d20..eed2724985 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs @@ -1,12 +1,17 @@ using Content.Server.Cargo.Components; +using Content.Server.GameTicking; +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.Whitelist; +using Robust.Server.Maps; using Robust.Shared.Map; -using Robust.Shared.Random; using Robust.Shared.Audio; namespace Content.Server.Cargo.Systems; @@ -16,9 +21,12 @@ public sealed partial class CargoSystem /* * Handles cargo shuttle / trade mechanics. */ + private MapId? TradeStationMap { get; set; } private static readonly SoundPathSpecifier ApproveSound = new("/Audio/Effects/Cargo/ping.ogg"); + private const string TradeStationMapPath = "/Maps/Shuttles/trading_outpost.yml"; + private void InitializeShuttle() { SubscribeLocalEvent(OnTradeSplit); @@ -30,6 +38,17 @@ public sealed partial class CargoSystem SubscribeLocalEvent(OnPalletUIOpen); SubscribeLocalEvent(OnRoundRestart); + SubscribeLocalEvent(OnStationInitialize); + + Subs.CVar(_cfgManager, CCVars.GridFill, SetGridFill); + } + + private void SetGridFill(bool obj) + { + if (obj && _ticker.RunLevel != GameRunLevel.PreRoundLobby) // Ensure run level is in game + { + SetupTradeStation(); + } } #region Console @@ -58,12 +77,13 @@ public sealed partial class CargoSystem if (Transform(uid).GridUid is not EntityUid gridUid) { _uiSystem.SetUiState(bui, - new CargoPalletConsoleInterfaceState(0, 0, false)); + new CargoPalletConsoleInterfaceState(0, 0, false)); return; } + GetPalletGoods(gridUid, out var toSell, out var amount); _uiSystem.SetUiState(bui, - new CargoPalletConsoleInterfaceState((int) amount, toSell.Count, true)); + new CargoPalletConsoleInterfaceState((int)amount, toSell.Count, true)); } private void OnPalletUIOpen(EntityUid uid, CargoPalletConsoleComponent component, BoundUIOpenedEvent args) @@ -83,7 +103,6 @@ public sealed partial class CargoSystem /// I dont want it to explode if cargo uses a conveyor to move 8000 pineapple slices or whatever, they are /// known for their entity spam i wouldnt put it past them /// - private void OnPalletAppraise(EntityUid uid, CargoPalletConsoleComponent component, CargoPalletAppraiseMessage args) { var player = args.Session.AttachedEntity; @@ -94,7 +113,8 @@ public sealed partial class CargoSystem UpdatePalletConsoleInterface(uid); } - private void OnCargoShuttleConsoleStartup(EntityUid uid, CargoShuttleConsoleComponent component, ComponentStartup args) + private void OnCargoShuttleConsoleStartup(EntityUid uid, CargoShuttleConsoleComponent component, + ComponentStartup args) { var station = _station.GetOwningStation(uid); UpdateShuttleState(uid, station); @@ -106,12 +126,18 @@ public sealed partial class CargoSystem TryComp(orderDatabase?.Shuttle, out var shuttle); var orders = GetProjectedOrders(station ?? EntityUid.Invalid, orderDatabase, shuttle); - var shuttleName = orderDatabase?.Shuttle != null ? MetaData(orderDatabase.Shuttle.Value).EntityName : string.Empty; + var shuttleName = orderDatabase?.Shuttle != null + ? MetaData(orderDatabase.Shuttle.Value).EntityName + : string.Empty; if (_uiSystem.TryGetUi(uid, CargoConsoleUiKey.Shuttle, out var bui)) _uiSystem.SetUiState(bui, new CargoShuttleConsoleBoundUserInterfaceState( - station != null ? MetaData(station.Value).EntityName : Loc.GetString("cargo-shuttle-console-station-unknown"), - string.IsNullOrEmpty(shuttleName) ? Loc.GetString("cargo-shuttle-console-shuttle-not-found") : shuttleName, + station != null + ? MetaData(station.Value).EntityName + : Loc.GetString("cargo-shuttle-console-station-unknown"), + string.IsNullOrEmpty(shuttleName) + ? Loc.GetString("cargo-shuttle-console-shuttle-not-found") + : shuttleName, orders )); } @@ -154,13 +180,14 @@ public sealed partial class CargoSystem // We won't be able to fit the whole order on, so make one // which represents the space we do have left: var reducedOrder = new CargoOrderData(order.OrderId, - order.ProductId, order.Price, spaceRemaining, order.Requester, order.Reason); + order.ProductId, order.Price, spaceRemaining, order.Requester, order.Reason); orders.Add(reducedOrder); } else { orders.Add(order); } + spaceRemaining -= numToShip; } } @@ -179,7 +206,8 @@ public sealed partial class CargoSystem /// GetCargoPallets(gridUid, BuySellType.Sell) to return only Sell pads /// GetCargoPallets(gridUid, BuySellType.Buy) to return only Buy pads - private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets(EntityUid gridUid, BuySellType requestType = BuySellType.All) + private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets( + EntityUid gridUid, BuySellType requestType = BuySellType.All) { _pads.Clear(); @@ -199,7 +227,6 @@ public sealed partial class CargoSystem } _pads.Add((uid, comp, compXform)); - } return _pads; @@ -215,7 +242,8 @@ public sealed partial class CargoSystem foreach (var pallet in pallets) { - var aabb = _lookup.GetAABBNoContainer(pallet.Entity, pallet.Transform.LocalPosition, pallet.Transform.LocalRotation); + var aabb = _lookup.GetAABBNoContainer(pallet.Entity, pallet.Transform.LocalPosition, + pallet.Transform.LocalRotation); if (_lookup.AnyLocalEntitiesIntersecting(gridUid, aabb, LookupFlags.Dynamic)) continue; @@ -325,7 +353,7 @@ public sealed partial class CargoSystem if (xform.GridUid is not EntityUid gridUid) { _uiSystem.SetUiState(bui, - new CargoPalletConsoleInterfaceState(0, 0, false)); + new CargoPalletConsoleInterfaceState(0, 0, false)); return; } @@ -333,7 +361,7 @@ public sealed partial class CargoSystem return; var stackPrototype = _protoMan.Index(component.CashType); - _stack.Spawn((int) price, stackPrototype, xform.Coordinates); + _stack.Spawn((int)price, stackPrototype, xform.Coordinates); _audio.PlayPvs(ApproveSound, uid); UpdatePalletConsoleInterface(uid); } @@ -343,6 +371,64 @@ public sealed partial class CargoSystem private void OnRoundRestart(RoundRestartCleanupEvent ev) { Reset(); + CleanupTradeStation(); + } + + private void OnStationInitialize(StationInitializedEvent args) + { + if (!HasComp(args.Station)) + return; + + if (_cfgManager.GetCVar(CCVars.GridFill)) + SetupTradeStation(); + } + + private void SetupTradeStation() + { + if (TradeStationMap.HasValue && _mapManager.MapExists(TradeStationMap.Value)) + { + return; + } + + TradeStationMap = _mapManager.CreateMap(); + + var loadOptions = new MapLoadOptions + { + LoadMap = true, + }; + + if (!_mapLoader.TryLoad(TradeStationMap.Value, TradeStationMapPath, out _, loadOptions)) + { + return; + } + + var mapUid = _mapManager.GetMapEntityId(TradeStationMap.Value); + var ftl = EnsureComp(mapUid); + ftl.Whitelist = new EntityWhitelist + { + Components = + [ + _factory.GetComponentName(typeof(CargoShuttleComponent)) + ] + }; + + _metaSystem.SetEntityName(mapUid, $"Торговая Станция {_random.Next(1000):000}"); + _console.RefreshShuttleConsoles(); + } + + private void CleanupTradeStation() + { + if (!TradeStationMap.HasValue) + { + return; + } + + if (_mapManager.MapExists(TradeStationMap.Value)) + { + _mapManager.DeleteMap(TradeStationMap.Value); + } + + TradeStationMap = null; } } @@ -351,4 +437,4 @@ public sealed partial class CargoSystem /// deleted but after the price has been calculated. /// [ByRefEvent] -public readonly record struct EntitySoldEvent(HashSet Sold); +public readonly record struct EntitySoldEvent(HashSet Sold); \ No newline at end of file diff --git a/Content.Server/Cargo/Systems/CargoSystem.cs b/Content.Server/Cargo/Systems/CargoSystem.cs index f6109570ac..5d377553dc 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.cs @@ -7,6 +7,7 @@ using Content.Server.Shuttles.Systems; using Content.Server.Stack; using Content.Server.Station.Systems; using Content.Server._White.Economy; +using Content.Server.GameTicking; using Content.Shared.Access.Systems; using Content.Shared.Administration.Logs; using Content.Shared.Cargo; @@ -16,6 +17,8 @@ using Content.Shared.Mobs.Components; 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; @@ -44,6 +47,11 @@ public sealed partial class CargoSystem : SharedCargoSystem [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; [Dependency] private readonly MetaDataSystem _metaSystem = default!; [Dependency] private readonly BankCardSystem _bankCard = default!; // WD + [Dependency] private readonly IConfigurationManager _cfgManager = default!; // WD + [Dependency] private readonly IMapManager _mapManager = default!; // WD + [Dependency] private readonly IComponentFactory _factory = default!; // WD + [Dependency] private readonly MapLoaderSystem _mapLoader = default!; // WD + [Dependency] private readonly GameTicker _ticker = default!; // WD private EntityQuery _xformQuery; private EntityQuery _blacklistQuery; diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 1ba1358a83..6041e31826 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -233,7 +233,7 @@ namespace Content.Shared.CCVar /// Whether a random position offset will be applied to the station on roundstart. /// public static readonly CVarDef StationOffset = - CVarDef.Create("game.station_offset", true); + CVarDef.Create("game.station_offset", false); /// /// When the default blueprint is loaded what is the maximum amount it can be offset from 0,0. @@ -246,7 +246,7 @@ namespace Content.Shared.CCVar /// Whether a random rotation will be applied to the station on roundstart. /// public static readonly CVarDef StationRotation = - CVarDef.Create("game.station_rotation", true); + CVarDef.Create("game.station_rotation", false); /// /// When enabled, guests will be assigned permanent UIDs and will have their preferences stored. diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml index f040d58253..50ba19f31e 100644 --- a/Resources/Maps/Shuttles/trading_outpost.yml +++ b/Resources/Maps/Shuttles/trading_outpost.yml @@ -23,7 +23,7 @@ entities: - uid: 2 components: - type: MetaData - name: Automated Trade Station + name: Автономная Торговая Станция - type: Transform pos: -2.9375,-1.625 parent: invalid @@ -382,6 +382,11 @@ entities: chunkSize: 4 - type: GasTileOverlay - type: RadiationGridResistance + - type: ProtectedGrid + - type: TradeStation + - type: Shuttle + linearDamping: 10000 + angularDamping: 10000 - proto: AirAlarm entities: - uid: 802 diff --git a/Resources/Prototypes/Entities/Stations/base.yml b/Resources/Prototypes/Entities/Stations/base.yml index da5875d2bc..07b3f161a3 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