/// <summary>
/// An Item has been removed from the Inventory.
/// </summary>
/// <param name="itemInfo">The info that describes the item.</param>
private void OnRemoveItemFromInventory(ItemInfo itemInfo)
{
}
/// <summary>
/// An Item has been equipped.
/// </summary>
void OnItemEquipped()
{
UpdateMaximumAttributeValues();
}
/// <summary>
/// Moves item to another Item Collection.
/// </summary>
void MoveItemToItemCollection(ItemInfo addedItemInfo)
{
//Using a pooled array instead of creating a new array each time.
var pooledArray = GenericObjectPool.Get<ItemInfo[]>();
//Return if item definition is allready in Skinned Item Collection.
var currentItemDefinitionSkinned = m_SkinnedItemCollection.GetItemInfosWithDefinition(addedItemInfo.Item.ItemDefinition, ref pooledArray, true);
if (currentItemDefinitionSkinned.Count > 0)
return;
var addedItemItemCategory = addedItemInfo.Item.Category;
var addedItemItemCollection = addedItemInfo.Item.ItemCollection;
//Get all items from Skinned Item Collection with the same category.
var filterParameter = InventorySystemManager.GetItemCategory(addedItemItemCategory.name);
var skinnedItemCollection = m_Inventory.GetItemCollection(m_SkinnedItemCollectionName);
var currentItemInfoList = skinnedItemCollection.GetItemInfosWithCategory(filterParameter, ref pooledArray, true);
addedItemInfo.Item.TryGetAttributeValue(m_AttributeHealth, out float addedItemCompareHealthValue);
addedItemInfo.Item.TryGetAttributeValue(m_AttributeShield, out float addedItemCompareShieldValue);
if (currentItemInfoList.Count == 0)
{
//Give Item to Skinned Item Collection.
addedItemItemCollection.GiveItem(addedItemInfo, m_SkinnedItemCollection);
//Return the pooled array.
GenericObjectPool.Return(pooledArray);
return;
}
for (int i = 0; i < currentItemInfoList.Count; i++)
{
currentItemInfoList[i].Item.TryGetAttributeValue(m_AttributeHealth, out float currentCompareHealthValue);
currentItemInfoList[i].Item.TryGetAttributeValue(m_AttributeShield, out float currentCompareShieldValue);
var differenceHealthValue = addedItemCompareHealthValue - currentCompareHealthValue;
var differenceShieldValue = addedItemCompareShieldValue - currentCompareShieldValue;
var differenceValue = differenceHealthValue + differenceShieldValue;
if (differenceValue > 0)
{
//Move current Item from Skinned Item Collection into default.
m_SkinnedItemCollection.RemoveItem(currentItemInfoList[i]);
//Give Item to Skinned Item Collection.
addedItemItemCollection.GiveItem(addedItemInfo, m_SkinnedItemCollection);
//Current item gets into Default Item Collection.
m_DefaultItemCollection.AddItem(currentItemInfoList[i]);
//Return the pooled array.
GenericObjectPool.Return(pooledArray);
return;
}
}
}
/// <summary>
/// Check if Item has specified Item Category.
/// </summary>
bool CheckItemCategory(ItemInfo addedItemInfo, string ItemCategoryName)
{
var itemParents = addedItemInfo.Item.Category.GetDirectParents();
for (int i = 0; i < itemParents.Count; i++)
{
if (itemParents[i].ToString() == ItemCategoryName)
return true;
}
return false;
}
/// <summary>
/// Updates maximum values in the UCC Attribute Manager with the Item Definition Attributes.
/// Always update total value to avoid multiple updates & rounding errors.
/// </summary>
void UpdateMaximumAttributeValues()
{
if (_attributeManager != null)
{
var attributeHealth = _attributeManager.GetAttribute(m_AttributeHealth);
if (attributeHealth != null)
{
attributeHealth.MaxValue =
m_AttributeMaxHealthValueBase + m_Equipper.GetEquipmentStatInt(m_AttributeHealth);
}
var attributeArmor = _attributeManager.GetAttribute(m_AttributeShield);
if (attributeArmor != null)
{
attributeArmor.MaxValue = m_AttributeMaxShieldValueBase +
m_Equipper.GetEquipmentStatInt(m_AttributeShield);
}
}
}
/// <summary>
/// Updates current values of health and shield in the Attribute Manager with the Item Definition Attributes.
/// </summary>
/// <param name="itemInfo">The info that describes the item.</param>
void UpdateCurrentAttributeValues(ItemInfo itemInfo)
{
if (_attributeManager != null)
{
if (itemInfo.Item.TryGetAttributeValue(m_AttributeRegenerateHealth, out float regenerateHealthValue))
{
var attribute = _attributeManager.GetAttribute(m_AttributeHealth);
if (attribute != null)
{
attribute.Value += regenerateHealthValue;
}
}
if (itemInfo.Item.TryGetAttributeValue(m_AttributeRegenerateShield, out float regenerateShieldValue))
{
var attribute = _attributeManager.GetAttribute(m_AttributeShield);
if (attribute != null)
{
attribute.Value += regenerateShieldValue;
}
}
}
}
/// <summary>
/// Returns ItemCollection with the specified name.
/// </summary>
/// <param name="collectionName">The name of the ItemCollection.</param>
/// <param name="errorIfNull">Should an error be logged if the ItemCollection cannot be found?</param>
/// <returns>The ItemCollection with the specified name.</returns>
private ItemCollection GetItemCollection(string collectionName, bool errorIfNull)
{
var itemCollection = m_Inventory.GetItemCollection(collectionName);
if (errorIfNull && itemCollection == null) {
Debug.LogWarning($"Error: Unable to find the Item Collection with name {collectionName} within the Character Inventory.");
}
return itemCollection;
}
private void OnDestroy()
{
if (m_Equipper != null) {
EventHandler.UnregisterEvent(m_Equipper, EventNames.c_Equipper_OnChange, OnItemEquipped);
}
if (m_Inventory != null)
{
EventHandler.UnregisterEvent<ItemInfo, ItemStack>(m_Inventory,
EventNames.c_Inventory_OnAdd_ItemInfo_ItemStack, OnAddItemToInventory);
EventHandler.UnregisterEvent<ItemInfo>(m_Inventory, EventNames.c_Inventory_OnRemove_ItemInfo,
OnRemoveItemFromInventory);
}
}
}