Files
tbd-station-14/Content.Server/StationEvents/Events/CargoGiftsRule.cs
2025-08-08 11:22:34 -04:00

91 lines
3.1 KiB
C#

using System.Linq;
using Content.Server.Cargo.Components;
using Content.Server.Cargo.Systems;
using Content.Server.GameTicking;
using Content.Server.StationEvents.Components;
using Content.Shared.GameTicking.Components;
using Content.Shared.Station.Components;
using Robust.Shared.Prototypes;
namespace Content.Server.StationEvents.Events;
public sealed class CargoGiftsRule : StationEventSystem<CargoGiftsRuleComponent>
{
[Dependency] private readonly CargoSystem _cargoSystem = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly GameTicker _ticker = default!;
protected override void Added(EntityUid uid, CargoGiftsRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args)
{
if (!TryComp<StationEventComponent>(uid, out var stationEvent))
return;
var str = Loc.GetString(component.Announce,
("sender", Loc.GetString(component.Sender)), ("description", Loc.GetString(component.Description)), ("dest", Loc.GetString(component.Dest)));
stationEvent.StartAnnouncement = str;
base.Added(uid, component, gameRule, args);
}
/// <summary>
/// Called on an active gamerule entity in the Update function
/// </summary>
protected override void ActiveTick(EntityUid uid, CargoGiftsRuleComponent component, GameRuleComponent gameRule, float frameTime)
{
if (component.Gifts.Count == 0)
return;
if (component.TimeUntilNextGifts > 0)
{
component.TimeUntilNextGifts -= frameTime;
return;
}
component.TimeUntilNextGifts += 30f;
if (!TryGetRandomStation(out var station, HasComp<StationCargoOrderDatabaseComponent>) ||
!TryComp<StationDataComponent>(station, out var stationData))
return;
if (!TryComp<StationCargoOrderDatabaseComponent>(station, out var cargoDb))
{
return;
}
// Add some presents
var outstanding = _cargoSystem.GetOutstandingOrderCount((station.Value, cargoDb), component.Account);
while (outstanding < cargoDb.Capacity - component.OrderSpaceToLeave && component.Gifts.Count > 0)
{
// I wish there was a nice way to pop this
var (productId, qty) = component.Gifts.First();
component.Gifts.Remove(productId);
var product = _prototypeManager.Index(productId);
if (!_cargoSystem.AddAndApproveOrder(
station!.Value,
product.Product,
product.Name,
product.Cost,
qty,
Loc.GetString(component.Sender),
Loc.GetString(component.Description),
Loc.GetString(component.Dest),
cargoDb,
component.Account,
(station.Value, stationData)
))
{
break;
}
}
if (component.Gifts.Count == 0)
{
// We're done here!
_ticker.EndGameRule(uid, gameRule);
}
}
}