ItemApproachScanner.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  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. throw (e);
  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. ClothingShopCfgArray manager = ClothingShopCfgArray.Instance;
  84. ClothingShopCfg[] dataArray = manager.dataArray;
  85. foreach (ClothingShopCfg 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. int dropId = cfg.bonus;
  110. bool approach = CheckDropApproach(itemId, dropId);
  111. if (approach)
  112. {
  113. return "ZHAI_XING";
  114. }
  115. }
  116. return null;
  117. }
  118. /// <summary>
  119. /// 尝试获取剧情关卡产出途径
  120. /// </summary>
  121. /// <param name="itemId"></param>
  122. /// <returns></returns>
  123. private static string GetStoryLevelApproach(int itemId)
  124. {
  125. List<string> approachs = new List<string>();
  126. StoryLevelCfgArray manager = StoryLevelCfgArray.Instance;
  127. StoryLevelCfg[] dataArray = manager.dataArray;
  128. foreach (StoryLevelCfg cfg in dataArray)
  129. {
  130. bool result = CheckItemInBonus(itemId, cfg);
  131. if (result)
  132. {
  133. string approach = "JU_QING_GUAN_QIA=" + cfg.id;
  134. approachs.Add(approach);
  135. }
  136. }
  137. if (approachs.Count > 0)
  138. {
  139. return string.Join(";", approachs);
  140. }
  141. return null;
  142. }
  143. /// <summary>
  144. /// 尝试获取服装合成产出途径
  145. /// </summary>
  146. /// <param name="itemId"></param>
  147. /// <returns></returns>
  148. private static string GetClothingSyntheticApproach(int itemId)
  149. {
  150. SuitSyntheticMenuCfgArray manager = SuitSyntheticMenuCfgArray.Instance;
  151. SuitSyntheticMenuCfg[] dataArray = manager.dataArray;
  152. foreach (SuitSyntheticMenuCfg cfg in dataArray)
  153. {
  154. int suitId = CheckItemInSuit(itemId, cfg.suitIds);
  155. if (suitId > 0)
  156. {
  157. return "FU_ZHUANG_HE_CHENG=" + suitId;
  158. }
  159. }
  160. return null;
  161. }
  162. private static string GetSuitGuideApproach(int itemId)
  163. {
  164. SuitCfgArray manager = SuitCfgArray.Instance;
  165. SuitCfg[] dataArray = manager.dataArray;
  166. foreach (SuitCfg cfg in dataArray)
  167. {
  168. bool result = CheckItemInBonus(itemId, cfg.boxBonusArr);
  169. if (result)
  170. {
  171. return "TAO_ZHUANG_TU_JIAN";
  172. }
  173. }
  174. return null;
  175. }
  176. private static string GetSuitSyntheticApproach(int itemId)
  177. {
  178. SuitSyntheticCfgArray manager = SuitSyntheticCfgArray.Instance;
  179. SuitSyntheticCfg[] dataArray = manager.dataArray;
  180. foreach (SuitSyntheticCfg cfg in dataArray)
  181. {
  182. bool result = CheckItemInBonus(itemId, cfg.boxBonusArr);
  183. if (result)
  184. {
  185. return "TAO_ZHUANG_HE_CHENG";
  186. }
  187. }
  188. return null;
  189. }
  190. /// <summary>
  191. /// 检测掉落表是否产出该物品
  192. /// </summary>
  193. /// <param name="itemId"></param>
  194. /// <returns></returns>
  195. private static bool CheckDropApproach(int itemId, int dropId)
  196. {
  197. DropOutCfgArray manager = DropOutCfgArray.Instance;
  198. DropOutCfg[] dataArray = manager.GetCfgs(dropId);
  199. for (int i = 0; i < dataArray.Length; i++)
  200. {
  201. if (dataArray[i].item == itemId)
  202. {
  203. return true;
  204. }
  205. if (manager.GetCfgs(dataArray[i].item).Length > 0)
  206. {
  207. return CheckDropApproach(itemId, dataArray[i].item);
  208. }
  209. }
  210. return false;
  211. }
  212. private static bool CheckItemInBonus(int itemId, StoryLevelCfg cfg)
  213. {
  214. if (cfg.fightID.Length > 0)
  215. {
  216. StoryFightCfgArray manager = StoryFightCfgArray.Instance;
  217. StoryFightCfg storyFightCfg = manager.GetCfg(cfg.fightID);
  218. List<int[]> a = new List<int[]>();
  219. a.AddRange(cfg.bonusOnceArr);
  220. a.AddRange(storyFightCfg.bonusBaseArr);
  221. int[][] bonus = a.ToArray();
  222. bool result = CheckItemInBonus(itemId, bonus);
  223. if (result)
  224. {
  225. return true;
  226. }
  227. result = CheckItemInDropOut(itemId, storyFightCfg.bonusRandomArr);
  228. return result;
  229. }
  230. return false;
  231. }
  232. private static bool CheckItemInBonus(int itemId, int[][] bosnu)
  233. {
  234. List<ItemData> aList = ItemUtil.CreateItemDataList(bosnu);
  235. foreach (ItemData itemData in aList)
  236. {
  237. if (itemId == itemData.id)
  238. {
  239. return true;
  240. }
  241. }
  242. return false;
  243. }
  244. private static bool CheckItemInBonus(int itemId, string bosnu)
  245. {
  246. List<ItemData> aList = ItemUtil.CreateItemDataList(bosnu);
  247. foreach (ItemData itemData in aList)
  248. {
  249. if (itemId == itemData.id)
  250. {
  251. return true;
  252. }
  253. }
  254. return false;
  255. }
  256. private static bool CheckItemInDropOut(int itemId, int[] dropIds)
  257. {
  258. List<ItemData> result = new List<ItemData>();
  259. foreach (int dropId in dropIds)
  260. {
  261. DropOutCfgArray manager = DropOutCfgArray.Instance;
  262. DropOutCfg[] aList = manager.GetCfgs(dropId);
  263. foreach (DropOutCfg dropOutCfg in aList)
  264. {
  265. if (itemId == dropOutCfg.item)
  266. {
  267. return true;
  268. }
  269. }
  270. }
  271. return false;
  272. }
  273. private static int CheckItemInSuit(int ItemId, string suitIds)
  274. {
  275. if (suitIds.Length > 0)
  276. {
  277. string[] aArray = suitIds.Split(';');
  278. foreach (string value in aArray)
  279. {
  280. int valueInt = int.Parse(value);
  281. bool result = CheckItemInSuit(ItemId, valueInt);
  282. if (result)
  283. {
  284. return valueInt;
  285. }
  286. }
  287. }
  288. return 0;
  289. }
  290. private static bool CheckItemInSuit(int ItemId, int suitId)
  291. {
  292. SuitCfgArray manager = SuitCfgArray.Instance;
  293. SuitCfg suitCfg = manager.GetCfg(suitId);
  294. int[] aArray = suitCfg.partsArr;
  295. foreach (int valueInt in aArray)
  296. {
  297. if (ItemId == valueInt)
  298. {
  299. return true;
  300. }
  301. }
  302. return false;
  303. }
  304. }
  305. }