2017-05-16 10:36:31 +02:00
|
|
|
|
|
|
|
|
|
using Cyber.Entities.SyncBases;
|
|
|
|
|
using Cyber.Networking.Clientside;
|
|
|
|
|
using Cyber.Networking.Messages;
|
|
|
|
|
|
|
|
|
|
namespace Cyber.Items {
|
|
|
|
|
|
2017-05-16 14:21:42 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Handles InventoryActions, building them on the client when needed and running them.
|
|
|
|
|
/// </summary>
|
2017-05-16 10:36:31 +02:00
|
|
|
|
public class InventoryActionHandler {
|
|
|
|
|
|
|
|
|
|
private Inventory Inventory;
|
|
|
|
|
private Character Character;
|
|
|
|
|
|
2017-05-16 14:21:42 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Creates an <see cref="InventoryActionHandler"/>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="inventory"></param>
|
|
|
|
|
/// <param name="character"></param>
|
2017-05-16 10:36:31 +02:00
|
|
|
|
public InventoryActionHandler(Inventory inventory, Character character) {
|
|
|
|
|
Inventory = inventory;
|
|
|
|
|
Character = character;
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-16 14:21:42 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Builds a <see cref="InventoryAction.Use"/> packet.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="slot">The equipped slot to use.</param>
|
|
|
|
|
/// <returns></returns>
|
2017-05-16 10:36:31 +02:00
|
|
|
|
public InventoryActionPkt BuildUseItem(EquipSlot slot) {
|
|
|
|
|
return new InventoryActionPkt(InventoryAction.Use, (int) slot);
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-16 14:21:42 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Builds a <see cref="InventoryAction.Unequip"/> packet.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="slot">The equipped slot to clear.</param>
|
|
|
|
|
/// <returns></returns>
|
2017-05-16 10:36:31 +02:00
|
|
|
|
public InventoryActionPkt BuildClearSlot(EquipSlot slot) {
|
|
|
|
|
return new InventoryActionPkt(InventoryAction.Unequip, (int) slot);
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-16 14:21:42 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Builds a <see cref="InventoryAction.Equip"/> packet.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="itemID">The item ID to equip.</param>
|
|
|
|
|
/// <returns></returns>
|
2017-05-16 10:36:31 +02:00
|
|
|
|
public InventoryActionPkt BuildEquipItem(int itemID) {
|
|
|
|
|
return new InventoryActionPkt(InventoryAction.Equip, itemID);
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-16 14:21:42 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Handles an <see cref="InventoryActionPkt"/> to handle. Ran on server and client.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="action">The <see cref="InventoryAction"/> to run</param>
|
|
|
|
|
/// <param name="relatedInt">The item related to the action.</param>
|
|
|
|
|
/// <returns>Weather the action failed or not.</returns>
|
2017-05-16 10:36:31 +02:00
|
|
|
|
public bool HandleAction(InventoryAction action, int relatedInt) {
|
|
|
|
|
switch (action) {
|
|
|
|
|
case InventoryAction.Equip:
|
|
|
|
|
Item Item = ItemDB.Singleton.Get(relatedInt);
|
|
|
|
|
Inventory.Equipped.SetSlot(Item.Slot, Item);
|
|
|
|
|
return true;
|
|
|
|
|
case InventoryAction.Unequip:
|
|
|
|
|
EquipSlot Slot = (EquipSlot) relatedInt;
|
|
|
|
|
Inventory.Equipped.ClearSlot(Slot);
|
|
|
|
|
return true;
|
|
|
|
|
case InventoryAction.Use:
|
|
|
|
|
EquipSlot UseSlot = (EquipSlot) relatedInt;
|
|
|
|
|
Item UseItem = Inventory.Equipped.GetItem(UseSlot);
|
|
|
|
|
if (UseItem != null && UseItem.Action != null && Character != null &&
|
|
|
|
|
(!Client.IsRunning() || Client.GetConnectedPlayer().Character != Character)) {
|
|
|
|
|
// Item exists, it has an action, and the character
|
|
|
|
|
// isn't controlled by the client (no double-actions).
|
|
|
|
|
UseItem.Action(Character);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|