CraftingUi.cs 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. namespace SoftKitty.InventoryEngine
  6. {
  7. public class CraftingUi : UiWindow
  8. {
  9. #region Variables
  10. public RectTransform HoverAnchorPoint;
  11. public Text TitleText;
  12. public Button[] TabButtons;
  13. public GameObject[] TabPanels;
  14. public GameObject InventoryPrefab;
  15. public RectTransform InventoryRect;
  16. public CurrenyInfo CurrencyPrefab;
  17. [Header("<< Crafting >>")]
  18. public bool EnableCrafting = true;
  19. public float CraftingTimeMultiplier = 1F;
  20. public GameObject BlueprintPrefab;
  21. public Text CraftingResultNumber;
  22. public ItemIcon[] CraftingMaterialItems;
  23. public Text[] CraftingMaterialNumText;
  24. public Image[] CraftingMaterialIndicators;
  25. public ItemIcon CraftingResultItem;
  26. public InputField SearchField;
  27. public RectTransform CraftingProgressRoot;
  28. public RectTransform CraftingProgressBar;
  29. public CanvasGroup CraftButton;
  30. public GameObject ClearSearchButton;
  31. public NumberPanel CraftingNumberPanel;
  32. [Header("<< Enhancing >>")]
  33. public bool EnableEnhancing = true;
  34. public LinkIcon EnhancingResultItem;
  35. public ItemIcon[] EnhancingMaterialItems;
  36. public Text[] EnhancingMaterialNumText;
  37. public Image[] EnhancingMaterialIndicators;
  38. public CurrenyInfo EnhancingCurrencyCost;
  39. public CanvasGroup EnhancingButton;
  40. public RectTransform EnhancingProgressRoot;
  41. public RectTransform EnhancingProgressBar;
  42. public Text EnhancingButtonText;
  43. [Header("<< Enchanting >>")]
  44. public bool EnableEnchanting = true;
  45. public LinkIcon EnchantResultItem;
  46. public ItemIcon EnchantMaterialItem;
  47. public Text EnchantMaterialNumText;
  48. public Image EnchantMaterialIndicator;
  49. public CurrenyInfo EnchantCurrencyCost;
  50. public CanvasGroup EnchantButton;
  51. public RectTransform EnchantProgressRoot;
  52. public RectTransform EnchantProgressBar;
  53. public Text[] EnchantmentDetailTexts;
  54. public Text NoEnchantmentText;
  55. [Header("<< Socketing >>")]
  56. public bool EnableSocketing = true;
  57. public LinkIcon SocketingResultItem;
  58. public LinkIcon [] SocketingMaterialItem;
  59. public GameObject NoSlotText;
  60. private InventoryHolder Holder;
  61. private InventoryItem[] Items;
  62. private int SelectedTab = 0;
  63. private bool Crafting = false;
  64. private List<ItemIcon> BluePrintList=new List<ItemIcon>();
  65. private List<Vector2> CraftingMaterialRequired = new List<Vector2>();
  66. private int SelectedBlueprint = -1;
  67. private Item EnhancingItem = null;
  68. private Item EnchantItem = null;
  69. private Item SocketingItem = null;
  70. private bool inited = false;
  71. private int CraftNumber = 0;
  72. public InventoryHolder SocketingHolder;
  73. public Image BlockImage;
  74. #endregion
  75. #region Internal Methods
  76. public override void Update()
  77. {
  78. if (!inited) return;
  79. InventoryRect.anchoredPosition = Vector2.Lerp(InventoryRect.anchoredPosition, new Vector2(SelectedTab == 0 ? 90.5F : 0F, -82F), Time.deltaTime * 20F);
  80. InventoryRect.sizeDelta = Vector2.Lerp(InventoryRect.sizeDelta, new Vector2(SelectedTab == 0 ? -189F : -55F, -254.5F), Time.deltaTime * 20F);
  81. switch (SelectedTab)
  82. {
  83. case 0://Crafting
  84. Crafting = Holder.isCrafting();
  85. CraftingNumberPanel.Enabled = !Crafting;
  86. if (Crafting)
  87. {
  88. CraftingSync();
  89. }
  90. else if (CraftNumber != CraftingNumberPanel.GetNumber()) {
  91. CraftNumber = CraftingNumberPanel.GetNumber();
  92. RefreshCraftingArea();
  93. RefreshInventoryItems();
  94. }
  95. break;
  96. case 1://Enchancing
  97. if (EnhancingResultItem.GetItem() != EnhancingItem)
  98. {
  99. EnhancingItem = EnhancingResultItem.GetItem();
  100. RefreshEnhancingArea();
  101. }
  102. break;
  103. case 2://Enchanting
  104. if (EnchantResultItem.GetItem() != EnchantItem)
  105. {
  106. EnchantItem = EnchantResultItem.GetItem();
  107. RefreshEnchantingArea();
  108. }
  109. break;
  110. case 3://Socketing
  111. if (SocketingResultItem.GetItem() != SocketingItem)
  112. {
  113. SocketingItem = SocketingResultItem.GetItem();
  114. RefreshSocketingArea();
  115. }
  116. break;
  117. }
  118. base.Update();
  119. CheckBlock();
  120. }
  121. private void CraftingSync()
  122. {
  123. CraftingProgressBar.localScale = new Vector3(Holder.GetCraftingProgress(), 1F, 1F);
  124. CraftingNumberPanel.SetNum(Holder.GetCraftingItemNumber() - Holder.GetCraftedItemNumber());
  125. CraftingResultItem.SetItemNumber(Holder.GetItemNumber(Holder.GetCraftingItemId()));
  126. if (Holder.GetCraftingProgress() >= 1F)
  127. {
  128. if (!Holder.GetCraftingFailed())
  129. {
  130. CraftingResultNumber.text = "+ 1";
  131. CraftingResultItem.GetComponentInChildren<Animation>().Stop();
  132. CraftingResultItem.GetComponentInChildren<Animation>().Play();
  133. SoundManager.Play2D("CraftSuccess");
  134. RefreshCraftingArea();
  135. RefreshInventoryItems();
  136. }
  137. }
  138. }
  139. private void CheckBlock()
  140. {
  141. if (NumberInput.instance != null)
  142. {
  143. BlockImage.gameObject.SetActive(true);
  144. BlockImage.color = new Color(0F, 0F, 0F, Mathf.Lerp(BlockImage.color.a, 0.94F, Time.deltaTime * 3F));
  145. }
  146. else
  147. {
  148. if (BlockImage.color.a > 0F)
  149. {
  150. BlockImage.color = new Color(0F, 0F, 0F, Mathf.MoveTowards(BlockImage.color.a, 0F, Time.deltaTime * 2F));
  151. }
  152. else
  153. {
  154. if (BlockImage.gameObject.activeSelf) BlockImage.gameObject.SetActive(false);
  155. }
  156. }
  157. }
  158. public void ClearFilter()
  159. {
  160. FilterBluePrint("");
  161. ClearSearchButton.SetActive(false);
  162. }
  163. private void FilterBluePrint(string _filter)
  164. {
  165. for (int i = 0; i < BluePrintList.Count; i++)
  166. {
  167. BluePrintList[i].SetVisible(_filter.Length <= 0 || ItemManager.itemDic[BluePrintList[i].GetItemId()].name.ToLower().Contains(_filter.ToLower()));
  168. }
  169. }
  170. public void OnSearchChange()
  171. {
  172. ClearSearchButton.SetActive(SearchField.text.Length > 0);
  173. FilterBluePrint(SearchField.text);
  174. }
  175. void CreateInventoryItems()
  176. {
  177. Items = new InventoryItem[Holder.Stacks.Count];
  178. for (int i = 0; i < Holder.Stacks.Count; i++)
  179. {
  180. GameObject _newItem = Instantiate(InventoryPrefab.gameObject, InventoryPrefab.transform.parent);
  181. _newItem.transform.localScale = Vector3.one;
  182. _newItem.GetComponent<InventoryItem>().Initialize(Holder.Stacks[i]);
  183. _newItem.GetComponent<InventoryItem>().SetHolder(Holder);
  184. _newItem.GetComponent<InventoryItem>().HoverInfoAnchorPoint = HoverAnchorPoint;
  185. _newItem.gameObject.SetActive(true);
  186. Items[i] = _newItem.GetComponent<InventoryItem>();
  187. Items[i].SetVisible(Holder.Stacks[i].GetType(GetFilterCategory()) == GetFilterCategory());
  188. _newItem.GetComponent<InventoryItem>().RegisterClickCallback(i, OnInventoryItemClick);
  189. }
  190. foreach (var obj in BluePrintList)
  191. {
  192. Destroy(obj.gameObject);
  193. }
  194. BluePrintList.Clear();
  195. for (int i = 0; i < Holder.HiddenStacks.Count; i++)
  196. {
  197. if (!Holder.HiddenStacks[i].isEmpty() && Holder.HiddenStacks[i].Item.isTagMatchText(ItemManager.instance.CraftingBlueprintTag))
  198. {
  199. if (Holder.HiddenStacks[i].Item.craftMaterials.Count > 0)
  200. {
  201. int _id = Mathf.FloorToInt(Holder.HiddenStacks[i].Item.craftMaterials[0].x);
  202. GameObject _newItem = Instantiate(BlueprintPrefab.gameObject, BlueprintPrefab.transform.parent);
  203. _newItem.transform.localScale = Vector3.one;
  204. _newItem.GetComponent<ItemIcon>().SetItemId(_id);
  205. _newItem.GetComponent<ItemIcon>().SetAppearance(ItemManager.itemDic[_id].Copy(), false, false);
  206. _newItem.GetComponent<ItemIcon>().HoverInfoAnchorPoint = HoverAnchorPoint;
  207. _newItem.GetComponent<ItemIcon>().RegisterClickCallback(BluePrintList.Count, OnBlueprintClick);
  208. _newItem.gameObject.SetActive(true);
  209. BluePrintList.Add(_newItem.GetComponent<ItemIcon>());
  210. }
  211. }
  212. }
  213. }
  214. void RefreshEnhancingArea()
  215. {
  216. bool _allMatch = (EnhancingItem != null && !EnhancingResultItem.isEmpty());
  217. for (int i = 0; i < ItemManager.instance.EnhancingMaterials.Length; i++)
  218. {
  219. int _id = Mathf.FloorToInt(ItemManager.instance.EnhancingMaterials[i].x);
  220. int _required = Mathf.FloorToInt(ItemManager.instance.EnhancingMaterials[i].y);
  221. int _num = Holder.GetItemNumber(_id);
  222. EnhancingMaterialItems[i].SetItemNumber(_num);
  223. EnhancingMaterialNumText[i].text = _num.ToString() + "/" + _required.ToString();
  224. if (_num >= _required)
  225. {
  226. EnhancingMaterialNumText[i].color = new Color(0.1F, 0.7F, 0.35F, 1F);
  227. }
  228. else
  229. {
  230. _allMatch = false;
  231. EnhancingMaterialNumText[i].color = new Color(1F, 0.3F, 0.3F, 1F);
  232. }
  233. EnhancingMaterialIndicators[i].color = EnhancingMaterialNumText[i].color;
  234. }
  235. if (Holder.GetCurrency(ItemManager.instance.EnhancingCurrencyType,true) < ItemManager.instance.EnhancingCurrencyNeed)
  236. {
  237. _allMatch = false;
  238. EnhancingCurrencyCost.SetColor(new Color(1F, 0.3F, 0.3F, 1F));
  239. }
  240. else
  241. {
  242. EnhancingCurrencyCost.RevertColor();
  243. }
  244. if (EnhancingItem != null && EnhancingItem.upgradeLevel >= ItemManager.instance.MaxiumEnhancingLevel)
  245. {
  246. EnhancingButtonText.text = "MAX";
  247. _allMatch = false;
  248. }
  249. else
  250. {
  251. EnhancingButtonText.text = "ENHANCE";
  252. }
  253. EnhancingButton.interactable = _allMatch;
  254. EnhancingButton.alpha = _allMatch ? 1F : 0.4F;
  255. }
  256. public void OnSocketingItemClick(int _index, int _button)
  257. {
  258. if (_button == 1)
  259. {
  260. SocketingResultItem.SetEmpty();
  261. SocketingItem = null;
  262. RefreshSocketingArea();
  263. SoundManager.Play2D("ItemDrop");
  264. }
  265. }
  266. public void OnSocketingMaterialInsert(int _index, Item _item)
  267. {
  268. if (SocketingItem != null && _item != null)
  269. {
  270. List<int> _sockets = new List<int>();
  271. _sockets.AddRange(SocketingResultItem.GetItem().socketedItems);
  272. if (_sockets[_index] == -1)
  273. {
  274. _sockets[_index] = _item.uid;
  275. Holder.FindItem(SocketingResultItem.GetItemId(), SocketingResultItem.GetItem().upgradeLevel, SocketingResultItem.GetItem().enchantments, SocketingResultItem.GetItem().socketedItems).ReplaceSocketing(_sockets);
  276. SocketingResultItem.GetItem().ReplaceSocketing(_sockets);
  277. Holder.RemoveItem(_item.uid, 1);
  278. RefreshSocketingArea();
  279. SoundManager.Play2D("EquipOff");
  280. Holder.ItemChanged(new Dictionary<Item, int>());
  281. }
  282. }
  283. }
  284. public void RemoveSocketingMaterial(int _id)
  285. {
  286. if (Holder.GetCurrency(ItemManager.instance.RemoveSocketingCurrency, true) >= ItemManager.instance.RemoveSocketingPrice) {
  287. Holder.AddCurrency(ItemManager.instance.RemoveSocketingCurrency,-ItemManager.instance.RemoveSocketingPrice);
  288. int _socketed = SocketingResultItem.GetItem().socketedItems[_id];
  289. List<int> _sockets = new List<int>();
  290. _sockets.AddRange(SocketingResultItem.GetItem().socketedItems);
  291. if (_sockets[_id]>=0) {
  292. _sockets[_id] = -1;
  293. Holder.FindItem(SocketingResultItem.GetItemId(), SocketingResultItem.GetItem().upgradeLevel, SocketingResultItem.GetItem().enchantments, SocketingResultItem.GetItem().socketedItems).ReplaceSocketing(_sockets);
  294. SocketingResultItem.GetItem().ReplaceSocketing(_sockets);
  295. if (_socketed >= 0 && !ItemManager.instance.DestroySocketItemWhenRemove) Holder.AddItem(new Item(_socketed));
  296. RefreshSocketingArea();
  297. SoundManager.Play2D("CraftFail");
  298. Holder.ItemChanged(new Dictionary<Item, int>());
  299. }
  300. }
  301. }
  302. public void UnlockSocketingSlot(int _id)
  303. {
  304. if (Holder.GetCurrency(ItemManager.instance.UnlockSocketingSlotsCurrency, true) >= ItemManager.instance.UnlockSocketingSlotsPrice)
  305. {
  306. Holder.AddCurrency(ItemManager.instance.UnlockSocketingSlotsCurrency, -ItemManager.instance.UnlockSocketingSlotsPrice);
  307. List<int> _sockets = new List<int>();
  308. _sockets.AddRange(SocketingResultItem.GetItem().socketedItems);
  309. if (_sockets[_id]==-2) {
  310. _sockets[_id] = -1;
  311. Holder.FindItem(SocketingResultItem.GetItemId(), SocketingResultItem.GetItem().upgradeLevel, SocketingResultItem.GetItem().enchantments, SocketingResultItem.GetItem().socketedItems).ReplaceSocketing(_sockets);
  312. SocketingResultItem.GetItem().ReplaceSocketing(_sockets);
  313. RefreshSocketingArea();
  314. SoundManager.Play2D("CraftSuccess");
  315. Holder.ItemChanged(new Dictionary<Item, int>());
  316. }
  317. }
  318. }
  319. void RefreshSocketingArea()
  320. {
  321. if (SocketingItem != null)
  322. {
  323. NoSlotText.SetActive(SocketingItem.socketedItems.Count == 0);
  324. for (int i = 0; i < SocketingMaterialItem.Length; i++)
  325. {
  326. if (i < SocketingItem.socketedItems.Count)
  327. {
  328. SocketingMaterialItem[i].gameObject.SetActive(true);
  329. SocketingMaterialItem[i].GetComponent<ListItem>().mButtons[0].gameObject.SetActive(SocketingItem.socketedItems[i] == -2);
  330. SocketingMaterialItem[i].GetComponent<ListItem>().mButtons[1].gameObject.SetActive(ItemManager.instance.EnableRemoveSocketing && SocketingItem.socketedItems[i] >= 0);
  331. SocketingMaterialItem[i].CanBeLinked = (SocketingItem.socketedItems[i] == -1);
  332. if (SocketingItem.socketedItems[i] >= 0)
  333. {
  334. if (ItemManager.instance.EnableRemoveSocketing)
  335. {
  336. SocketingMaterialItem[i].GetComponent<ListItem>().mButtons[1].interactable = Holder.GetCurrency(ItemManager.instance.RemoveSocketingCurrency, true) >= ItemManager.instance.RemoveSocketingPrice;
  337. SocketingMaterialItem[i].GetComponent<ListItem>().mTexts[1].color =
  338. SocketingMaterialItem[i].GetComponent<ListItem>().mButtons[1].interactable ? ItemManager.instance.currencies[ItemManager.instance.RemoveSocketingCurrency].color : Color.red;
  339. LayoutRebuilder.ForceRebuildLayoutImmediate(SocketingMaterialItem[i].GetComponent<ListItem>().mButtons[1].GetComponentInChildren<HorizontalLayoutGroup>(true).GetComponent<RectTransform>());
  340. }
  341. Item _item = ItemManager.itemDic[SocketingItem.socketedItems[i]].Copy();
  342. SocketingMaterialItem[i].Initialize(_item, false);
  343. }
  344. else
  345. {
  346. if (SocketingItem.socketedItems[i] == -2)
  347. {
  348. SocketingMaterialItem[i].GetComponent<ListItem>().mButtons[0].interactable = Holder.GetCurrency(ItemManager.instance.UnlockSocketingSlotsCurrency, true) >= ItemManager.instance.UnlockSocketingSlotsPrice;
  349. SocketingMaterialItem[i].GetComponent<ListItem>().mTexts[0].color =
  350. SocketingMaterialItem[i].GetComponent<ListItem>().mButtons[0].interactable ? ItemManager.instance.currencies[ItemManager.instance.UnlockSocketingSlotsCurrency].color : Color.red;
  351. LayoutRebuilder.ForceRebuildLayoutImmediate(SocketingMaterialItem[i].GetComponent<ListItem>().mButtons[0].GetComponentInChildren<HorizontalLayoutGroup>(true).GetComponent<RectTransform>());
  352. }
  353. SocketingMaterialItem[i].SetEmpty();
  354. }
  355. }
  356. else
  357. {
  358. SocketingMaterialItem[i].gameObject.SetActive(false);
  359. }
  360. }
  361. }
  362. else
  363. {
  364. NoSlotText.SetActive(false);
  365. for (int i = 0; i < SocketingMaterialItem.Length; i++)
  366. {
  367. SocketingMaterialItem[i].SetEmpty();
  368. SocketingMaterialItem[i].gameObject.SetActive(false);
  369. }
  370. }
  371. RefreshInventoryItems();
  372. }
  373. void RefreshEnchantingArea()
  374. {
  375. bool _allMatch = (EnchantItem != null && !EnchantResultItem.isEmpty());
  376. int _id = Mathf.FloorToInt(ItemManager.instance.EnchantingMaterial.x);
  377. int _required = Mathf.FloorToInt(ItemManager.instance.EnchantingMaterial.y);
  378. int _num = Holder.GetItemNumber(_id);
  379. EnchantMaterialItem.SetItemNumber(_num);
  380. EnchantMaterialNumText.text = _num.ToString() + "/" + _required.ToString();
  381. if (_num >= _required)
  382. {
  383. EnchantMaterialNumText.color = new Color(0.1F, 0.7F, 0.35F, 1F);
  384. }
  385. else
  386. {
  387. _allMatch = false;
  388. EnchantMaterialNumText.color = new Color(1F, 0.3F, 0.3F, 1F);
  389. }
  390. EnchantMaterialIndicator.color = EnchantMaterialNumText.color;
  391. if (Holder.GetCurrency(ItemManager.instance.EnchantingCurrencyType,true) < ItemManager.instance.EnchantingCurrencyNeed)
  392. {
  393. _allMatch = false;
  394. EnchantCurrencyCost.SetColor(new Color(1F, 0.3F, 0.3F, 1F));
  395. }
  396. else
  397. {
  398. EnchantCurrencyCost.RevertColor();
  399. }
  400. NoEnchantmentText.gameObject.SetActive(EnchantItem != null && EnchantItem.enchantments.Count <= 0);
  401. for (int i = 0; i < EnchantmentDetailTexts.Length; i++)
  402. {
  403. EnchantmentDetailTexts[i].gameObject.SetActive(EnchantItem != null && i < EnchantItem.enchantments.Count);
  404. if (EnchantItem != null && i < EnchantItem.enchantments.Count)
  405. {
  406. EnchantmentDetailTexts[i].text = ItemManager.enchantmentDic[EnchantItem.enchantments[i]].GetDescription();
  407. }
  408. }
  409. EnchantButton.interactable = _allMatch;
  410. EnchantButton.alpha = _allMatch ? 1F : 0.4F;
  411. }
  412. void RefreshInventoryItems()
  413. {
  414. for (int i = 0; i < Holder.Stacks.Count; i++)
  415. {
  416. Items[i].SetVisible((SelectedTab==0 || Holder.Stacks[i].GetType(GetFilterCategory()) == GetFilterCategory()) && TagFilter(Holder.Stacks[i]));
  417. Items[i].Draggable = Items[i].Visible;
  418. }
  419. }
  420. void RefreshCraftingArea()
  421. {
  422. if (SelectedBlueprint == -1) return;
  423. bool _allMatch = true;
  424. for (int i = 0; i < CraftingMaterialItems.Length; i++)
  425. {
  426. if (CraftingMaterialItems[i].gameObject.activeSelf)
  427. {
  428. int _num = Holder.GetItemNumber(Mathf.FloorToInt(CraftingMaterialRequired[i].x));
  429. int _required = Mathf.FloorToInt(CraftingMaterialRequired[i].y) * CraftingNumberPanel.GetNumber();
  430. CraftingMaterialNumText[i].text = _num.ToString() + "/" + _required.ToString();
  431. CraftingMaterialItems[i].SetItemNumber(_num);
  432. if (_num >= _required)
  433. {
  434. CraftingMaterialNumText[i].color = new Color(0.1F, 0.7F, 0.35F, 1F);
  435. }
  436. else
  437. {
  438. _allMatch = false;
  439. CraftingMaterialNumText[i].color = new Color(1F, 0.3F, 0.3F, 1F);
  440. }
  441. CraftingMaterialIndicators[i].color = CraftingMaterialNumText[i].color;
  442. }
  443. }
  444. CraftingResultItem.SetItemNumber(Holder.GetItemNumber(BluePrintList[SelectedBlueprint].GetItemId()));
  445. CraftButton.interactable = _allMatch;
  446. CraftButton.alpha = _allMatch ? 1F : 0.4F;
  447. }
  448. #endregion
  449. public override void Initialize(InventoryHolder _inventoryHolder, InventoryHolder _equipHolder, string _name = "Forge")//Initialize this interface
  450. {
  451. Holder = _inventoryHolder;
  452. TitleText.text = _name;
  453. CreateInventoryItems();
  454. CraftingResultItem.SetEmpty();
  455. CraftingResultItem.HoverInfoAnchorPoint = HoverAnchorPoint;
  456. TabButtons[0].gameObject.SetActive(ItemManager.instance.EnableCrafting && EnableCrafting);
  457. TabButtons[1].gameObject.SetActive(ItemManager.instance.EnableEnhancing && EnableEnhancing);
  458. TabButtons[2].gameObject.SetActive(ItemManager.instance.EnableEnchanting && EnableEnchanting);
  459. TabButtons[3].gameObject.SetActive(ItemManager.instance.EnableSocketing && EnableSocketing);
  460. int _defaultTab = -1;
  461. if (ItemManager.instance.EnableCrafting && EnableCrafting)
  462. {
  463. _defaultTab = 0;
  464. }
  465. else if (ItemManager.instance.EnableEnhancing && EnableEnhancing) {
  466. _defaultTab = 1;
  467. }
  468. else if (ItemManager.instance.EnableEnchanting && EnableEnchanting)
  469. {
  470. _defaultTab = 2;
  471. }
  472. else if (ItemManager.instance.EnableSocketing && EnableSocketing)
  473. {
  474. _defaultTab = 3;
  475. }
  476. foreach (ItemIcon obj in CraftingMaterialItems) {
  477. obj.SetEmpty();
  478. obj.HoverInfoAnchorPoint = HoverAnchorPoint;
  479. obj.SetItemNumber(0);
  480. obj.Outline.color = InventorySkin.instance.ItemSelectedColor;
  481. obj.Fav.GetComponent<Image>().color = InventorySkin.instance.FavoriteColor;
  482. }
  483. for (int i = 0; i < ItemManager.instance.EnhancingMaterials.Length; i++)
  484. {
  485. int _id = Mathf.FloorToInt(ItemManager.instance.EnhancingMaterials[i].x);
  486. EnhancingMaterialItems[i].SetAppearance(ItemManager.itemDic[_id].Copy(), true);
  487. EnhancingMaterialItems[i].SetItemId(_id);
  488. EnhancingMaterialItems[i].HoverInfoAnchorPoint = HoverAnchorPoint;
  489. EnhancingMaterialItems[i].Outline.color = InventorySkin.instance.ItemSelectedColor;
  490. EnhancingMaterialItems[i].Fav.GetComponent<Image>().color = InventorySkin.instance.FavoriteColor;
  491. }
  492. EnhancingCurrencyCost.Initialize(ItemManager.instance.EnhancingCurrencyType,Holder,false);
  493. EnhancingCurrencyCost.SetValue(ItemManager.instance.EnhancingCurrencyNeed);
  494. EnhancingResultItem.Initialize(null, true);
  495. EnhancingResultItem.SetItemNumber(0);
  496. EnhancingResultItem.RegisterClickCallback(0,OnEnhancingItemClick);
  497. int _enchantId = Mathf.FloorToInt(ItemManager.instance.EnchantingMaterial.x);
  498. EnchantMaterialItem.SetAppearance(ItemManager.itemDic[_enchantId].Copy(), true);
  499. EnchantMaterialItem.SetItemId(_enchantId);
  500. EnchantMaterialItem.HoverInfoAnchorPoint = HoverAnchorPoint;
  501. EnchantMaterialItem.Outline.color = InventorySkin.instance.ItemSelectedColor;
  502. EnchantMaterialItem.Fav.GetComponent<Image>().color = InventorySkin.instance.FavoriteColor;
  503. EnchantCurrencyCost.Initialize(ItemManager.instance.EnchantingCurrencyType, Holder, false);
  504. EnchantCurrencyCost.SetValue(ItemManager.instance.EnchantingCurrencyNeed);
  505. EnchantResultItem.Initialize(null, true);
  506. EnchantResultItem.SetItemNumber(0);
  507. EnchantResultItem.RegisterClickCallback(0, OnEnchantingItemClick);
  508. SocketingResultItem.Initialize(null, true);
  509. SocketingResultItem.SetItemNumber(0);
  510. SocketingResultItem.RegisterClickCallback(0, OnSocketingItemClick);
  511. for (int i = 0; i < SocketingMaterialItem.Length; i++)
  512. {
  513. SocketingMaterialItem[i].Initialize(null, true);
  514. SocketingMaterialItem[i].SetItemNumber(0);
  515. SocketingMaterialItem[i].LimitedByTag=ItemManager.instance.SocketingTagFilter;
  516. SocketingMaterialItem[i].SetHolder(SocketingHolder);
  517. SocketingMaterialItem[i].RegisterLinkedCallback(i,OnSocketingMaterialInsert);
  518. SocketingMaterialItem[i].GetComponent<ListItem>().mImages[1].sprite = ItemManager.instance.currencies[ItemManager.instance.RemoveSocketingCurrency].icon;
  519. SocketingMaterialItem[i].GetComponent<ListItem>().mTexts[1].text = ItemManager.instance.RemoveSocketingPrice.ToString();
  520. SocketingMaterialItem[i].GetComponent<ListItem>().mImages[0].sprite = ItemManager.instance.currencies[ItemManager.instance.UnlockSocketingSlotsCurrency].icon;
  521. SocketingMaterialItem[i].GetComponent<ListItem>().mTexts[0].text = ItemManager.instance.UnlockSocketingSlotsPrice.ToString();
  522. }
  523. for (int i = 0; i < Holder.Currency.Count; i++)
  524. {
  525. GameObject _newItem = Instantiate(CurrencyPrefab.gameObject, CurrencyPrefab.transform.parent);
  526. _newItem.transform.localScale = Vector3.one;
  527. _newItem.SetActive(true);
  528. _newItem.GetComponent<CurrenyInfo>().Initialize(i, Holder);
  529. }
  530. if(_defaultTab>-1) SwitchTab(_defaultTab);
  531. Holder.RegisterItemChangeCallback(OnMaterialChange);
  532. inited = true;
  533. }
  534. public void OnEnhancingItemClick(int _index, int _button)
  535. {
  536. if (_button == 1)
  537. {
  538. EnhancingResultItem.SetEmpty();
  539. RefreshEnhancingArea();
  540. }
  541. }
  542. public void OnEnchantingItemClick(int _index, int _button)
  543. {
  544. if (_button == 1)
  545. {
  546. EnchantResultItem.SetEmpty();
  547. RefreshEnchantingArea();
  548. }
  549. }
  550. public void OnInventoryItemClick(int _index, int _button)//Callback for when player click an item
  551. {
  552. if (_button == 0) return;
  553. int _id = Holder.Stacks[_index].GetItemId();
  554. if (_id>=0 && (SelectedTab==1 && ItemManager.itemDic[_id].type==ItemManager.instance.EnhancingCategoryID)
  555. || (SelectedTab == 2 && ItemManager.itemDic[_id].type == ItemManager.instance.EnchantingCategoryID)
  556. || (SelectedTab == 3 && ItemManager.itemDic[_id].type == ItemManager.instance.SocketedCategoryFilter))
  557. {
  558. if (SelectedTab == 1)
  559. {
  560. EnhancingResultItem.LinkItem(Holder, Holder.Stacks[_index].Item, Holder.Stacks[_index].Number, Holder.Stacks[_index].Empty);
  561. }
  562. else if(SelectedTab == 2)
  563. {
  564. EnchantResultItem.LinkItem(Holder, Holder.Stacks[_index].Item, Holder.Stacks[_index].Number, Holder.Stacks[_index].Empty);
  565. }
  566. else if(SelectedTab == 3 && SocketingItem==null)
  567. {
  568. SocketingResultItem.LinkItem(Holder, Holder.Stacks[_index].Item, Holder.Stacks[_index].Number, Holder.Stacks[_index].Empty);
  569. }
  570. SoundManager.Play2D("ItemDrop");
  571. }
  572. }
  573. private void OnDestroy()//UnRegister the callback when this window is destroyed
  574. {
  575. Holder.UnRegisterItemChangeCallback(OnMaterialChange);
  576. }
  577. public void SwitchTab(int _tab)//Swith between [Crafting] [Enhancing] [Enchanting] Modes
  578. {
  579. if (Crafting) return;
  580. SelectedTab = _tab;
  581. for (int i=0;i<TabButtons.Length;i++) {
  582. TabButtons[i].interactable = (i != SelectedTab);
  583. TabPanels[i].SetActive(i == SelectedTab);
  584. RefreshInventoryItems();
  585. }
  586. switch (SelectedTab)
  587. {
  588. case 0:
  589. for (int i = 0; i < BluePrintList.Count; i++)
  590. {
  591. if (Holder.isCrafting() && BluePrintList[i].GetItemId() == Holder.GetCraftingItemId())
  592. {
  593. BluePrintList[i].OnLeftClick();
  594. }
  595. }
  596. RefreshCraftingArea();
  597. break;
  598. case 1:
  599. RefreshEnhancingArea();
  600. break;
  601. case 2:
  602. RefreshEnchantingArea();
  603. break;
  604. case 3:
  605. RefreshSocketingArea();
  606. break;
  607. }
  608. SoundManager.Play2D("CraftSwitch");
  609. }
  610. private int GetFilterCategory()//Get the CategoryID of current mode.
  611. {
  612. switch (SelectedTab)
  613. {
  614. case 0:
  615. return ItemManager.instance.CraftingMaterialCategoryID;
  616. case 1:
  617. return ItemManager.instance.EnhancingCategoryID;
  618. case 2:
  619. return ItemManager.instance.EnchantingCategoryID;
  620. case 3:
  621. return SocketingItem==null?ItemManager.instance.SocketedCategoryFilter: ItemManager.instance.SocketingCategoryFilter;
  622. }
  623. return ItemManager.instance.CraftingMaterialCategoryID;
  624. }
  625. private bool TagFilter(InventoryStack _stack)
  626. {
  627. if (SelectedTab==3 && SocketingItem!=null)
  628. {
  629. bool _anyTagMatchs = false;
  630. foreach (string obj in SocketingItem.socketingTag) {
  631. if (_stack.isTagMatchText(obj)) _anyTagMatchs = true;
  632. }
  633. return _stack.isTagMatchText(ItemManager.instance.SocketingTagFilter) && _anyTagMatchs;
  634. }
  635. return true;
  636. }
  637. public void OnBlueprintClick(int _index, int _button)//When player click a blueprint
  638. {
  639. if (Crafting) return;
  640. SelectedBlueprint = _index;
  641. SoundManager.Play2D("paper");
  642. for (int i=0;i< BluePrintList.Count;i++) {
  643. BluePrintList[i].ToggleOutline(i== SelectedBlueprint);
  644. }
  645. CraftingResultItem.SetAppearance(ItemManager.itemDic[BluePrintList[SelectedBlueprint].GetItemId()],true,false);
  646. CraftingResultItem.SetItemId(BluePrintList[SelectedBlueprint].GetItemId());
  647. CraftingNumberPanel.Initialize(1, ItemManager.itemDic[BluePrintList[SelectedBlueprint].GetItemId()].maxiumStack);
  648. CraftingMaterialRequired.Clear();
  649. CraftingMaterialRequired.AddRange( ItemManager.itemDic[BluePrintList[SelectedBlueprint].GetItemId()].craftMaterials);
  650. for (int i=0;i< CraftingMaterialItems.Length;i++) {
  651. if (i < CraftingMaterialRequired.Count)
  652. {
  653. CraftingMaterialItems[i].SetAppearance(ItemManager.itemDic[Mathf.FloorToInt(CraftingMaterialRequired[i].x)],true,false);
  654. CraftingMaterialItems[i].SetItemId(Mathf.FloorToInt(CraftingMaterialRequired[i].x));
  655. CraftingMaterialItems[i].gameObject.SetActive(true);
  656. CraftingMaterialNumText[i].gameObject.SetActive(true);
  657. CraftingMaterialIndicators[i].gameObject.SetActive(true);
  658. }
  659. else
  660. {
  661. CraftingMaterialItems[i].SetEmpty();
  662. CraftingMaterialItems[i].gameObject.SetActive(false);
  663. CraftingMaterialNumText[i].gameObject.SetActive(false);
  664. CraftingMaterialIndicators[i].gameObject.SetActive(false);
  665. }
  666. }
  667. CraftingProgressRoot.sizeDelta = new Vector2(93F+ (CraftingMaterialRequired.Count-1)*82F, 25F);
  668. RefreshCraftingArea();
  669. RefreshInventoryItems();
  670. }
  671. public void OnMaterialChange(Dictionary<Item, int> _changedItems)//Callback for when player's inventory has changed.
  672. {
  673. RefreshInventoryItems();
  674. switch (SelectedTab)
  675. {
  676. case 0:
  677. RefreshCraftingArea();
  678. break;
  679. case 1:
  680. RefreshEnhancingArea();
  681. break;
  682. case 2:
  683. RefreshEnchantingArea();
  684. break;
  685. case 3:
  686. RefreshSocketingArea();
  687. break;
  688. }
  689. }
  690. public void Craft()//Start to Craft an item
  691. {
  692. if (!Crafting)
  693. {
  694. SoundManager.Play2D("DoCraft");
  695. List<Vector2> _mats = new List<Vector2>();
  696. for (int i = 0; i < CraftingMaterialItems.Length; i++)
  697. {
  698. if (CraftingMaterialItems[i].gameObject.activeSelf)
  699. {
  700. _mats.Add(CraftingMaterialRequired[i]);
  701. }
  702. }
  703. Holder.StartCrafting(BluePrintList[SelectedBlueprint].GetItemId(), CraftingNumberPanel.GetNumber(), _mats, ItemManager.instance.CraftingTime * CraftingTimeMultiplier);
  704. }
  705. }
  706. public void Enhance()//Start to enhance an item
  707. {
  708. if (!Crafting) StartCoroutine(EnhanceCo());
  709. }
  710. IEnumerator EnhanceCo()//IEnumerator for Enhancing
  711. {
  712. Crafting = true;
  713. SoundManager.Play2D("DoCraft");
  714. float _progress = 0F;
  715. while (_progress < 1F)
  716. {
  717. yield return 1;
  718. _progress = Mathf.MoveTowards(_progress, 1F, Time.deltaTime * (1F / ItemManager.instance.EnhancingTime));
  719. EnhancingProgressBar.localScale = new Vector3(_progress, 1F, 1F);
  720. }
  721. yield return 1;
  722. for (int i = 0; i < ItemManager.instance.EnhancingMaterials.Length; i++)
  723. {
  724. Holder.RemoveItem(Mathf.FloorToInt(ItemManager.instance.EnhancingMaterials[i].x), Mathf.FloorToInt(ItemManager.instance.EnhancingMaterials[i].y));
  725. }
  726. Holder.AddCurrency(ItemManager.instance.EnhancingCurrencyType, -ItemManager.instance.EnhancingCurrencyNeed);
  727. EnhancingResultItem.GetComponentInChildren<Animation>().Stop();
  728. if (Random.Range(0, 100) < ItemManager.instance.EnhancingSuccessCurve.Evaluate(EnhancingResultItem.GetItem().upgradeLevel * 1F / ItemManager.instance.MaxiumEnhancingLevel))
  729. {
  730. EnhancingResultItem.GetComponentInChildren<Animation>().Play("CraftingSuccess");
  731. int _level= Holder.FindItem(EnhancingResultItem.GetItemId(), EnhancingResultItem.GetItem().upgradeLevel, EnhancingResultItem.GetItem().enchantments, EnhancingResultItem.GetItem().socketedItems).Upgrade();
  732. EnhancingResultItem.GetItem().upgradeLevel=_level;
  733. DynamicMsg.PopItem(EnhancingResultItem.GetItem());
  734. SoundManager.Play2D("CraftSuccess");
  735. }
  736. else
  737. {
  738. EnhancingResultItem.GetComponentInChildren<Animation>().Play("CraftingFailed");
  739. if (ItemManager.instance.DestroyEquipmentWhenFail && EnhancingResultItem.GetItem().upgradeLevel >= ItemManager.instance.DestroyEquipmentWhenFailLevel)
  740. {
  741. string _name = EnhancingResultItem.GetItem().nameWithAffixing + (EnhancingResultItem.GetItem().upgradeLevel > 0 ? "+" + EnhancingResultItem.GetItem().upgradeLevel.ToString() : "");
  742. Holder.DeleteItem(EnhancingResultItem.GetItemId(), EnhancingResultItem.GetItem().upgradeLevel, EnhancingResultItem.GetItem().enchantments, EnhancingResultItem.GetItem().socketedItems);
  743. EnhancingResultItem.SetEmpty();
  744. DynamicMsg.PopMsg("Failed! [ <color=#FFA209>" + _name + "</color> ] break into pieces.");
  745. }
  746. SoundManager.Play2D("CraftFail");
  747. }
  748. Holder.ItemChanged(new Dictionary<Item, int>());
  749. Crafting = false;
  750. RefreshEnhancingArea();
  751. RefreshInventoryItems();
  752. }
  753. public void Enchant()//Start to enchant an item
  754. {
  755. if (!Crafting) StartCoroutine(EnchantCo());
  756. }
  757. IEnumerator EnchantCo()//IEnumerator for Enchanting
  758. {
  759. Crafting = true;
  760. SoundManager.Play2D("DoCraft");
  761. float _progress = 0F;
  762. while (_progress < 1F)
  763. {
  764. yield return 1;
  765. _progress = Mathf.MoveTowards(_progress, 1F, Time.deltaTime * (1F/ ItemManager.instance.EnchantingTime));
  766. EnchantProgressBar.localScale = new Vector3(_progress, 1F, 1F);
  767. }
  768. yield return 1;
  769. Holder.RemoveItem(Mathf.FloorToInt(ItemManager.instance.EnchantingMaterial.x), Mathf.FloorToInt(ItemManager.instance.EnchantingMaterial.y));
  770. Holder.AddCurrency(ItemManager.instance.EnchantingCurrencyType, -ItemManager.instance.EnchantingCurrencyNeed);
  771. EnchantResultItem.GetComponentInChildren<Animation>().Stop();
  772. if (Random.Range(0, 100) < ItemManager.instance.EnchantingSuccessRate)
  773. {
  774. EnchantResultItem.GetComponentInChildren<Animation>().Play("CraftingSuccess");
  775. int _count = Random.Range(Mathf.FloorToInt(ItemManager.instance.EnchantmentNumberRange.x), Mathf.FloorToInt(ItemManager.instance.EnchantmentNumberRange.y));
  776. List<int> _newEnchantments = new List<int>();
  777. for (int i = 0; i < _count; i++) {
  778. int _uid = Random.Range(0, ItemManager.enchantmentDic.Count);
  779. if(!_newEnchantments.Contains(_uid)) _newEnchantments.Add(_uid);
  780. }
  781. Holder.FindItem(EnchantResultItem.GetItemId(), EnchantResultItem.GetItem().upgradeLevel, EnchantResultItem.GetItem().enchantments, EnchantResultItem.GetItem().socketedItems).ReplaceEnchantment(_newEnchantments);
  782. EnchantResultItem.GetItem().ReplaceEnchantment(_newEnchantments);
  783. SoundManager.Play2D("CraftSuccess");
  784. }
  785. else
  786. {
  787. EnchantResultItem.GetComponentInChildren<Animation>().Play("CraftingFailed");
  788. SoundManager.Play2D("CraftFail");
  789. }
  790. Holder.ItemChanged(new Dictionary<Item, int>());
  791. Crafting = false;
  792. RefreshEnchantingArea();
  793. RefreshInventoryItems();
  794. }
  795. }
  796. }