/// <summary>
/// Item action used to Move an item from one collection to another. It can be used to equip/unequip items too.
/// </summary>
[System.Serializable]
public class CharacterEquipUnequipItemAction : ItemAction
{
[Tooltip("The name that should be displayed when the item can be equipped.")]
[SerializeField] protected string m_EquipActionName = "Equip";
[Tooltip("The name that should be displayed when the item can be unequipped.")]
[SerializeField] protected string m_UnequipActionName = "Unequip";
[Tooltip("Actively Equip the item if it is soft Equipped but not part of the active item set.")]
[SerializeField] protected bool m_NotMoveEquip = false;
private bool m_Equip;
protected bool m_MoveEquip;
/// <summary>
/// Default constructor.
/// </summary>
public CharacterEquipUnequipItemAction()
{
m_Name = "Equip";
}
/// <summary>
/// Returns true if the item action be invoked.
/// </summary>
/// <param name="itemInfo">The item.</param>
/// <param name="itemUser">The inventory user.</param>
/// <returns>True if it can be invoked.</returns>
protected override bool CanInvokeInternal(ItemInfo itemInfo, ItemUser itemUser)
{
var characterLocomotion = itemUser.gameObject.GetCachedComponent<UltimateCharacterLocomotion>();
if (characterLocomotion == null || !characterLocomotion.Alive) {
return false;
}
var inventorySystemBridge = itemUser.gameObject.GetCachedComponent<CharacterInventoryBridge>();
if (inventorySystemBridge == null) {
return false;
}
var item = itemInfo.Item;
if (m_NotMoveEquip) {
m_MoveEquip = false;
m_Equip = !inventorySystemBridge.IsItemActive(item);
} else {
m_MoveEquip = true;
m_Equip = !inventorySystemBridge.EquippableItemCollections.Contains(item.ItemCollection);
}
if (m_Equip) {
m_Name = m_EquipActionName;
} else {
m_Name = m_UnequipActionName;
}
return true;
}
/// <summary>
/// Move an item from one collection to another.
/// </summary>
/// <param name="itemInfo">The item info.</param>
protected override void InvokeActionInternal(ItemInfo itemInfo, ItemUser itemUser)
{
var inventorySystemBridge = itemUser.gameObject.GetCachedComponent<CharacterInventoryBridge>();
if (m_MoveEquip) {
inventorySystemBridge.MoveEquip(itemInfo,m_Equip);
} else {
inventorySystemBridge.Equip(itemInfo,m_Equip);
}
}
}
/// <summary>
/// Is the Item Active.
/// </summary>
/// <param name="item">The item to check if active.</param>
/// <returns>True if active</returns>
public bool IsItemActive(Opsive.UltimateInventorySystem.Core.Item item)
{
var characterItem = GetCharacterItem(item);
return IsItemActive(characterItem);
}
/// <summary>
/// Is the Item Active.
/// </summary>
/// <param name="item">The item to check if active.</param>
/// <returns>True if active</returns>
public virtual bool IsItemActive(Item characterItem)
{
if (characterItem == null) { return false; }
var slotID = characterItem.SlotID;
var active = characterItem.IsActive();
var activeItem = GetActiveItem(slotID);
return active && activeItem == characterItem;
}
//Active equipped
var activeEquipped = characterInventoryBridge.IsItemActive(item);
//Soft Equipped
var softEquipped = characterInventoryBridge.EquippableItemCollections.Contains(item.ItemCollection)
/// <summary>
/// Constructor.
/// </summary>
/// <param name="inventoryBridge">The inventory bridge.</param>
public BridgeEquippableProcessing(CharacterInventoryBridge inventoryBridge)
{
m_EquipOnItemSetUpdate = true;
m_StateChangeOnItemSetUpdate = true;
m_InventoryBridge = inventoryBridge;
m_CharacterGameobject = m_InventoryBridge.gameObject;
m_PreviousActiveSets = new ActiveAndNextItemSetData(ItemSetManager.CategoryCount,ItemSetManager.SlotCount);
m_RemovingFromItemSet = new List<CharacterItemInfo>();
m_CurrentItemSet = new List<Item>();
m_InventoryItemToCharacterItems = new Dictionary<Item, List<Items.Item>>();
EventHandler.RegisterEvent<ItemInfo, ItemStack>(m_InventoryBridge.Inventory,
EventNames.c_Inventory_OnAdd_ItemInfo_ItemStack, OnAddItemToInventory);
EventHandler.RegisterEvent<ItemInfo>(m_InventoryBridge.Inventory,
EventNames.c_Inventory_OnRemove_ItemInfo, OnRemoveItemFromInventory);
EventHandler.RegisterEvent<Items.Item, int>(m_CharacterGameobject,
"OnAbilityUnequipItemComplete", OnUnequipItemComplete);
EventHandler.RegisterEvent<Items.Item, int>(m_CharacterGameobject,
"OnInventoryEquipItem", OnEquipItemComplete);
EventHandler.RegisterEvent<Items.Item, int>(m_CharacterGameobject,
"OnAbilityWillEquipItem", OnWillEquipItem);
EventHandler.RegisterEvent<List<ItemSetStateInfo>>(m_CharacterGameobject,
IntegrationEventNames.c_GameObject_ItemSetsWillUpdate_ListOfItemSetStateInfo, OnItemSetsWillUpdate);
}
/// <summary>
/// The item finished equipping.
/// </summary>
/// <param name="characterItem">The character item.</param>
/// <param name="slotID">The item set slot ID.</param>
protected virtual void OnEquipItemComplete(Items.Item characterItem, int slotID)
{
//Update the Inventory after the Item Set changes to force update the UI and other things.
m_InventoryBridge.Inventory.UpdateInventory(false);
}