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.
This commit is contained in:
ShadowCommander
2019-11-21 16:37:15 -08:00
committed by Pieter-Jan Briers
parent 58709d2d26
commit 1580750606
29 changed files with 1867 additions and 12 deletions

View File

@@ -0,0 +1,106 @@
using Content.Shared.Prototypes.Cargo;
using Robust.Shared.GameObjects;
using Robust.Shared.GameObjects.Components.UserInterface;
using Robust.Shared.IoC;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Content.Shared.GameObjects.Components.Cargo
{
public class SharedCargoConsoleComponent : Component
{
#pragma warning disable CS0649
[Dependency]
protected IPrototypeManager _prototypeManager;
#pragma warning restore
public sealed override string Name => "CargoConsole";
/// <summary>
/// Sends away or requests shuttle
/// </summary>
[Serializable, NetSerializable]
public class CargoConsoleShuttleMessage : BoundUserInterfaceMessage
{
public CargoConsoleShuttleMessage()
{
}
}
/// <summary>
/// Add order to database.
/// </summary>
[Serializable, NetSerializable]
public class CargoConsoleAddOrderMessage : BoundUserInterfaceMessage
{
public string Requester;
public string Reason;
public string ProductId;
public int Amount;
public CargoConsoleAddOrderMessage(string requester, string reason, string productId, int amount)
{
Requester = requester;
Reason = reason;
ProductId = productId;
Amount = amount;
}
}
/// <summary>
/// Remove order from database.
/// </summary>
[Serializable, NetSerializable]
public class CargoConsoleRemoveOrderMessage : BoundUserInterfaceMessage
{
public int OrderNumber;
public CargoConsoleRemoveOrderMessage(int orderNumber)
{
OrderNumber = orderNumber;
}
}
/// <summary>
/// Set order in database as approved.
/// </summary>
[Serializable, NetSerializable]
public class CargoConsoleApproveOrderMessage : BoundUserInterfaceMessage
{
public int OrderNumber;
public CargoConsoleApproveOrderMessage(int orderNumber)
{
OrderNumber = orderNumber;
}
}
[NetSerializable, Serializable]
public enum CargoConsoleUiKey
{
Key
}
}
[NetSerializable, Serializable]
public class CargoConsoleInterfaceState : BoundUserInterfaceState
{
public readonly bool RequestOnly;
public readonly int BankId;
public readonly string BankName;
public readonly int BankBalance;
public CargoConsoleInterfaceState(bool requestOnly, int bankId, string bankName, int bankBalance)
{
RequestOnly = requestOnly;
BankId = bankId;
BankName = bankName;
BankBalance = bankBalance;
}
}
}

View File

@@ -0,0 +1,25 @@
using Content.Shared.Prototypes.Cargo;
using Robust.Shared.GameObjects;
using Robust.Shared.Serialization;
using System;
using System.Collections.Generic;
namespace Content.Shared.GameObjects.Components.Cargo
{
public class SharedCargoOrderDatabaseComponent : Component
{
public sealed override string Name => "CargoOrderDatabase";
public sealed override uint? NetID => ContentNetIDs.CARGO_ORDER_DATABASE;
public sealed override Type StateType => typeof(CargoOrderDatabaseState);
}
[NetSerializable, Serializable]
public class CargoOrderDatabaseState : ComponentState
{
public readonly List<CargoOrderData> Orders;
public CargoOrderDatabaseState(List<CargoOrderData> orders) : base(ContentNetIDs.CARGO_ORDER_DATABASE)
{
Orders = orders;
}
}
}

View File

@@ -0,0 +1,97 @@
using Content.Shared.Prototypes.Cargo;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
using System;
using System.Collections;
using System.Collections.Generic;
namespace Content.Shared.GameObjects.Components.Cargo
{
public class SharedGalacticMarketComponent : Component, IEnumerable<CargoProductPrototype>
{
public sealed override string Name => "GalacticMarket";
public sealed override uint? NetID => ContentNetIDs.GALACTIC_MARKET;
public sealed override Type StateType => typeof(GalacticMarketState);
protected List<CargoProductPrototype> _products = new List<CargoProductPrototype>();
/// <summary>
/// A read-only list of products.
/// </summary>
public IReadOnlyList<CargoProductPrototype> Products => _products;
public IEnumerator<CargoProductPrototype> GetEnumerator()
{
return _products.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
/// <summary>
/// Returns a product from the string id;
/// </summary>
/// <returns>Product</returns>
public CargoProductPrototype GetProduct(string productId)
{
var prototypeManager = IoCManager.Resolve<IPrototypeManager>();
if (!prototypeManager.TryIndex(productId, out CargoProductPrototype product) || !_products.Contains(product))
{
return null;
}
return product;
}
/// <summary>
/// Returns a list with the IDs of all products.
/// </summary>
/// <returns>A list of product IDs</returns>
public List<string> GetProductIdList()
{
List<string> productIds = new List<string>();
foreach (var product in _products)
{
productIds.Add(product.ID);
}
return productIds;
}
public override void ExposeData(ObjectSerializer serializer)
{
base.ExposeData(serializer);
if (serializer.Reading)
{
var products = serializer.ReadDataField("products", new List<string>());
var prototypeManager = IoCManager.Resolve<IPrototypeManager>();
foreach (var id in products)
{
if (!prototypeManager.TryIndex(id, out CargoProductPrototype product))
continue;
_products.Add(product);
}
}
else if (serializer.Writing)
{
var products = GetProductIdList();
serializer.DataField(ref products, "products", new List<string>());
}
}
}
[Serializable, NetSerializable]
public class GalacticMarketState : ComponentState
{
public List<string> Products;
public GalacticMarketState(List<string> technologies) : base(ContentNetIDs.GALACTIC_MARKET)
{
Products = technologies;
}
}
}

View File

@@ -32,5 +32,7 @@
public const uint OVERLAYEFFECTS = 1027;
public const uint STOMACH = 1028;
public const uint ITEMCOOLDOWN = 1029;
public const uint CARGO_ORDER_DATABASE = 1030;
public const uint GALACTIC_MARKET = 1031;
}
}