using System.Collections.Generic; using System.Linq; using Assets.HeroEditor4D.Common.Scripts.Common; using Assets.HeroEditor4D.InventorySystem.Scripts.Data; using Assets.HeroEditor4D.InventorySystem.Scripts.Enums; using Assets.HeroEditor4D.InventorySystem.Scripts.Elements; using UnityEngine; using UnityEngine.UI; namespace Assets.HeroEditor4D.InventorySystem.Scripts { /// /// High-level inventory interface. /// public class WarehouseBase : ItemWorkspace { public ScrollInventory WarehouseInventory; public ScrollInventory PlayerInventory; public InputField AmountInput; public Button PutButton; public Button TakeButton; public AudioClip MoveSound; public AudioSource AudioSource; public bool ExampleInitialize; public string CurrencyId = "Gold"; public int Amount; public void Awake() { // You must to set an active collection (as there may be several different collections in Resources). ItemCollection.Active = ItemCollection; } public void Start() { if (ExampleInitialize) { TestInitialize(); } } /// /// Initialize owned items and trader items (just for example). /// public void TestInitialize() { var warehouse = new List(); var inventory = ItemCollection.Active.Items.Select(i => new Item(i.Id, 2)).ToList(); RegisterCallbacks(); WarehouseInventory.Initialize(ref warehouse); PlayerInventory.Initialize(ref inventory); if (!WarehouseInventory.SelectAny() && !PlayerInventory.SelectAny()) { ItemInfo.Reset(); } } public void Initialize(ref List playerItems, ref List storageItems) { RegisterCallbacks(); PlayerInventory.Initialize(ref playerItems); WarehouseInventory.Initialize(ref storageItems); if (!PlayerInventory.SelectAny() && !WarehouseInventory.SelectAny()) { ItemInfo.Reset(); } } public void RegisterCallbacks() { InventoryItem.OnLeftClick = SelectItem; InventoryItem.OnRightClick = OnDoubleClick; } private void OnDoubleClick(Item item) { SelectItem(item); if (PlayerInventory.Items.Contains(item)) { Take(); } else if (CanMoveSelectedItem()) { Put(); } } public void SelectItem(Item item) { SelectedItem = item; SetAmount(1); ItemInfo.Initialize(SelectedItem, SelectedItem.Params.Price * Amount); Refresh(); } public void Put() { if (!CanMoveSelectedItem()) return; MoveItem(SelectedItem, PlayerInventory, WarehouseInventory, Amount); SelectItem(SelectedItem); AudioSource.PlayOneShot(MoveSound, SfxVolume); } public void Take() { if (!CanMoveSelectedItem()) return; MoveItem(SelectedItem, WarehouseInventory, PlayerInventory, Amount); SelectItem(SelectedItem); AudioSource.PlayOneShot(MoveSound, SfxVolume); } public override void Refresh() { if (SelectedItem == null) { ItemInfo.Reset(); PutButton.SetActive(false); TakeButton.SetActive(false); } else { var stored = WarehouseInventory.Items.Contains(SelectedItem); PutButton.SetActive(!stored && CanMoveSelectedItem()); TakeButton.SetActive(stored && CanMoveSelectedItem()); } } public void SetMinAmount() { SetAmount(1); } public void IncAmount(int value) { SetAmount(Amount + value); } public void SetMaxAmount() { SetAmount(SelectedItem.Count); } public void OnAmountChanged(string value) { if (value.IsEmpty()) return; SetAmount(int.Parse(value)); } public void OnAmountEndEdit(string value) { if (value.IsEmpty()) { SetAmount(1); } } public void Drop() { foreach (var item in PlayerInventory.Items.ToList()) { if (item.Params.Type != ItemType.Currency && !item.Params.Tags.Contains(ItemTag.Quest)) { #if TAP_HEROES if (item.Params.Class == ItemClass.Gunpowder) continue; #endif MoveItem(item, PlayerInventory, WarehouseInventory, item.Count); } } AudioSource.PlayOneShot(MoveSound, SfxVolume); } private void SetAmount(int amount) { Amount = Mathf.Max(1, Mathf.Min(SelectedItem.Count, amount)); AmountInput?.SetTextWithoutNotify(Amount.ToString()); ItemInfo.UpdatePrice(SelectedItem, SelectedItem.Params.Price * Amount, false); } protected virtual bool CanMoveSelectedItem() { return true; } } }