using System.Collections.Generic; using System.Linq; using Content.Server.GameObjects; using Content.Server.GameObjects.Components; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Mobs; using Content.Server.Interfaces.PDA; using Content.Shared.GameObjects.Components.PDA; using Content.Shared.Prototypes.PDA; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Prototypes; namespace Content.Server.PDA { public class PDAUplinkManager : IPDAUplinkManager { #pragma warning disable 649 [Dependency] private readonly IPrototypeManager _prototypeManager; [Dependency] private readonly IEntityManager _entityManager; #pragma warning restore 649 private List _accounts; private List _listings; public IReadOnlyList FetchListings => _listings; public void Initialize() { _listings = new List(); foreach (var item in _prototypeManager.EnumeratePrototypes()) { var newListing = new UplinkListingData(item.ListingName, item.ItemId, item.Price, item.Category, item.Description); RegisterUplinkListing(newListing); } _accounts = new List(); } private void RegisterUplinkListing(UplinkListingData listing) { if (!ContainsListing(listing)) { _listings.Add(listing); } } private bool ContainsListing(UplinkListingData listing) { return _listings.Any(otherListing => listing.Equals(otherListing)); } public bool AddNewAccount(UplinkAccount acc) { var entity = _entityManager.GetEntity(acc.AccountHolder); if (entity.TryGetComponent(out MindComponent mindComponent)) { if (mindComponent.Mind.AllRoles.Any(role => !role.Antagonist)) { return false; } } if (_accounts.Contains(acc)) { return false; } _accounts.Add(acc); return true; } public bool ChangeBalance(UplinkAccount acc, int amt) { var account = _accounts.Find(uplinkAccount => uplinkAccount.AccountHolder == acc.AccountHolder); if (account != null && account.Balance + amt < 0) { return false; } account.ModifyAccountBalance(account.Balance + amt); return true; } public bool TryPurchaseItem(UplinkAccount acc, UplinkListingData listing) { if (acc == null || listing == null) { return false; } if (!ContainsListing(listing) || acc.Balance < listing.Price) { return false; } if (!ChangeBalance(acc, -listing.Price)) { return false; } var player = _entityManager.GetEntity(acc.AccountHolder); var hands = player.GetComponent(); hands.PutInHandOrDrop(_entityManager.SpawnEntity(listing.ItemId, player.Transform.GridPosition).GetComponent()); return true; } } }