Files
tbd-station-14/Content.Server/Cargo/CargoOrderDataManager.cs
ShadowCommander 1580750606 Implement Cargo Console (#413)
* Implement Cargo Console

Add to CargoConsoleComponent GalacticBank information for syncing Bank Account Balance.

Implement CargoOrderDatabase on the server side and a list of orders in the CargoOrderDatabaseComponent on the client side. This makes it easier to change data on the server side but also utilize the state syncing between components.

Implement GalacticMarketComponent.
Only productIds get sent. Both client and server create their lists from YAML.

Implement basic spawning of items from approved orders in CargoOrderDatabase.

* Finish Cargo Console

Add validation to make sure Order Amount is one or more.

Implement approve and cancel buttons to CargoConsoleMenu orders list row.

Add price to CargoConsoleMenu product list row.

Implement CargoOrderDataManager to consolidate CargoOrder lists.

Refactor CargoOrderDatabaseComponent to use CargoOrderDataManager instead of storing duplicate lists.

Implement canceling orders.
Implement approving orders.

Fix sprite links.

Implement Cargo Request Console.
2019-11-22 01:37:14 +01:00

100 lines
3.4 KiB
C#

using Content.Server.GameObjects.Components.Cargo;
using Content.Shared.Prototypes.Cargo;
using System;
using System.Collections.Generic;
namespace Content.Server.Cargo
{
public class CargoOrderDataManager : ICargoOrderDataManager
{
private readonly Dictionary<int, CargoOrderDatabase> _accounts = new Dictionary<int, CargoOrderDatabase>();
private readonly List<CargoOrderDatabaseComponent> _components = new List<CargoOrderDatabaseComponent>();
public CargoOrderDataManager()
{
CreateAccount(0);
}
public void CreateAccount(int id)
{
_accounts.Add(id, new CargoOrderDatabase(id));
}
public bool TryGetAccount(int id, out CargoOrderDatabase account)
{
if (_accounts.TryGetValue(id, out var _account))
{
account = _account;
return true;
}
account = null;
return false;
}
/// <summary>
/// Adds an order to the database.
/// </summary>
/// <param name="requester">The person who requested the item.</param>
/// <param name="reason">The reason the product was requested.</param>
/// <param name="productId">The ID of the product requested.</param>
/// <param name="amount">The amount of the products requested.</param>
/// <param name="payingAccountId">The ID of the bank account paying for the order.</param>
/// <param name="approved">Whether the order will be bought when the orders are processed.</param>
public virtual void AddOrder(int id, string requester, string reason, string productId, int amount, int payingAccountId)
{
if (amount < 1 || !TryGetAccount(id, out var account))
return;
account.AddOrder(requester, reason, productId, amount, payingAccountId);
SyncComponentsWithId(id);
}
public void RemoveOrder(int id, int orderNumber)
{
if (!TryGetAccount(id, out var account))
return;
account.RemoveOrder(orderNumber);
SyncComponentsWithId(id);
}
public void ApproveOrder(int id, int orderNumber)
{
if (!TryGetAccount(id, out var account))
return;
account.ApproveOrder(orderNumber);
SyncComponentsWithId(id);
}
private void SyncComponentsWithId(int id)
{
foreach (var component in _components)
{
if (!component.ConnectedToDatabase || component.Database.Id != id)
continue;
component.Dirty();
}
}
public List<CargoOrderData> RemoveAndGetApprovedFrom(CargoOrderDatabase database)
{
var approvedOrders = database.SpliceApproved();
SyncComponentsWithId(database.Id);
return approvedOrders;
}
public void AddComponent(CargoOrderDatabaseComponent component)
{
if (_components.Contains(component))
return;
_components.Add(component);
component.Database = _accounts[0];
}
public List<CargoOrderData> GetOrdersFromAccount(int accountId)
{
if (!TryGetAccount(accountId, out var account))
return null;
return account.GetOrders();
}
}
}