using Content.Server.Store.Systems; using Content.Shared.Hands.EntitySystems; using Content.Shared.Inventory; using Content.Shared.PDA; using Content.Server.Store.Components; using Content.Shared.FixedPoint; namespace Content.Server.Traitor.Uplink { public sealed class UplinkSystem : EntitySystem { [Dependency] private readonly InventorySystem _inventorySystem = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly StoreSystem _store = default!; public const string TelecrystalCurrencyPrototype = "Telecrystal"; /// /// Gets the amount of TC on an "uplink" /// Mostly just here for legacy systems based on uplink. /// /// /// the amount of TC public int GetTCBalance(StoreComponent component) { FixedPoint2? tcBalance = component.Balance.GetValueOrDefault(TelecrystalCurrencyPrototype); return tcBalance?.Int() ?? 0; } /// /// Adds an uplink to the target /// /// The person who is getting the uplink /// The amount of currency on the uplink. If null, will just use the amount specified in the preset. /// The id of the storepreset /// The entity that will actually have the uplink functionality. Defaults to the PDA if null. /// Whether or not the uplink was added successfully public bool AddUplink(EntityUid user, FixedPoint2? balance, string uplinkPresetId = "StorePresetUplink", EntityUid? uplinkEntity = null) { // Try to find target item if (uplinkEntity == null) { uplinkEntity = FindUplinkTarget(user); if (uplinkEntity == null) return false; } var store = EnsureComp(uplinkEntity.Value); _store.InitializeFromPreset(uplinkPresetId, uplinkEntity.Value, store); store.AccountOwner = user; store.Balance.Clear(); if (balance != null) { store.Balance.Clear(); _store.TryAddCurrency(new Dictionary { { TelecrystalCurrencyPrototype, balance.Value } }, uplinkEntity.Value, store); } // TODO add BUI. Currently can't be done outside of yaml -_- return true; } /// /// Finds the entity that can hold an uplink for a user. /// Usually this is a pda in their pda slot, but can also be in their hands. (but not pockets or inside bag, etc.) /// public EntityUid? FindUplinkTarget(EntityUid user) { // Try to find PDA in inventory if (_inventorySystem.TryGetContainerSlotEnumerator(user, out var containerSlotEnumerator)) { while (containerSlotEnumerator.MoveNext(out var pdaUid)) { if (!pdaUid.ContainedEntity.HasValue) continue; if (HasComp(pdaUid.ContainedEntity.Value) || HasComp(pdaUid.ContainedEntity.Value)) return pdaUid.ContainedEntity.Value; } } // Also check hands foreach (var item in _handsSystem.EnumerateHeld(user)) { if (HasComp(item) || HasComp(item)) return item; } return null; } } }