using System;
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.CharacterScripts;
using Assets.HeroEditor4D.InventorySystem.Scripts.Data;
using Assets.HeroEditor4D.InventorySystem.Scripts.Enums;
using Assets.HeroEditor4D.InventorySystem.Scripts.Helpers;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.HeroEditor4D.InventorySystem.Scripts.Elements
{
///
/// Represents hero (player) equipment. Based on equipment slots.
///
public class Equipment : ItemContainer
{
public Action OnRefresh;
///
/// Defines what kinds of items can be equipped.
///
public List Slots;
///
/// Equipped items will be instantiated in front of equipment slots.
///
public GameObject ItemPrefab;
///
/// Character preview.
///
public Character Preview;
public Transform Scheme;
public int BagSize;
public readonly List InventoryItems = new List();
public void OnValidate()
{
if (Application.isPlaying) return;
Slots = GetComponentsInChildren(true).ToList();
//if (Character == null)
//{
// Character = FindObjectOfType();
//}
}
public void Start()
{
//Character.Animator.SetBool("Ready", false);
}
public void SetBagSize(int size)
{
BagSize = size;
var supplies = GetComponentsInChildren(true).Where(i => i.Types.Contains(ItemType.Supply)).ToList();
for (var i = 0; i < supplies.Count; i++)
{
supplies[i].Locked = i >= size;
}
}
public bool SelectAny()
{
if (InventoryItems.Count > 0)
{
InventoryItems[0].Select(true);
return true;
}
return false;
}
public override void Refresh(Item selected)
{
var items = Slots.Select(FindItem).Where(i => i != null).ToList();
var toggleGroup = GetComponentInParent(includeInactive: true);
Reset();
foreach (var slot in Slots)
{
var item = FindItem(slot);
slot.gameObject.SetActive(item == null);
if (item == null) continue;
var inventoryItem = Instantiate(ItemPrefab, slot.transform.parent).GetComponent();
inventoryItem.Initialize(item, toggleGroup);
inventoryItem.Count.text = null;
inventoryItem.transform.position = slot.transform.position;
inventoryItem.transform.SetSiblingIndex(slot.transform.GetSiblingIndex());
if (AutoSelect) inventoryItem.Select(item == selected);
InventoryItems.Add(inventoryItem);
}
if (Preview)
{
CharacterInventorySetup.Setup(Preview, items);
Preview.Initialize();
}
OnRefresh?.Invoke();
}
private void Reset()
{
foreach (var inventoryItem in InventoryItems)
{
Destroy(inventoryItem.gameObject);
}
InventoryItems.Clear();
}
private Item FindItem(ItemSlot slot)
{
if (slot.Types.Contains(ItemType.Shield))
{
var copy = Items.SingleOrDefault(i => i.Params.Type == ItemType.Weapon && (i.IsTwoHanded || i.IsFirearm));
if (copy != null)
{
return copy;
}
}
var index = Slots.Where(i => i.Types.SequenceEqual(slot.Types)).ToList().IndexOf(slot);
var items = Items.Where(slot.Supports).ToList();
return index < items.Count ? items[index] : null;
}
}
}