Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Jabak
2024-06-29 00:41:48 +03:00
12 changed files with 204 additions and 50 deletions

View File

@@ -100,7 +100,8 @@ namespace Content.Server.Cargo.Systems
#region Interface #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) if (args.Session.AttachedEntity is not { Valid: true } player)
return; return;
@@ -184,7 +185,9 @@ namespace Content.Server.Cargo.Systems
order.SetApproverData(idCard.Comp?.FullName, idCard.Comp?.JobTitle); order.SetApproverData(idCard.Comp?.FullName, idCard.Comp?.JobTitle);
_audio.PlayPvs(component.ConfirmSound, uid); _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 // Log order approval
_adminLogger.Add(LogType.Action, LogImpact.Low, _adminLogger.Add(LogType.Action, LogImpact.Low,
@@ -195,7 +198,8 @@ namespace Content.Server.Cargo.Systems
UpdateOrders(station.Value, orderDatabase); 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 // No slots at the trade station
_listEnts.Clear(); _listEnts.Clear();
@@ -219,7 +223,8 @@ namespace Content.Server.Cargo.Systems
{ {
tradeDestination = trade; tradeDestination = trade;
order.NumDispatched++; 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; break;
} }
} }
@@ -234,16 +239,15 @@ namespace Content.Server.Cargo.Systems
private void GetTradeStations(StationDataComponent data, ref List<EntityUid> ents) private void GetTradeStations(StationDataComponent data, ref List<EntityUid> ents)
{ {
foreach (var gridUid in data.Grids) var tradeStationQuery = AllEntityQuery<TradeStationComponent>();
while (tradeStationQuery.MoveNext(out var uid, out _))
{ {
if (!_tradeQuery.HasComponent(gridUid)) ents.Add(uid);
continue;
ents.Add(gridUid);
} }
} }
private void OnRemoveOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, CargoConsoleRemoveOrderMessage args) private void OnRemoveOrderMessage(EntityUid uid, CargoOrderConsoleComponent component,
CargoConsoleRemoveOrderMessage args)
{ {
var station = _station.GetOwningStation(uid); var station = _station.GetOwningStation(uid);
@@ -253,7 +257,8 @@ namespace Content.Server.Cargo.Systems
RemoveOrder(station.Value, args.OrderId, orderDatabase); 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) if (args.Session.AttachedEntity is not { Valid: true } player)
return; return;
@@ -286,7 +291,6 @@ namespace Content.Server.Cargo.Systems
// Log order addition // Log order addition
_adminLogger.Add(LogType.Action, LogImpact.Low, _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}]"); $"{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) 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); _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) public static int GetOutstandingOrderCount(StationCargoOrderDatabaseComponent component)
@@ -422,6 +428,7 @@ namespace Content.Server.Cargo.Systems
{ {
orderDB.Orders.RemoveAt(sequenceIdx); orderDB.Orders.RemoveAt(sequenceIdx);
} }
UpdateOrders(dbUid, orderDB); UpdateOrders(dbUid, orderDB);
} }
@@ -433,7 +440,8 @@ namespace Content.Server.Cargo.Systems
component.Orders.Clear(); 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); var orderIdx = orderDB.Orders.FindIndex(order => order.Approved);
if (orderIdx == -1) if (orderIdx == -1)
@@ -450,13 +458,15 @@ namespace Content.Server.Cargo.Systems
// Order is complete. Remove from the queue. // Order is complete. Remove from the queue.
orderDB.Orders.RemoveAt(orderIdx); orderDB.Orders.RemoveAt(orderIdx);
} }
return true; return true;
} }
/// <summary> /// <summary>
/// Tries to fulfill the next outstanding order. /// Tries to fulfill the next outstanding order.
/// </summary> /// </summary>
private bool FulfillNextOrder(StationCargoOrderDatabaseComponent orderDB, EntityCoordinates spawn, string? paperProto) private bool FulfillNextOrder(StationCargoOrderDatabaseComponent orderDB, EntityCoordinates spawn,
string? paperProto)
{ {
if (!PopFrontOrder(orderDB, out var order)) if (!PopFrontOrder(orderDB, out var order))
return false; return false;
@@ -497,7 +507,6 @@ namespace Content.Server.Cargo.Systems
} }
return true; return true;
} }
private void DeductFunds(StationBankAccountComponent component, int amount) private void DeductFunds(StationBankAccountComponent component, int amount)
@@ -507,7 +516,8 @@ namespace Content.Server.Cargo.Systems
#region Station #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); return TryComp(stationUid, out dbComp);
} }

