Files
tbd-station-14/Content.Server/PDA/PDAUplinkManager.cs
DrSmugleaf 4b4e83d2bf Add changing the amount of hands on the GUI depending on your body parts (#1406)
* Multiple hands in gui first pass

* Remove IHandsComponent interface

* Create hand class and more hand textures

* Refactor ServerHandsComponent to use a single list of hands

* Seal SharedHand

* Fix picked up items not showing on top of the hand buttons

* Remove HandsGui buttons and panels dictionaries

* Fix items in hands rendering

* Fix wrong hand container comparison

* Fix not updating the location of duplicate hands

* Change ClientHandsComponent to use a SortedList instead of a dictionary

* More merge conflict fixes

* Change SortedList to List

* Fix hand button order

* Add item tooltip for more than 2 hands and updating when removing hands

* Add add hand and remove hand command

* Merge conflict fixes

* Remove nullable reference type from ContainerSlot

* Fix texture errors

* Fix error when reaching 0 hands

* Fix error when swapping hands with no hands

* Merged remove hand methods

* Fix item panel texture errors

* Merge conflict fixes

* Fix addhand and removehand command descriptions

* Add properly displaying tooltips for 2 hands

* Make hand indexes and locations consistent across the client and server

* Add dropping held entity if a hand is removed

* Change hand location to be calculated by index

* Made different hand gui updates more consistent

* Remove human body yml testing changes

* Sanitize addhand and removehand commands

* Merge conflict fixes

* Remove testing changes

* Revert body system changes

* Add missing imports

* Remove obsolete hands parameter in yml files

* Fix broken import

* Fix startup error and adding and removing hands on the same tick

* Make hand container id use an uint

In case someone gets more than 2 billion hands

* Rename hand component files

* Make hands state use an array
2020-07-25 15:11:16 +02:00

112 lines
3.4 KiB
C#

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<UplinkAccount> _accounts;
private List<UplinkListingData> _listings;
public IReadOnlyList<UplinkListingData> FetchListings => _listings;
public void Initialize()
{
_listings = new List<UplinkListingData>();
foreach (var item in _prototypeManager.EnumeratePrototypes<UplinkStoreListingPrototype>())
{
var newListing = new UplinkListingData(item.ListingName, item.ItemId, item.Price, item.Category,
item.Description);
RegisterUplinkListing(newListing);
}
_accounts = new List<UplinkAccount>();
}
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<HandsComponent>();
hands.PutInHandOrDrop(_entityManager.SpawnEntity(listing.ItemId,
player.Transform.GridPosition).GetComponent<ItemComponent>());
return true;
}
}
}