6
2026-01-24 12:49:55 +03:00

77 lines
2.5 KiB
C#

using Content.Server.CartridgeLoader;
using Content.Shared.CartridgeLoader;
using Content.Server._NF.SectorServices;
using Content.Shared._NF.Bank.BUI;
using System.Diagnostics.CodeAnalysis;
using Content.Server._NF.Bank;
namespace Content.Server._NF.CartridgeLoader.Cartridges;
// System for ledger cartridges - pushes updates to PDA UI when ledger is updated.
public sealed class NFLedgerCartridgeSystem : EntitySystem
{
[Dependency] private readonly CartridgeLoaderSystem _cartridgeLoader = default!;
[Dependency] private readonly SectorServiceSystem _sectorService = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<NFLedgerCartridgeComponent, CartridgeUiReadyEvent>(OnUiReady);
SubscribeLocalEvent<SectorLedgerUpdatedEvent>(OnSectorLedgerUpdated);
}
private void OnUiReady(Entity<NFLedgerCartridgeComponent> ent, ref CartridgeUiReadyEvent args)
{
if (GetUIState(out var uiState))
UpdateUI(args.Loader, uiState);
}
private void OnSectorLedgerUpdated(SectorLedgerUpdatedEvent args)
{
UpdateAllCartridges();
}
private void UpdateAllCartridges()
{
var query = EntityQueryEnumerator<NFLedgerCartridgeComponent, CartridgeComponent>();
if (!GetUIState(out var uiState))
return;
while (query.MoveNext(out _, out _, out var cartridge))
{
if (cartridge.LoaderUid is not { } loader)
continue;
UpdateUI(loader, uiState);
}
}
private bool GetUIState([NotNullWhen(true)] out NFLedgerState? uiState)
{
uiState = null;
if (!TryComp(_sectorService.GetServiceEntity(), out SectorBankComponent? ledger))
return false;
var ledgerCount = ledger.AccountLedgerEntries.Count;
NFLedgerEntry[] entries = new NFLedgerEntry[ledgerCount];
var index = 0;
foreach (var ledgerEntry in ledger.AccountLedgerEntries)
{
// Bounds check, just to be sure.
if (index >= ledgerCount)
break;
entries[index].Account = ledgerEntry.Key.Account;
entries[index].Type = ledgerEntry.Key.Type;
entries[index].Amount = ledgerEntry.Value;
index++;
}
uiState = new NFLedgerState(entries);
return true;
}
private void UpdateUI(EntityUid loader, NFLedgerState state)
{
_cartridgeLoader.UpdateCartridgeUiState(loader, state);
}
}