View File

@@ -1,12 +1,17 @@
using Content.Server.Cargo.Components; using Content.Server.Cargo.Components;
using Content.Server.GameTicking;
using Content.Server.Station.Systems;
using Content.Shared.Stacks; using Content.Shared.Stacks;
using Content.Shared.Cargo; using Content.Shared.Cargo;
using Content.Shared.Cargo.BUI; using Content.Shared.Cargo.BUI;
using Content.Shared.Cargo.Components; using Content.Shared.Cargo.Components;
using Content.Shared.Cargo.Events; using Content.Shared.Cargo.Events;
using Content.Shared.CCVar;
using Content.Shared.GameTicking; using Content.Shared.GameTicking;
using Content.Shared.Shuttles.Components;
using Content.Shared.Whitelist;
using Robust.Server.Maps;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Random;
using Robust.Shared.Audio; using Robust.Shared.Audio;
namespace Content.Server.Cargo.Systems; namespace Content.Server.Cargo.Systems;
@@ -16,9 +21,12 @@ public sealed partial class CargoSystem
/* /*
* Handles cargo shuttle / trade mechanics. * Handles cargo shuttle / trade mechanics.
*/ */
private MapId? TradeStationMap { get; set; }
private static readonly SoundPathSpecifier ApproveSound = new("/Audio/Effects/Cargo/ping.ogg"); private static readonly SoundPathSpecifier ApproveSound = new("/Audio/Effects/Cargo/ping.ogg");
private const string TradeStationMapPath = "/Maps/Shuttles/trading_outpost.yml";
private void InitializeShuttle() private void InitializeShuttle()
{ {
SubscribeLocalEvent<TradeStationComponent, GridSplitEvent>(OnTradeSplit); SubscribeLocalEvent<TradeStationComponent, GridSplitEvent>(OnTradeSplit);
@@ -30,6 +38,17 @@ public sealed partial class CargoSystem
SubscribeLocalEvent<CargoPalletConsoleComponent, BoundUIOpenedEvent>(OnPalletUIOpen); SubscribeLocalEvent<CargoPalletConsoleComponent, BoundUIOpenedEvent>(OnPalletUIOpen);
SubscribeLocalEvent<RoundRestartCleanupEvent>(OnRoundRestart); SubscribeLocalEvent<RoundRestartCleanupEvent>(OnRoundRestart);
SubscribeLocalEvent<StationInitializedEvent>(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 #region Console
@@ -61,6 +80,7 @@ public sealed partial class CargoSystem
new CargoPalletConsoleInterfaceState(0, 0, false)); new CargoPalletConsoleInterfaceState(0, 0, false));
return; return;
} }
GetPalletGoods(gridUid, out var toSell, out var amount); GetPalletGoods(gridUid, out var toSell, out var amount);
_uiSystem.SetUiState(bui, _uiSystem.SetUiState(bui,
new CargoPalletConsoleInterfaceState((int)amount, toSell.Count, true)); new CargoPalletConsoleInterfaceState((int)amount, toSell.Count, true));
@@ -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 /// 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 /// known for their entity spam i wouldnt put it past them
/// </summary> /// </summary>
private void OnPalletAppraise(EntityUid uid, CargoPalletConsoleComponent component, CargoPalletAppraiseMessage args) private void OnPalletAppraise(EntityUid uid, CargoPalletConsoleComponent component, CargoPalletAppraiseMessage args)
{ {
var player = args.Session.AttachedEntity; var player = args.Session.AttachedEntity;
@@ -94,7 +113,8 @@ public sealed partial class CargoSystem
UpdatePalletConsoleInterface(uid); 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); var station = _station.GetOwningStation(uid);
UpdateShuttleState(uid, station); UpdateShuttleState(uid, station);
@@ -106,12 +126,18 @@ public sealed partial class CargoSystem
TryComp<CargoShuttleComponent>(orderDatabase?.Shuttle, out var shuttle); TryComp<CargoShuttleComponent>(orderDatabase?.Shuttle, out var shuttle);
var orders = GetProjectedOrders(station ?? EntityUid.Invalid, orderDatabase, 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)) if (_uiSystem.TryGetUi(uid, CargoConsoleUiKey.Shuttle, out var bui))
_uiSystem.SetUiState(bui, new CargoShuttleConsoleBoundUserInterfaceState( _uiSystem.SetUiState(bui, new CargoShuttleConsoleBoundUserInterfaceState(
station != null ? MetaData(station.Value).EntityName : Loc.GetString("cargo-shuttle-console-station-unknown"), station != null
string.IsNullOrEmpty(shuttleName) ? Loc.GetString("cargo-shuttle-console-shuttle-not-found") : shuttleName, ? MetaData(station.Value).EntityName
: Loc.GetString("cargo-shuttle-console-station-unknown"),
string.IsNullOrEmpty(shuttleName)
? Loc.GetString("cargo-shuttle-console-shuttle-not-found")
: shuttleName,
orders orders
)); ));
} }
@@ -161,6 +187,7 @@ public sealed partial class CargoSystem
{ {
orders.Add(order); orders.Add(order);
} }
spaceRemaining -= numToShip; spaceRemaining -= numToShip;
} }
} }
@@ -179,7 +206,8 @@ public sealed partial class CargoSystem
/// GetCargoPallets(gridUid, BuySellType.Sell) to return only Sell pads /// GetCargoPallets(gridUid, BuySellType.Sell) to return only Sell pads
/// GetCargoPallets(gridUid, BuySellType.Buy) to return only Buy 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(); _pads.Clear();
@@ -199,7 +227,6 @@ public sealed partial class CargoSystem
} }
_pads.Add((uid, comp, compXform)); _pads.Add((uid, comp, compXform));
} }
return _pads; return _pads;
@@ -215,7 +242,8 @@ public sealed partial class CargoSystem
foreach (var pallet in pallets) 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)) if (_lookup.AnyLocalEntitiesIntersecting(gridUid, aabb, LookupFlags.Dynamic))
continue; continue;
@@ -343,6 +371,64 @@ public sealed partial class CargoSystem
private void OnRoundRestart(RoundRestartCleanupEvent ev) private void OnRoundRestart(RoundRestartCleanupEvent ev)
{ {
Reset(); Reset();
CleanupTradeStation();
}
private void OnStationInitialize(StationInitializedEvent args)
{
if (!HasComp<StationCargoOrderDatabaseComponent>(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<FTLDestinationComponent>(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;
} }
} }

View File

@@ -7,6 +7,7 @@ using Content.Server.Shuttles.Systems;
using Content.Server.Stack; using Content.Server.Stack;
using Content.Server.Station.Systems; using Content.Server.Station.Systems;
using Content.Server._White.Economy; using Content.Server._White.Economy;
using Content.Server.GameTicking;
using Content.Shared.Access.Systems; using Content.Shared.Access.Systems;
using Content.Shared.Administration.Logs; using Content.Shared.Administration.Logs;
using Content.Shared.Cargo; using Content.Shared.Cargo;
@@ -16,6 +17,8 @@ using Content.Shared.Mobs.Components;
using JetBrains.Annotations; using JetBrains.Annotations;
using Robust.Server.GameObjects; using Robust.Server.GameObjects;
using Robust.Shared.Audio.Systems; using Robust.Shared.Audio.Systems;
using Robust.Shared.Configuration;
using Robust.Shared.Map;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Timing; using Robust.Shared.Timing;
using Robust.Shared.Random; using Robust.Shared.Random;
@@ -44,6 +47,11 @@ public sealed partial class CargoSystem : SharedCargoSystem
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
[Dependency] private readonly MetaDataSystem _metaSystem = default!; [Dependency] private readonly MetaDataSystem _metaSystem = default!;
[Dependency] private readonly BankCardSystem _bankCard = default!; // WD [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<TransformComponent> _xformQuery; private EntityQuery<TransformComponent> _xformQuery;
private EntityQuery<CargoSellBlacklistComponent> _blacklistQuery; private EntityQuery<CargoSellBlacklistComponent> _blacklistQuery;

View File

@@ -37,5 +37,19 @@ namespace Content.Server.Tabletop.Components
/// </summary> /// </summary>
[ViewVariables] [ViewVariables]
public TabletopSession? Session { get; set; } = null; public TabletopSession? Session { get; set; } = null;
// Skyedra Fix start
/// <summary>
/// How many holograms have been spawned onto this board.
/// </summary>
[ViewVariables]
public int HologramsSpawned { get; set; } = 0;
/// <summary>
/// How many holograms are allowed to be spawned total by players.
/// </summary>
[ViewVariables]
public int MaximumHologramsAllowed { get; set; } = 10;
// Skyedra Fix end
} }
} }

