| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.UI;
- namespace SoftKitty.InventoryEngine
- {
- public class MerchantUi2 : UiWindow
- {
- #region Variables
- public RectTransform HoverInfoAnchorPlayer;
- public RectTransform HoverInfoAnchorMerchant;
- public RawImage MerchantAvatar;
- public InventoryItem PlayerItemPrefab;
- public InventoryItem MerchantItemPrefab;
- public InventoryItem [] PlayerTradeItems;
- public InventoryItem [] MerchantTradeItems;
- public InventoryHolder PlayerTradeHolder;
- public InventoryHolder NpcTradeHolder;
- public CurrenyInfo PlayerCurrencyPrefab;
- public CurrenyInfo MerchantCurrencyPrefab;
- public CurrenyInfo PlayerTradeCurrencyPrefab;
- public CurrenyInfo MerchantTradeCurrencyPrefab;
- public InputField SearchInput;
- public GameObject ClearFilterButton;
- public GameObject FavActiveIcon;
- public Text MerchantNameText;
- public Text SubtitleText;
- private InventoryItem[] playerItems;
- private InventoryItem[] merchantItems;
- private InventoryHolder playerHolder;
- private InventoryHolder merchantHolder;
- public Button TradeButton;
- private bool filterFav = false;
- private bool inited = false;
- private InventorySnapShot playerSnapshot;
- private InventorySnapShot merchantSnapshot;
- private List<CurrenyInfo> playerCurrencyItems = new List<CurrenyInfo>();
- private List<CurrenyInfo> merchantCurrencyItems = new List<CurrenyInfo>();
- private List<CurrenyInfo> playerTradeCurrencyItems = new List<CurrenyInfo>();
- private List<CurrenyInfo> merchantTradeCurrencyItems = new List<CurrenyInfo>();
- public Image BlockImage;
- #endregion
- #region MonoBehaviour
- void Start()
- {
- FavActiveIcon.GetComponent<Image>().color = InventorySkin.instance.FavoriteColor;
- }
- public override void Update()
- {
- if (!inited) return;
- base.Update();
- FilterItems();
- CheckBlock();
- }
- #endregion
- public void SetMerchantAvatar(Texture _avatar) //Set the avatar image of the merchant to display on the top right of the window
- {
- MerchantAvatar.texture = _avatar;
- }
- public override void Initialize(InventoryHolder _playerHolder, InventoryHolder _merchantHolder, string _merchantName = "Merchant")//Initialize this interface
- {
- playerHolder = _playerHolder;
- merchantHolder = _merchantHolder;
- MerchantNameText.text = _merchantName;
- SubtitleText.text = " " + _merchantName.ToUpper();
- PlayerItemPrefab.Outline.color = InventorySkin.instance.ItemSelectedColor;
- PlayerItemPrefab.Hover.color = InventorySkin.instance.ItemHoverColor;
- PlayerItemPrefab.Fav.GetComponent<Image>().color = InventorySkin.instance.FavoriteColor;
- MerchantItemPrefab.Outline.color = InventorySkin.instance.ItemSelectedColor;
- MerchantItemPrefab.Hover.color = InventorySkin.instance.ItemHoverColor;
- MerchantItemPrefab.Fav.GetComponent<Image>().color = InventorySkin.instance.FavoriteColor;
- playerHolder.RegisterItemChangeCallback(OnItemChange);
- merchantHolder.RegisterItemChangeCallback(OnItemChange);
- PlayerTradeHolder.RegisterItemChangeCallback(OnItemChange);
- NpcTradeHolder.RegisterItemChangeCallback(OnItemChange);
- PlayerTradeHolder.RefreshItemData();
- NpcTradeHolder.RefreshItemData();
- ShowList();
- for (int i = 0; i < playerHolder.Currency.Count; i++)
- {
- GameObject _newItem = Instantiate(PlayerCurrencyPrefab.gameObject, PlayerCurrencyPrefab.transform.parent);
- _newItem.transform.localScale = Vector3.one;
- _newItem.SetActive(true);
- _newItem.GetComponent<CurrenyInfo>().AutoCalculateChanges = false;
- _newItem.GetComponent<CurrenyInfo>().Initialize(i, playerHolder);
- playerCurrencyItems.Add(_newItem.GetComponent<CurrenyInfo>());
- }
- for (int i = 0; i < merchantHolder.Currency.Count; i++)
- {
- GameObject _newItem = Instantiate(MerchantCurrencyPrefab.gameObject, MerchantCurrencyPrefab.transform.parent);
- _newItem.transform.localScale = Vector3.one;
- _newItem.SetActive(true);
- _newItem.GetComponent<CurrenyInfo>().AutoCalculateChanges = false;
- _newItem.GetComponent<CurrenyInfo>().Initialize(i, merchantHolder);
- merchantCurrencyItems.Add(_newItem.GetComponent<CurrenyInfo>());
- }
- for (int i = 0; i < PlayerTradeHolder.Currency.Count; i++)
- {
- GameObject _newItem = Instantiate(PlayerTradeCurrencyPrefab.gameObject, PlayerTradeCurrencyPrefab.transform.parent);
- _newItem.transform.localScale = Vector3.one;
- _newItem.SetActive(true);
- _newItem.GetComponent<CurrenyInfo>().AutoCalculateChanges = false;
- _newItem.GetComponent<CurrenyInfo>().Initialize(i, PlayerTradeHolder);
- playerTradeCurrencyItems.Add(_newItem.GetComponent<CurrenyInfo>());
- }
- for (int i = 0; i < NpcTradeHolder.Currency.Count; i++)
- {
- GameObject _newItem = Instantiate(MerchantTradeCurrencyPrefab.gameObject, MerchantTradeCurrencyPrefab.transform.parent);
- _newItem.transform.localScale = Vector3.one;
- _newItem.SetActive(true);
- _newItem.GetComponent<CurrenyInfo>().AutoCalculateChanges = false;
- _newItem.GetComponent<CurrenyInfo>().Initialize(i, NpcTradeHolder);
- merchantTradeCurrencyItems.Add(_newItem.GetComponent<CurrenyInfo>());
- }
- playerSnapshot = playerHolder.GetSnapShot();
- merchantSnapshot = merchantHolder.GetSnapShot();
- playerHolder.AutoSave = false;
- merchantHolder.BlockAutoSave = true;
- playerHolder.BlockAutoSave = true;
- inited = true;
- }
- private void ShowList()//Show item list for both side
- {
- playerItems = new InventoryItem[playerHolder.Stacks.Count];
- for (int i = 0; i < playerHolder.Stacks.Count; i++)
- {
- GameObject _newItem = Instantiate(PlayerItemPrefab.gameObject, PlayerItemPrefab.transform.parent);
- _newItem.transform.localScale = Vector3.one;
- _newItem.GetComponent<InventoryItem>().Initialize(playerHolder.Stacks[i]);
- _newItem.GetComponent<InventoryItem>().SetHolder(playerHolder);
- _newItem.GetComponent<InventoryItem>().HoverInfoAnchorPoint = HoverInfoAnchorPlayer;
- _newItem.GetComponent<InventoryItem>().RegisterClickCallback(i, OnPlayerItemClick);
- _newItem.GetComponent<InventoryItem>().PriceMultiplier = merchantHolder.BuyPriceMultiplier;
- _newItem.GetComponent<InventoryItem>().LimitedByOwner = PlayerTradeHolder;
- _newItem.gameObject.SetActive(true);
- playerItems[i] = _newItem.GetComponent<InventoryItem>();
- }
- merchantItems = new InventoryItem[merchantHolder.Stacks.Count];
- for (int i = 0; i < merchantHolder.Stacks.Count; i++)
- {
- GameObject _newItem = Instantiate(MerchantItemPrefab.gameObject, MerchantItemPrefab.transform.parent);
- _newItem.transform.localScale = Vector3.one;
- _newItem.GetComponent<InventoryItem>().Initialize(merchantHolder.Stacks[i]);
- _newItem.GetComponent<InventoryItem>().SetHolder(merchantHolder);
- _newItem.GetComponent<InventoryItem>().HoverInfoAnchorPoint = HoverInfoAnchorMerchant;
- _newItem.GetComponent<InventoryItem>().RegisterClickCallback(i, OnMerchantItemClick);
- _newItem.GetComponent<InventoryItem>().PriceMultiplier = merchantHolder.SellPriceMultiplier;
- _newItem.GetComponent<InventoryItem>().RecieveUntradeable = false;
- _newItem.GetComponent<InventoryItem>().LimitedByOwner = NpcTradeHolder;
- _newItem.gameObject.SetActive(true);
- merchantItems[i] = _newItem.GetComponent<InventoryItem>();
- }
- for (int i = 0; i < PlayerTradeHolder.Stacks.Count; i++)
- {
- PlayerTradeItems[i].Initialize(PlayerTradeHolder.Stacks[i]);
- PlayerTradeItems[i].SetHolder(PlayerTradeHolder);
- PlayerTradeItems[i].HoverInfoAnchorPoint = HoverInfoAnchorPlayer;
- PlayerTradeItems[i].RegisterClickCallback(i, OnPlayerTradeItemClick);
- PlayerTradeItems[i].PriceMultiplier = merchantHolder.BuyPriceMultiplier;
- PlayerTradeItems[i].LimitedByOwner = playerHolder;
- PlayerTradeItems[i].RecieveUntradeable = false;
- PlayerTradeItems[i].Outline.color = InventorySkin.instance.ItemSelectedColor;
- PlayerTradeItems[i].Hover.color = InventorySkin.instance.ItemHoverColor;
- PlayerTradeItems[i].Fav.GetComponent<Image>().color = InventorySkin.instance.FavoriteColor;
- }
- for (int i = 0; i < NpcTradeHolder.Stacks.Count; i++)
- {
- MerchantTradeItems[i].Initialize(NpcTradeHolder.Stacks[i]);
- MerchantTradeItems[i].SetHolder(NpcTradeHolder);
- MerchantTradeItems[i].HoverInfoAnchorPoint = HoverInfoAnchorMerchant;
- MerchantTradeItems[i].RegisterClickCallback(i, OnMerchantTradeItemClick);
- MerchantTradeItems[i].PriceMultiplier = merchantHolder.SellPriceMultiplier;
- MerchantTradeItems[i].LimitedByOwner = merchantHolder;
- MerchantTradeItems[i].RecieveUntradeable = false;
- MerchantTradeItems[i].Outline.color = InventorySkin.instance.ItemSelectedColor;
- MerchantTradeItems[i].Hover.color = InventorySkin.instance.ItemHoverColor;
- MerchantTradeItems[i].Fav.GetComponent<Image>().color = InventorySkin.instance.FavoriteColor;
- }
- }
- private bool isKeyMatch(AlterKeys _key)
- {
- switch (_key)
- {
- case AlterKeys.None:
- return true;
- case AlterKeys.LeftCtrl:
- return InputProxy.GetKey(KeyCode.LeftControl);
- case AlterKeys.LeftAlt:
- return InputProxy.GetKey(KeyCode.LeftAlt);
- case AlterKeys.LeftShift:
- return InputProxy.GetKey(KeyCode.LeftShift);
- }
- return false;
- }
- public void OnPlayerTradeItemClick(int _index, int _button)//Callback for when player click an item in player's trading area.
- {
- if (PlayerTradeItems[_index].isTradeable() && !PlayerTradeItems[_index].isEmpty()) {
- foreach (var setting in ItemManager.instance.clickSettings)
- {
- if (_button == (int)setting.mouseButton && isKeyMatch(setting.key))
- {
- if (setting.function == ClickFunctions.Use)
- {
- PlayerTradeHolder.RemoveItem(PlayerTradeItems[_index].GetItemId(), 1 - playerHolder.AddItem(PlayerTradeItems[_index].GetItem(), 1).Number, _index);
- SoundManager.Play2D("ItemDrop");
- }
- }
- }
- }
- }
- public void OnMerchantTradeItemClick(int _index, int _button)//Callback for when player click an item in merchant's trading area.
- {
- if (MerchantTradeItems[_index].isTradeable() && !MerchantTradeItems[_index].isEmpty())
- {
- foreach (var setting in ItemManager.instance.clickSettings)
- {
- if (_button == (int)setting.mouseButton && isKeyMatch(setting.key))
- {
- if (setting.function == ClickFunctions.Use)
- {
- NpcTradeHolder.RemoveItem(MerchantTradeItems[_index].GetItemId(), 1 - merchantHolder.AddItem(MerchantTradeItems[_index].GetItem(), 1).Number, _index);
- SoundManager.Play2D("ItemDrop");
- }
- }
- }
- }
- }
- public void OnPlayerItemClick(int _index, int _button)//Callback for when player click an item in player's inventory.
- {
- if (playerItems[_index].isTradeable() && !playerItems[_index].isEmpty()
- && (merchantHolder.TradeAllItems || merchantHolder.TradeList.Contains(playerItems[_index].GetItemId()) || merchantHolder.TradeCategoryList.Contains(playerItems[_index].GetCategory()))) {
- foreach (var setting in ItemManager.instance.clickSettings)
- {
- if (_button == (int)setting.mouseButton && isKeyMatch(setting.key))
- {
- if (setting.function == ClickFunctions.Use)
- {
- playerHolder.RemoveItem(playerItems[_index].GetItemId(), 1 - PlayerTradeHolder.AddItem(playerItems[_index].GetItem(), 1).Number, _index);
- SoundManager.Play2D("ItemDrop");
- }
- else if (setting.function == ClickFunctions.MarkFavorite)
- {
- playerItems[_index].MarkFav();
- }
- }
- }
- }
- }
- public void OnMerchantItemClick(int _index, int _button)//Callback for when player click an item in merchant's inventory.
- {
- if (merchantItems[_index].isTradeable() && !merchantItems[_index].isEmpty())
- {
- foreach (var setting in ItemManager.instance.clickSettings)
- {
- if (_button == (int)setting.mouseButton && isKeyMatch(setting.key))
- {
- if (setting.function == ClickFunctions.Use)
- {
- merchantHolder.RemoveItem(merchantItems[_index].GetItemId(), 1 - NpcTradeHolder.AddItem(merchantItems[_index].GetItem(), 1).Number, _index);
- SoundManager.Play2D("ItemDrop");
- }
- }
- }
- }
- }
- private void OnDestroy()//UnRegisterI all callbacks
- {
- playerHolder.UnRegisterItemChangeCallback(OnItemChange);
- merchantHolder.UnRegisterItemChangeCallback(OnItemChange);
- merchantHolder.BlockAutoSave = false;
- playerHolder.BlockAutoSave = false;
- }
- public void OnItemChange(Dictionary<Item, int> _changedItems)//Callback for when items in player's inventory has changed.
- {
- GetCurrencyChange();
- }
- private void GetCurrencyChange()//Compare the items with the snapeshot, calculate the difference by their cost.
- {
- int[] _playerTradeValue = new int[ItemManager.instance.currencies.Count];
- int[] _merchantTradeValue = new int[ItemManager.instance.currencies.Count];
- foreach (var obj in PlayerTradeHolder.Stacks)
- {
- if (!obj.isEmpty())
- {
- _playerTradeValue[ItemManager.itemDic[obj.GetItemId()].currency] += Mathf.CeilToInt(ItemManager.itemDic[obj.GetItemId()].price * merchantHolder.BuyPriceMultiplier * obj.Number);
- }
- }
- foreach (var obj in NpcTradeHolder.Stacks)
- {
- if (!obj.isEmpty())
- {
- _merchantTradeValue[ItemManager.itemDic[obj.GetItemId()].currency] += Mathf.CeilToInt(ItemManager.itemDic[obj.GetItemId()].price * merchantHolder.SellPriceMultiplier * obj.Number);
- }
- }
- int[] _currencyChange = new int[ItemManager.instance.currencies.Count];
- for (int i = 0; i < _currencyChange.Length; i++)
- {
- _currencyChange[i] = _playerTradeValue[i] - _merchantTradeValue[i];
- }
- bool _lackOfCurrency = false;
- for (int i = 0; i < _currencyChange.Length; i++)
- {
- playerHolder.SetCurrency(i, playerSnapshot.GetCurrency(i, false) + _currencyChange[i]);
- merchantHolder.SetCurrency(i, merchantSnapshot.GetCurrency(i, false) - _currencyChange[i]);
- PlayerTradeHolder.SetCurrency(i, _playerTradeValue[i]);
- NpcTradeHolder.SetCurrency(i, _merchantTradeValue[i]);
- if (playerHolder.GetCurrency(i, true) < 0 || merchantHolder.GetCurrency(i, true) < 0) _lackOfCurrency = true;
- }
- TradeButton.interactable = !_lackOfCurrency;
- TradeButton.GetComponent<CanvasGroup>().alpha = _lackOfCurrency ? 0.2F : 1F;
- List<int> _playerCurrencyDifference = playerHolder.GetCurrencyDifference(playerSnapshot.CurrencyValue);
- for (int i = 0; i < playerCurrencyItems.Count; i++) playerCurrencyItems[i].SetChangeText(_playerCurrencyDifference[i]);
- List<int> _merchantCurrencyDifference = merchantHolder.GetCurrencyDifference(merchantSnapshot.CurrencyValue);
- for (int i = 0; i < merchantCurrencyItems.Count; i++) merchantCurrencyItems[i].SetChangeText(_merchantCurrencyDifference[i]);
- }
- public override void Close()//Revert to the snapshot for both side if the window is closed.
- {
- playerHolder.RevertSnapShot(playerSnapshot);
- merchantHolder.RevertSnapShot(merchantSnapshot);
- base.Close();
- }
- public void Cancel()//Revert to the snapshot for both side
- {
- SoundManager.Play2D("Sort");
- foreach (var obj in PlayerTradeHolder.Stacks)
- {
- obj.Delete();
- }
- foreach (var obj in NpcTradeHolder.Stacks)
- {
- obj.Delete();
- }
- for (int i = 0; i < ItemManager.instance.currencies.Count; i++)
- {
- PlayerTradeHolder.SetCurrency(i, 0);
- NpcTradeHolder.SetCurrency(i, 0);
- }
- playerHolder.RevertSnapShot(playerSnapshot);
- merchantHolder.RevertSnapShot(merchantSnapshot);
- foreach (var obj in playerCurrencyItems)
- {
- obj.SetChangeText(0);
- }
- foreach (var obj in merchantCurrencyItems)
- {
- obj.SetChangeText(0);
- }
- }
- public void Purchase()//Confirm the purchase and close the window
- {
- foreach (var obj in PlayerTradeHolder.Stacks)
- {
- if (!obj.isEmpty())
- {
- merchantHolder.AddItem(obj.Item,obj.Number);
- }
- }
- foreach (var obj in NpcTradeHolder.Stacks)
- {
- if (!obj.isEmpty())
- {
- playerHolder.AddItem(obj.Item, obj.Number);
- }
- }
- foreach (var obj in PlayerTradeHolder.Stacks)
- {
- obj.Delete();
- }
- foreach (var obj in NpcTradeHolder.Stacks)
- {
- obj.Delete();
- }
- for (int i = 0; i < ItemManager.instance.currencies.Count; i++)
- {
- PlayerTradeHolder.SetCurrency(i, 0);
- NpcTradeHolder.SetCurrency(i, 0);
- }
- SoundManager.Play2D("Trade");
- SoundManager.Play2D("DoneDeal");
- merchantHolder.BlockAutoSave = false;
- playerHolder.BlockAutoSave = false;
- playerHolder.Save();
- merchantHolder.Save();
- playerSnapshot = playerHolder.GetSnapShot();
- merchantSnapshot = merchantHolder.GetSnapShot();
- foreach (var obj in playerCurrencyItems)
- {
- obj.SetChangeText(0);
- }
- foreach (var obj in merchantCurrencyItems)
- {
- obj.SetChangeText(0);
- }
- }
- public void FilterItems()//Filter the items by their name and "isTradeable" mark
- {
- for (int i = 0; i < playerItems.Length; i++)
- {
- playerItems[i].SetVisible(playerItems[i].isNameMatch(SearchInput.text) && (!filterFav || playerItems[i].Fav.activeSelf) && playerItems[i].isTradeable(true)
- && (merchantHolder.TradeAllItems || merchantHolder.TradeList.Contains(playerItems[i].GetItemId()) || merchantHolder.TradeCategoryList.Contains(playerItems[i].GetCategory())));
- }
- for (int i = 0; i < merchantItems.Length; i++)
- {
- merchantItems[i].SetVisible(merchantItems[i].isNameMatch(SearchInput.text));
- }
- for (int i = 0; i < MerchantTradeItems.Length; i++)
- {
- MerchantTradeItems[i].SetVisible(MerchantTradeItems[i].isNameMatch(SearchInput.text));
- }
- for (int i = 0; i < PlayerTradeItems.Length; i++)
- {
- PlayerTradeItems[i].SetVisible(PlayerTradeItems[i].isNameMatch(SearchInput.text));
- }
- ClearFilterButton.SetActive(SearchInput.text != "");
- }
- public void ClearFilter()//Clear all filters.
- {
- SearchInput.text = "";
- ClearFilterButton.SetActive(false);
- filterFav = false;
- for (int i = 0; i < playerItems.Length; i++)
- {
- playerItems[i].SetVisible(true);
- }
- for (int i = 0; i < merchantItems.Length; i++)
- {
- merchantItems[i].SetVisible(true);
- }
- for (int i = 0; i < MerchantTradeItems.Length; i++)
- {
- MerchantTradeItems[i].SetVisible(true);
- }
- for (int i = 0; i < PlayerTradeItems.Length; i++)
- {
- PlayerTradeItems[i].SetVisible(true);
- }
- }
- public void ShowFavItems()//Only show favorite items
- {
- SoundManager.Play2D("Tab");
- filterFav = !filterFav;
- FavActiveIcon.SetActive(filterFav);
- FilterItems();
- }
- private void CheckBlock()//Check if the interface should be blocked.
- {
- if (NumberInput.instance != null)
- {
- BlockImage.gameObject.SetActive(true);
- BlockImage.color = new Color(0F, 0F, 0F, Mathf.Lerp(BlockImage.color.a, 0.94F, Time.deltaTime * 3F));
- }
- else
- {
- if (BlockImage.color.a > 0F)
- {
- BlockImage.color = new Color(0F, 0F, 0F, Mathf.MoveTowards(BlockImage.color.a, 0F, Time.deltaTime * 2F));
- }
- else
- {
- if (BlockImage.gameObject.activeSelf) BlockImage.gameObject.SetActive(false);
- }
- }
- }
- }
- }
|