using Cyber.Entities.SyncBases; using Cyber.Networking.Clientside; using Cyber.Networking.Messages; namespace Cyber.Items { /// /// Handles InventoryActions, building them on the client when needed and running them. /// public class InventoryActionHandler { private Inventory Inventory; private Character Character; /// /// Creates an /// /// /// public InventoryActionHandler(Inventory inventory, Character character) { Inventory = inventory; Character = character; } /// /// Builds a packet. /// /// The equipped slot to use. /// public InventoryActionPkt BuildUseItem(EquipSlot slot) { return new InventoryActionPkt(InventoryAction.Use, (int) slot); } /// /// Builds a packet. /// /// The equipped slot to clear. /// public InventoryActionPkt BuildClearSlot(EquipSlot slot) { return new InventoryActionPkt(InventoryAction.Unequip, (int) slot); } /// /// Builds a packet. /// /// The item index to equip. /// public InventoryActionPkt BuildEquipItem(int itemIdx) { return new InventoryActionPkt(InventoryAction.Equip, itemIdx); } public InventoryActionPkt BuildSlotSwitch(int switchFrom, int switchTo) { return new InventoryActionPkt(InventoryAction.Switch, new int[]{ switchFrom, switchTo }); } /// /// Handles an to handle. Ran on server and client. /// /// The to run /// The item related to the action. /// Weather the action failed or not. public bool HandleAction(InventoryAction action, int[] intList) { switch (action) { case InventoryAction.Equip: Inventory.Drive.EquipItem(intList[0]); return true; case InventoryAction.Unequip: EquipSlot Slot = (EquipSlot) intList[0]; Inventory.Drive.UnequipSlot(Slot); return true; case InventoryAction.Use: EquipSlot UseSlot = (EquipSlot) intList[0]; Item UseItem = Inventory.Drive.GetSlot(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; case InventoryAction.Switch: Inventory.Drive.SwitchSlots(intList[0], intList[1]); return true; } return false; } } }