View File

@@ -68,6 +68,9 @@ namespace Content.Server.Tabletop
// Find the entity, remove it from the session and set it's position to the tabletop // Find the entity, remove it from the session and set it's position to the tabletop
session.Entities.TryGetValue(entity, out var result); session.Entities.TryGetValue(entity, out var result);
session.Entities.Remove(result); session.Entities.Remove(result);
tabletop.HologramsSpawned--; // White Dream fix
QueueDel(result); QueueDel(result);
} }
@@ -90,6 +93,16 @@ namespace Content.Server.Tabletop
if (!TryComp<ItemComponent>(handEnt, out var item)) if (!TryComp<ItemComponent>(handEnt, out var item))
return; return;
// Skye hotfix to prevent people from infinitely spawning mice on the board games and crashing server.
if (component.HologramsSpawned >= component.MaximumHologramsAllowed)
{
_popupSystem.PopupEntity(Loc.GetString("tabletop-max-entities"), uid, args.User);
return;
}
component.HologramsSpawned++;
// Skye hotfix end
var meta = MetaData(handEnt); var meta = MetaData(handEnt);
var protoId = meta.EntityPrototype?.ID; var protoId = meta.EntityPrototype?.ID;

View File

@@ -233,7 +233,7 @@ namespace Content.Shared.CCVar
/// Whether a random position offset will be applied to the station on roundstart. /// Whether a random position offset will be applied to the station on roundstart.
/// </summary> /// </summary>
public static readonly CVarDef<bool> StationOffset = public static readonly CVarDef<bool> StationOffset =
CVarDef.Create("game.station_offset", true); CVarDef.Create("game.station_offset", false);
/// <summary> /// <summary>
/// When the default blueprint is loaded what is the maximum amount it can be offset from 0,0. /// 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. /// Whether a random rotation will be applied to the station on roundstart.
/// </summary> /// </summary>
public static readonly CVarDef<bool> StationRotation = public static readonly CVarDef<bool> StationRotation =
CVarDef.Create("game.station_rotation", true); CVarDef.Create("game.station_rotation", false);
/// <summary> /// <summary>
/// When enabled, guests will be assigned permanent UIDs and will have their preferences stored. /// When enabled, guests will be assigned permanent UIDs and will have their preferences stored.

