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; } } }