diff --git a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs index 0139761d21..2c7aad758e 100644 --- a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs +++ b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs @@ -198,14 +198,33 @@ namespace Content.Server.GameObjects.Components.GUI return success; } + /// + /// Drops the item if doesn't have hands. + /// + public static void PutInHandOrDropStatic(IEntity mob, ItemComponent item, bool mobCheck = true) + { + if (!mob.TryGetComponent(out HandsComponent? hands)) + { + DropAtFeet(mob, item); + return; + } + + hands.PutInHandOrDrop(item, mobCheck); + } + public void PutInHandOrDrop(ItemComponent item, bool mobCheck = true) { if (!PutInHand(item, mobCheck)) { - item.Owner.Transform.Coordinates = Owner.Transform.Coordinates; + DropAtFeet(Owner, item); } } + private static void DropAtFeet(IEntity mob, ItemComponent item) + { + item.Owner.Transform.Coordinates = mob.Transform.Coordinates; + } + public bool CanPutInHand(ItemComponent item, bool mobCheck = true) { if (mobCheck && !ActionBlockerSystem.CanPickup(Owner)) diff --git a/Content.Server/GameObjects/Components/PDA/PDAComponent.cs b/Content.Server/GameObjects/Components/PDA/PDAComponent.cs index efd7c1da4b..cf65690de8 100644 --- a/Content.Server/GameObjects/Components/PDA/PDAComponent.cs +++ b/Content.Server/GameObjects/Components/PDA/PDAComponent.cs @@ -135,12 +135,20 @@ namespace Content.Server.GameObjects.Components.PDA case PDAUplinkBuyListingMessage buyMsg: { - if (!_uplinkManager.TryPurchaseItem(_syndicateUplinkAccount, buyMsg.ItemId)) + if (message.Session.AttachedEntity == null) + break; + + if (!_uplinkManager.TryPurchaseItem(_syndicateUplinkAccount, buyMsg.ItemId, + message.Session.AttachedEntity.Transform.Coordinates, out var entity)) { SendNetworkMessage(new PDAUplinkInsufficientFundsMessage(), message.Session.ConnectedClient); break; } + HandsComponent.PutInHandOrDropStatic( + message.Session.AttachedEntity, + entity.GetComponent()); + SendNetworkMessage(new PDAUplinkBuySuccessMessage(), message.Session.ConnectedClient); break; } diff --git a/Content.Server/Interfaces/PDA/IPDAUplinkManager.cs b/Content.Server/Interfaces/PDA/IPDAUplinkManager.cs index f58fc5d755..0b9f78dba3 100644 --- a/Content.Server/Interfaces/PDA/IPDAUplinkManager.cs +++ b/Content.Server/Interfaces/PDA/IPDAUplinkManager.cs @@ -1,11 +1,15 @@ +#nullable enable using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using Content.Shared.GameObjects.Components.PDA; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Map; namespace Content.Server.Interfaces.PDA { public interface IPDAUplinkManager { - public IReadOnlyDictionary FetchListings => null; + public IReadOnlyDictionary FetchListings { get; } void Initialize(); @@ -13,7 +17,11 @@ namespace Content.Server.Interfaces.PDA public bool ChangeBalance(UplinkAccount acc, int amt); - public bool TryPurchaseItem(UplinkAccount acc, string itemId); + public bool TryPurchaseItem( + UplinkAccount? acc, + string itemId, + EntityCoordinates spawnCoords, + [NotNullWhen(true)] out IEntity? purchasedItem); } } diff --git a/Content.Server/PDA/PDAUplinkManager.cs b/Content.Server/PDA/PDAUplinkManager.cs index 2cdae4e8ca..b4d96e6980 100644 --- a/Content.Server/PDA/PDAUplinkManager.cs +++ b/Content.Server/PDA/PDAUplinkManager.cs @@ -1,4 +1,6 @@ +#nullable enable using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; @@ -8,6 +10,7 @@ using Content.Shared.GameObjects.Components.PDA; using Content.Shared.Prototypes.PDA; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; +using Robust.Shared.Map; using Robust.Shared.Prototypes; namespace Content.Server.PDA @@ -17,14 +20,13 @@ namespace Content.Server.PDA [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IEntityManager _entityManager = default!; - private List _accounts; - private Dictionary _listings; + private readonly List _accounts = new(); + private readonly Dictionary _listings = new(); public IReadOnlyDictionary FetchListings => _listings; public void Initialize() { - _listings = new Dictionary(); foreach (var item in _prototypeManager.EnumeratePrototypes()) { var newListing = new UplinkListingData(item.ListingName, item.ItemId, item.Price, item.Category, @@ -32,8 +34,6 @@ namespace Content.Server.PDA RegisterUplinkListing(newListing); } - - _accounts = new List(); } private void RegisterUplinkListing(UplinkListingData listing) @@ -53,7 +53,7 @@ namespace Content.Server.PDA { var entity = _entityManager.GetEntity(acc.AccountHolder); - if (entity.TryGetComponent(out MindComponent mindComponent) && !mindComponent.HasMind) + if (entity.TryGetComponent(out MindComponent? mindComponent) && !mindComponent.HasMind) { return false; } @@ -86,8 +86,9 @@ namespace Content.Server.PDA return true; } - public bool TryPurchaseItem(UplinkAccount acc, string itemId) + public bool TryPurchaseItem(UplinkAccount? acc, string itemId, EntityCoordinates spawnCoords, [NotNullWhen(true)] out IEntity? purchasedItem) { + purchasedItem = null; if (acc == null) { return false; @@ -108,10 +109,7 @@ namespace Content.Server.PDA return false; } - var player = _entityManager.GetEntity(acc.AccountHolder); - var hands = player.GetComponent(); - hands.PutInHandOrDrop(_entityManager.SpawnEntity(listing.ItemId, - player.Transform.Coordinates).GetComponent()); + purchasedItem = _entityManager.SpawnEntity(listing.ItemId, spawnCoords); return true; } }