View File

@@ -5028,3 +5028,23 @@
id: 330 id: 330
time: '2024-06-27T20:54:09.0000000+00:00' time: '2024-06-27T20:54:09.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/387 url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/387
- author: ThereDrD
changes:
- message: "\u0418\u043D\u0445\u0435\u043D\u0434\u044B \u0434\u0440\u043E\u0431\u043E\
\u0432\u0438\u043A\u043E\u0432 \u0432\u0435\u0440\u043D\u0443\u043B\u0438\u0441\
\u044C"
type: Fix
id: 331
time: '2024-06-28T09:43:09.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/390
- author: Remuchi
changes:
- message: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\
\u0430\u044F \u0442\u043E\u0440\u0433\u043E\u0432\u0430\u044F \u0441\u0442\u0430\
\u043D\u0446\u0438\u044F \u0432\u044B\u043D\u0435\u0441\u0435\u043D\u0430 \u043D\
\u0430 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u0443\u044E \u043A\u0430\u0440\
\u0442\u0443."
type: Add
id: 332
time: '2024-06-28T12:23:19.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/391

View File

@@ -4,6 +4,7 @@ tabletop-verb-dump-pieces = Dump Pieces
tabletop-default-board-name = Board Game tabletop-default-board-name = Board Game
tabletop-error-remove-non-hologram = You cant remove a built in piece! tabletop-error-remove-non-hologram = You cant remove a built in piece!
tabletop-added-piece = The board shimmers brightly! tabletop-added-piece = The board shimmers brightly!
tabletop-max-entities = Maximum number of holograms placed.
## Chess ## Chess
tabletop-chess-board-name = Chess tabletop-chess-board-name = Chess

View File

@@ -5,6 +5,7 @@ tabletop-verb-dump-pieces = Сбросить куски
tabletop-default-board-name = Настольная игра tabletop-default-board-name = Настольная игра
tabletop-error-remove-non-hologram = Вы не можете удалить встроенный элемент! tabletop-error-remove-non-hologram = Вы не можете удалить встроенный элемент!
tabletop-added-piece = Доска ярко переливается! tabletop-added-piece = Доска ярко переливается!
tabletop-max-entities = Максимальное количество голограмм уже поставлено.
## Chess ## Chess

View File

