ItemApproachScanner.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using GFGGame;
  4. using System;
  5. namespace GFGEditor
  6. {
  7. /// <summary>
  8. /// 物品获取途径扫描器:扫描获取途径,并填入物品表的获取途径字段
  9. /// </summary>
  10. public class ItemApproachScanner
  11. {
  12. private delegate string GetApproachCall(int itemId);
  13. public static void startScan()
  14. {
  15. ItemCfgArray itemManager = ItemCfgArray.Instance;
  16. if (itemManager != null)
  17. {
  18. ItemCfg[] dataArray = itemManager.dataArray;
  19. GetApproachCall[] actions = new GetApproachCall[] { GetClothingShopApproach, GetZhaiXingApproach, GetStoryLevelApproach, GetClothingSyntheticApproach, GetSuitGuideApproach, GetSuitSyntheticApproach };
  20. foreach (ItemCfg cfg in dataArray)
  21. {
  22. //HandleItemType(cfg);
  23. HandleItemApproch(cfg, actions);
  24. }
  25. SQLiteHelper.Instance.OpenConnection();
  26. try
  27. {
  28. foreach (ItemCfg cfg in dataArray)
  29. {
  30. var names = new string[] { nameof(cfg.subType), nameof(cfg.itemType), nameof(cfg.approach) };
  31. var values = new string[] { "" + cfg.subType, "" + cfg.itemType, "" + cfg.approach };
  32. SQLiteHelper.Instance.UpdateValues(nameof(ItemCfgArray), names, values, nameof(cfg.id), cfg.id.ToString());
  33. }
  34. }
  35. catch (Exception e)
  36. {
  37. ET.Log.Error(e.ToString());
  38. }
  39. finally
  40. {
  41. SQLiteHelper.Instance.CloseConnection();
  42. }
  43. }
  44. }
  45. private static void HandleItemApproch(ItemCfg cfg, GetApproachCall[] actions)
  46. {
  47. List<string> approachs = new List<string>();
  48. foreach (GetApproachCall action in actions)
  49. {
  50. string tempApproach = action(cfg.id);
  51. if (tempApproach != null)
  52. {
  53. approachs.Add(tempApproach);
  54. }
  55. }
  56. if (approachs.Count > 0)
  57. {
  58. string approach = string.Join(";", approachs);
  59. cfg.approach = approach;
  60. if (approachs.Count > 5)
  61. {
  62. Debug.LogFormat("物品{0}的获取途径为 {1}", cfg.name, approach);
  63. }
  64. }
  65. else
  66. {
  67. if (cfg.id < 1000000 || cfg.id >= 2000000)
  68. {
  69. if ((!cfg.name.Contains("原始") && !cfg.name.Contains("默认")) || cfg.id >= 1000000)
  70. {
  71. //Debug.LogErrorFormat("物品 {0} {1} 没有获取途径", cfg.id, cfg.name);
  72. }
  73. }
  74. }
  75. }
  76. /// <summary>
  77. /// 尝试获取服装店产出途径
  78. /// </summary>
  79. /// <param name="itemId"></param>
  80. /// <returns></returns>
  81. private static string GetClothingShopApproach(int itemId)
  82. {
  83. ShopCfgClothingArray manager = ShopCfgClothingArray.Instance;
  84. ShopCfg[] dataArray = manager.dataArray;
  85. foreach (ShopCfg cfg in dataArray)
  86. {
  87. if (cfg.itemID == itemId)
  88. {
  89. return "FU_ZHUANG_DIAN";
  90. }
  91. }
  92. return null;
  93. }
  94. /// <summary>
  95. /// 尝试获取摘星(抽奖)产出途径
  96. /// </summary>
  97. /// <param name="itemId"></param>
  98. /// <returns></returns>
  99. private static string GetZhaiXingApproach(int itemId)
  100. {
  101. LuckyBoxCfgArray manager = LuckyBoxCfgArray.Instance;
  102. LuckyBoxCfg[] dataArray = manager.dataArray;
  103. if (itemId == 10090)
  104. {
  105. Debug.Log("");
  106. }
  107. foreach (LuckyBoxCfg cfg in dataArray)
  108. {
  109. for (int i = 0; i < cfg.bonusArr.Length; i++)
  110. {
  111. int dropId = cfg.bonusArr[i][0];
  112. bool approach = CheckDropApproach(itemId, dropId);
  113. if (approach)
  114. {
  115. return "ZHAI_XING";
  116. }
  117. }
  118. }
  119. return null;
  120. }
  121. /// <summary>
  122. /// 尝试获取剧情关卡产出途径
  123. /// </summary>
  124. /// <param name="itemId"></param>
  125. /// <returns></returns>
  126. private static string GetStoryLevelApproach(int itemId)
  127. {
  128. List<string> approachs = new List<string>();
  129. StoryLevelCfgArray manager = StoryLevelCfgArray.Instance;
  130. StoryLevelCfg[] dataArray = manager.dataArray;
  131. foreach (StoryLevelCfg cfg in dataArray)
  132. {
  133. bool result = CheckItemInBonus(itemId, cfg);
  134. if (result)
  135. {
  136. string approach = "JU_QING_GUAN_QIA=" + cfg.id;
  137. approachs.Add(approach);
  138. }
  139. }
  140. if (approachs.Count > 0)
  141. {
  142. return string.Join(";", approachs);
  143. }
  144. return null;
  145. }
  146. /// <summary>
  147. /// 尝试获取服装合成产出途径
  148. /// </summary>
  149. /// <param name="itemId"></param>
  150. /// <returns></returns>
  151. private static string GetClothingSyntheticApproach(int itemId)
  152. {
  153. SuitSyntheticMenuCfgArray manager = SuitSyntheticMenuCfgArray.Instance;
  154. SuitSyntheticMenuCfg[] dataArray = manager.dataArray;
  155. foreach (SuitSyntheticMenuCfg cfg in dataArray)
  156. {
  157. int suitId = CheckItemInSuit(itemId, cfg.suitIds);
  158. if (suitId > 0)
  159. {
  160. return "FU_ZHUANG_HE_CHENG=" + suitId;
  161. }
  162. }
  163. return null;
  164. }
  165. private static string GetSuitGuideApproach(int itemId)
  166. {
  167. SuitCfgArray manager = SuitCfgArray.Instance;
  168. SuitCfg[] dataArray = manager.dataArray;
  169. foreach (SuitCfg cfg in dataArray)
  170. {
  171. bool result = CheckItemInBonus(itemId, cfg.boxBonusArr);
  172. if (result)
  173. {
  174. return "TAO_ZHUANG_TU_JIAN";
  175. }
  176. }
  177. return null;
  178. }
  179. private static string GetSuitSyntheticApproach(int itemId)
  180. {
  181. SuitSyntheticCfgArray manager = SuitSyntheticCfgArray.Instance;
  182. SuitSyntheticCfg[] dataArray = manager.dataArray;
  183. foreach (SuitSyntheticCfg cfg in dataArray)
  184. {
  185. bool result = CheckItemInBonus(itemId, cfg.boxBonusArr);
  186. if (result)
  187. {
  188. return "TAO_ZHUANG_HE_CHENG";
  189. }
  190. }
  191. return null;
  192. }
  193. /// <summary>
  194. /// 检测掉落表是否产出该物品
  195. /// </summary>
  196. /// <param name="itemId"></param>
  197. /// <returns></returns>
  198. private static bool CheckDropApproach(int itemId, int dropId)
  199. {
  200. DropOutCfgArray manager = DropOutCfgArray.Instance;
  201. DropOutCfg[] dataArray = manager.GetCfgs(dropId);
  202. for (int i = 0; i < dataArray.Length; i++)
  203. {
  204. if (dataArray[i].item == itemId)
  205. {
  206. return true;
  207. }
  208. if (manager.GetCfgs(dataArray[i].item).Length > 0)
  209. {
  210. return CheckDropApproach(itemId, dataArray[i].item);
  211. }
  212. }
  213. return false;
  214. }
  215. private static bool CheckItemInBonus(int itemId, StoryLevelCfg cfg)
  216. {
  217. if (cfg.fightID.Length > 0)
  218. {
  219. StoryFightCfgArray manager = StoryFightCfgArray.Instance;
  220. StoryFightCfg storyFightCfg = manager.GetCfg(cfg.fightID);
  221. List<int[]> a = new List<int[]>();
  222. a.AddRange(cfg.bonusOnceArr);
  223. a.AddRange(storyFightCfg.bonusBaseArr);
  224. int[][] bonus = a.ToArray();
  225. bool result = CheckItemInBonus(itemId, bonus);
  226. if (result)
  227. {
  228. return true;
  229. }
  230. result = CheckItemInDropOut(itemId, storyFightCfg.bonusRandomArr);
  231. return result;
  232. }
  233. return false;
  234. }
  235. private static bool CheckItemInBonus(int itemId, int[][] bosnu)
  236. {
  237. List<ItemData> aList = ItemUtil.CreateItemDataList(bosnu);
  238. foreach (ItemData itemData in aList)
  239. {
  240. if (itemId == itemData.id)
  241. {
  242. return true;
  243. }
  244. }
  245. return false;
  246. }
  247. private static bool CheckItemInDropOut(int itemId, int[] dropIds)
  248. {
  249. List<ItemData> result = new List<ItemData>();
  250. foreach (int dropId in dropIds)
  251. {
  252. DropOutCfgArray manager = DropOutCfgArray.Instance;
  253. DropOutCfg[] aList = manager.GetCfgs(dropId);
  254. foreach (DropOutCfg dropOutCfg in aList)
  255. {
  256. if (itemId == dropOutCfg.item)
  257. {
  258. return true;
  259. }
  260. }
  261. }
  262. return false;
  263. }
  264. private static int CheckItemInSuit(int ItemId, string suitIds)
  265. {
  266. if (suitIds.Length > 0)
  267. {
  268. string[] aArray = suitIds.Split(';');
  269. foreach (string value in aArray)
  270. {
  271. int valueInt = int.Parse(value);
  272. bool result = CheckItemInSuit(ItemId, valueInt);
  273. if (result)
  274. {
  275. return valueInt;
  276. }
  277. }
  278. }
  279. return 0;
  280. }
  281. private static bool CheckItemInSuit(int ItemId, int suitId)
  282. {
  283. SuitCfgArray manager = SuitCfgArray.Instance;
  284. SuitCfg suitCfg = manager.GetCfg(suitId);
  285. int[] aArray = suitCfg.partsArr;
  286. foreach (int valueInt in aArray)
  287. {
  288. if (ItemId == valueInt)
  289. {
  290. return true;
  291. }
  292. }
  293. return false;
  294. }
  295. }
  296. }