EquipmentUi.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. namespace SoftKitty.InventoryEngine
  6. {
  7. public class EquipmentUi : UiWindow
  8. {
  9. public RectTransform InventoryAnchor;
  10. public RectTransform HoverInfoAnchorPoint;
  11. public StatsUi StatsScript;
  12. public string EquipAction = "equip";
  13. public BlockByTag[] BlockSlotByTag;
  14. public InventoryItem[] EquipItems;
  15. public Text TitleText;
  16. public Text PlayerNameText;
  17. public Text PlayerLevelText;
  18. private Dictionary<string, InventoryItem> EquipSlotsDic = new Dictionary<string, InventoryItem>();
  19. private InventoryHolder mEquipHolder;
  20. private InventoryHolder mInventoryHolder;
  21. private bool inited = false;
  22. private bool wasDragging = false;
  23. void Start()
  24. {
  25. }
  26. public override void Initialize(InventoryHolder _inventoryHolder, InventoryHolder _equipHolder, string _name= "Equipment")
  27. {
  28. mEquipHolder = _equipHolder;
  29. mInventoryHolder = _inventoryHolder;
  30. mInventoryHolder.RegisterItemUseCallback(OnInventoryItemClick);
  31. StatsScript.Init(_equipHolder, _equipHolder.BaseStats.ToArray());
  32. TitleText.text = _name.ToUpper();
  33. if (ItemManager.instance.GetAtttibute(ItemManager.instance.LevelAttributeKey) !=null)
  34. {
  35. SetPlayerLevelText("Level . "+ Mathf.FloorToInt( _equipHolder.GetAttributeValue(ItemManager.instance.LevelAttributeKey,true)).ToString());
  36. }
  37. if (ItemManager.instance.GetAtttibute(ItemManager.instance.NameAttributeKey) != null)
  38. {
  39. SetPlayerName(_equipHolder.GetBaseStatsString(ItemManager.instance.NameAttributeKey));
  40. }
  41. LayoutRebuilder.ForceRebuildLayoutImmediate(PlayerNameText.transform.parent.GetComponent<RectTransform>());
  42. EquipSlotsDic.Clear();
  43. int _index = 0;
  44. List<string> Tags = new List<string>();
  45. foreach (InventoryItem obj in EquipItems) {
  46. Tags.Add(obj.LimitedByTag);
  47. obj.Outline.color = InventorySkin.instance.ItemSelectedColor;
  48. obj.Hover.color = InventorySkin.instance.ItemHoverColor;
  49. obj.Fav.GetComponent<Image>().color = InventorySkin.instance.FavoriteColor;
  50. if (!EquipSlotsDic.ContainsKey(obj.LimitedByTag))
  51. {
  52. EquipSlotsDic.Add(obj.LimitedByTag, obj);
  53. obj.RegisterClickCallback(_index, OnEquipItemClick);
  54. obj.RegisterOnItemChangeCallback(OnItemChange);
  55. obj.HoverInfoAnchorPoint = HoverInfoAnchorPoint;
  56. }
  57. obj.SetHolder(mEquipHolder);
  58. _index++;
  59. }
  60. _index = 0;
  61. foreach (InventoryStack item in mEquipHolder.Stacks)
  62. {
  63. bool _found = false;
  64. for (int i=Tags.Count-1;i>=0;i--)
  65. {
  66. if (!_found && item.isTagMatchText(Tags[i]) )
  67. {
  68. EquipSlotsDic[Tags[i]].Initialize(item);
  69. Tags.RemoveAt(i);
  70. _found = true;
  71. }
  72. }
  73. if (!_found && Tags.Count>0)
  74. {
  75. EquipSlotsDic[Tags[0]].Initialize(item);
  76. Tags.RemoveAt(0);
  77. }
  78. }
  79. ActiveWindow();
  80. SlotBlockCheck();
  81. inited = true;
  82. }
  83. public void SetPlayerName(string _name)
  84. {
  85. PlayerNameText.text = _name;
  86. }
  87. public void SetPlayerLevelText(string _text)
  88. {
  89. PlayerLevelText.text = _text;
  90. }
  91. public void HighLightSlot(List<string> _tags)
  92. {
  93. foreach (InventoryItem item in EquipItems)
  94. {
  95. bool _match = false;
  96. foreach (var _tag in _tags)
  97. {
  98. if (item != null && item.LimitedByTag.Replace("#1", "").Replace("#2", "").Replace("#3", "") == _tag) _match = true;
  99. }
  100. if (_match && item != null)
  101. {
  102. item.ShowOutline(0.5F);
  103. }
  104. }
  105. }
  106. public void ToggleInventory()
  107. {
  108. if (!WindowsManager.isWindowOpen(mInventoryHolder))
  109. {
  110. UiWindow _inventory = mInventoryHolder.OpenWindow();
  111. _inventory.GetComponentInChildren<DragableUi>().DragableRectTransform = GetComponent<RectTransform>();
  112. _inventory.ChildWindow = true;
  113. _inventory.GetComponent<UiStyle>().SetHeight(0, 0.5F);
  114. _inventory.GetComponent<UiStyle>().SetHeight(1, 0.5F);
  115. ActiveWindow();
  116. }
  117. else
  118. {
  119. WindowsManager.getOpenedWindow(mInventoryHolder).Close();
  120. }
  121. }
  122. private void OnDestroy()
  123. {
  124. mInventoryHolder.UnRegisterItemUseCallback(OnInventoryItemClick);
  125. if (WindowsManager.isWindowOpen(mInventoryHolder))
  126. {
  127. WindowsManager.getOpenedWindow(mInventoryHolder).GetComponentInChildren<DragableUi>().DragableRectTransform = WindowsManager.getOpenedWindow(mInventoryHolder).GetComponent<RectTransform>();
  128. WindowsManager.getOpenedWindow(mInventoryHolder).ActiveWindow();
  129. }
  130. }
  131. public void OnItemChange(Item _item, int _changedNumber, InventoryItem _itemIcon)
  132. {
  133. SlotBlockCheck();
  134. }
  135. private void SlotBlockCheck()
  136. {
  137. StartCoroutine(SlotBlockCheckCo());
  138. }
  139. IEnumerator SlotBlockCheckCo()
  140. {
  141. yield return 1;
  142. foreach (var obj in BlockSlotByTag)
  143. {
  144. bool _found = false;
  145. foreach (InventoryItem item in EquipItems)
  146. {
  147. if (!_found && item != null && item.isTagMatchText(obj.tag) && !item.isEmpty())
  148. {
  149. obj.blockIcon.SetAppearance(item.GetItem().icon, item.GetItem().GetTypeColor(), item.GetItem().GetQualityColor(), false, true);
  150. obj.blockIcon.SetUpgradeLevel(item.GetItem().upgradeLevel);
  151. _found = true;
  152. }
  153. }
  154. obj.blockIcon.gameObject.SetActive(_found);
  155. obj.blockedItem.Enabled = !_found;
  156. if (_found && !obj.blockedItem.isEmpty()) UnEquip(obj.blockedItem.LimitedByTag, obj.blockedItem.GetItemId());
  157. }
  158. }
  159. public void OnEquipItemClick(int _id, int _button)
  160. {
  161. if (_button == 1 && !EquipItems[_id].isEmpty())
  162. {
  163. UnEquip(EquipItems[_id].LimitedByTag, EquipItems[_id].GetItemId());
  164. }
  165. }
  166. public void OnInventoryItemClick(string _action, int _id, int _index)
  167. {
  168. if (_index == -1) return;
  169. if (_action==EquipAction) {
  170. foreach (InventoryItem item in EquipItems)
  171. {
  172. if (ItemManager.itemDic[_id].isTagMatchText(item.LimitedByTag) && item.Enabled)
  173. {
  174. Equip(item.LimitedByTag, _id,item, _index);
  175. return;
  176. }
  177. }
  178. }
  179. }
  180. public void UnEquip(string _tag, int _uid, bool _playSound = true)
  181. {
  182. bool _found = false;
  183. for (int i=mEquipHolder.Stacks.Count-1;i>=0;i--)
  184. {
  185. if (!_found
  186. && mEquipHolder.Stacks[i].isTagMatchText(_tag)
  187. && mEquipHolder.Stacks[i].GetItemId()==_uid)
  188. {
  189. Dictionary<Item, int> _changedItems = new Dictionary<Item, int>();
  190. _changedItems.Add(mEquipHolder.Stacks[i].Item, -1);
  191. InventoryStack _add;
  192. if (WindowsManager.isWindowOpen(ItemManager.PlayerInventoryHolder) || !WindowsManager.isWindowOpen(mInventoryHolder))
  193. {
  194. _add = ItemManager.PlayerInventoryHolder.AddItem(mEquipHolder.Stacks[i].Item.Copy(), 1);
  195. }
  196. else
  197. {
  198. _add = mInventoryHolder.AddItem(mEquipHolder.Stacks[i].Item.Copy(), 1);
  199. }
  200. if (_add.Number <= 0)
  201. {
  202. mEquipHolder.Stacks[i].Delete();
  203. mEquipHolder.ItemChanged(_changedItems);
  204. }
  205. _found = true;
  206. }
  207. }
  208. if(_playSound) SoundManager.Play2D("EquipOff");
  209. }
  210. public void Equip(string _tag, int _uid, InventoryItem _equipSlot, int _index)
  211. {
  212. UnEquip(_tag, _uid,false);
  213. Dictionary<Item, int> _changedItems = new Dictionary<Item, int>();
  214. _changedItems.Add(mInventoryHolder.Stacks[_index].Item, 1);
  215. if ( mInventoryHolder.Stacks[_index].GetItemId() == _uid)
  216. {
  217. mInventoryHolder.Stacks[_index].Set(_equipSlot.StackData.Merge(mInventoryHolder.Stacks[_index]));
  218. }
  219. mEquipHolder.ItemChanged(_changedItems);
  220. SoundManager.Play2D("EquipOn");
  221. }
  222. public override void Update()
  223. {
  224. if (!inited) return;
  225. if (WindowsManager.isWindowOpen(mInventoryHolder))
  226. {
  227. if (WindowsManager.getOpenedWindow(mInventoryHolder).GetComponent<ItemContainer>())
  228. WindowsManager.getOpenedWindow(mInventoryHolder).transform.position = InventoryAnchor.position;
  229. }
  230. if (ItemDragManager.isDragging)
  231. {
  232. if (!ItemDragManager.DraggingSource.transform.IsChildOf(transform) && ItemDragManager.DraggingSource.Type== ItemIcon.IconType.Item)
  233. {
  234. foreach (var obj in EquipItems) {
  235. if (ItemDragManager.DraggingSource.isTagMatchText(obj.LimitedByTag))
  236. {
  237. wasDragging = true;
  238. obj.ToggleOutline(true);
  239. }
  240. }
  241. }
  242. }
  243. else
  244. {
  245. if (wasDragging)
  246. {
  247. wasDragging = false;
  248. foreach (var obj in EquipItems) obj.ToggleOutline(false);
  249. }
  250. }
  251. base.Update();
  252. }
  253. }
  254. }