@@ -23,7 +23,7 @@ entities:
- uid: 2 - uid: 2
components: components:
- type: MetaData - type: MetaData
name: Automated Trade Station name: Автономная Торговая Станция
- type: Transform - type: Transform
pos: -2.9375,-1.625 pos: -2.9375,-1.625
parent: invalid parent: invalid
@@ -382,6 +382,11 @@ entities:
chunkSize: 4 chunkSize: 4
- type: GasTileOverlay - type: GasTileOverlay
- type: RadiationGridResistance - type: RadiationGridResistance
- type: ProtectedGrid
- type: TradeStation
- type: Shuttle
linearDamping: 10000
angularDamping: 10000
- proto: AirAlarm - proto: AirAlarm
entities: entities:
- uid: 802 - uid: 802

View File

@@ -10,7 +10,6 @@
- state: icon - state: icon
map: [ "enum.GunVisualLayers.Base" ] map: [ "enum.GunVisualLayers.Base" ]
- type: Item - type: Item
# If you update this also update the bulldog's size.
size: Large size: Large
- type: Clothing - type: Clothing
sprite: Objects/Weapons/Guns/Shotguns/db_shotgun.rsi sprite: Objects/Weapons/Guns/Shotguns/db_shotgun.rsi
@@ -52,6 +51,7 @@
- type: EmitSoundOnLand - type: EmitSoundOnLand
sound: sound:
collection: ShotgunsDrop collection: ShotgunsDrop
- type: Appearance
- type: entity - type: entity
@@ -126,7 +126,6 @@
shape: shape:
- 0,0,4,0 - 0,0,4,0
sprite: White/Objects/Weapons/Guns/Shotguns/db_shotgun-inhands.rsi sprite: White/Objects/Weapons/Guns/Shotguns/db_shotgun-inhands.rsi
heldPrefix: db
- type: Gun - type: Gun
fireRate: 2 fireRate: 2
- type: BallisticAmmoProvider - type: BallisticAmmoProvider
@@ -159,7 +158,6 @@
sprite: White/Objects/Weapons/Guns/Shotguns/enforcer-inhands.rsi sprite: White/Objects/Weapons/Guns/Shotguns/enforcer-inhands.rsi
- type: Item - type: Item
sprite: White/Objects/Weapons/Guns/Shotguns/enforcer-inhands.rsi sprite: White/Objects/Weapons/Guns/Shotguns/enforcer-inhands.rsi
heldPrefix: enforcer
- type: BallisticAmmoProvider - type: BallisticAmmoProvider
- type: entity - type: entity
@@ -177,11 +175,10 @@
description: When an old Remington design meets modern materials, this is the result. A favourite weapon of militia forces throughout many worlds. Uses .50 shotgun shells. description: When an old Remington design meets modern materials, this is the result. A favourite weapon of militia forces throughout many worlds. Uses .50 shotgun shells.
components: components:
- type: Item - type: Item
sprite: White/Objects/Weapons/Guns/Shotguns/pump-inhands.rsi
size: Normal size: Normal
shape: shape:
- 0,0,4,0 - 0,0,4,0
sprite: White/Objects/Weapons/Guns/Shotguns/pump-inhands.rsi
heldPrefix: pump
- type: Sprite - type: Sprite
sprite: White/Objects/Weapons/Guns/Shotguns/pump-icons.rsi sprite: White/Objects/Weapons/Guns/Shotguns/pump-icons.rsi
- type: Clothing - type: Clothing
@@ -289,7 +286,6 @@
shape: shape:
- 0,0,4,0 - 0,0,4,0
sprite: White/Objects/Weapons/Guns/Shotguns/improvised_shotgun-inhands.rsi sprite: White/Objects/Weapons/Guns/Shotguns/improvised_shotgun-inhands.rsi
heldPrefix: improvised
- type: Gun - type: Gun
fireRate: 4 #No reason to stifle the firerate since you have to manually reload every time anyways. fireRate: 4 #No reason to stifle the firerate since you have to manually reload every time anyways.
- type: BallisticAmmoProvider - type: BallisticAmmoProvider

View File

@@ -46,12 +46,12 @@
path: /Maps/Shuttles/cargo.yml path: /Maps/Shuttles/cargo.yml
- type: GridSpawn - type: GridSpawn
groups: groups:
trade: # trade:
addComponents: # addComponents:
- type: ProtectedGrid # - type: ProtectedGrid
- type: TradeStation # - type: TradeStation
paths: # paths:
- /Maps/Shuttles/trading_outpost.yml # - /Maps/Shuttles/trading_outpost.yml
mining: mining:
paths: paths:
- /Maps/Shuttles/mining.yml - /Maps/Shuttles/mining.yml