XianTuLogPanel.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using Core.Language;
  4. using Excel2Json;
  5. using Fort23.Core;
  6. using Fort23.UTool;
  7. using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
  8. using UnityEngine;
  9. using Utility;
  10. namespace Fort23.Mono
  11. {
  12. public class XianTuData
  13. {
  14. public int type;
  15. public string name;
  16. public XianTuLogConfig xianTuLogConfig;
  17. public XianTuData fatherXianTuData;
  18. }
  19. [UIBinding(prefab = "XianTuLogPanel")]
  20. public partial class XianTuLogPanel : UIPanel, IScrollListContent
  21. {
  22. private int type = 0;
  23. private int bigMaoXaiXuan = 0;
  24. private int placesXaiXuan = 0;
  25. List<XianTuLogConfig> xianTuLogConfigs = new List<XianTuLogConfig>();
  26. List<XianTuLogConfig> shoeXianTuLogConfigs = new List<XianTuLogConfig>();
  27. List<XianTuSaiXuanWidget> bigMapXianTuSaiWidgets = new List<XianTuSaiXuanWidget>();
  28. List<XianTuSaiXuanWidget> placesXianTuSaiWidgets = new List<XianTuSaiXuanWidget>();
  29. List<XianTuData> xianTuDatas = new List<XianTuData>();
  30. List<int> places = new List<int>();
  31. private EventLogTitleWidget eventLogTitleWidget;
  32. Map<int, List<int>> xianTuMapConfigd = new Map<int, List<int>>();
  33. List<UIComponent> components = new List<UIComponent>();
  34. private void Init()
  35. {
  36. isAddStack = true;
  37. IsShowAppBar = false;
  38. }
  39. protected override void AddEvent()
  40. {
  41. }
  42. protected override void DelEvent()
  43. {
  44. }
  45. public override void AddButtonEvent()
  46. {
  47. Btn_Close.onClick.AddListener(() => { UIManager.Instance.HideUIUIPanel(this); });
  48. Btn_Main.onClick.AddListener(() => { Btn_Main_OnClick(); });
  49. Btn_Event.onClick.AddListener(() => { Btn_Event_OnClick(); });
  50. Btn_XaiXuan.onClick.AddListener(() => { Btn_XaiXuanClose.gameObject.SetActive(true); });
  51. Btn_XaiXuanClose.onClick.AddListener(() => { Btn_XaiXuanClose.gameObject.SetActive(false); });
  52. }
  53. private void Btn_Main_OnClick()
  54. {
  55. if (this.type == 1)
  56. return;
  57. Sv.transform.SetParent(MarskRoot1, false);
  58. eventLogTitleWidget.own.gameObject.SetActive(false);
  59. ChangeList.ShowTargetIndex(0);
  60. Btn_XaiXuanClose.gameObject.SetActive(false);
  61. Btn_XaiXuan.gameObject.SetActive(false);
  62. bigMaoXaiXuan = 0;
  63. placesXaiXuan = 0;
  64. places.Clear();
  65. UIManager.Instance.DormancyAllGComponent<MainEventLogWidget>();
  66. UIManager.Instance.DormancyAllGComponent<EventLogWidget>();
  67. UIManager.Instance.DormancyAllGComponent<EventLogTitleWidget>();
  68. type = 1;
  69. shoeXianTuLogConfigs = GetTypeXiantuLogConfigs(type);
  70. XaiXuanMap(shoeXianTuLogConfigs);
  71. Content.Init(this, xianTuDatas.Count);
  72. }
  73. private void Btn_Event_OnClick()
  74. {
  75. if (this.type == 2)
  76. return;
  77. Sv.transform.SetParent(MarskRoot, false);
  78. eventLogTitleWidget.own.gameObject.SetActive(true);
  79. ChangeList.ShowTargetIndex(1);
  80. Btn_XaiXuanClose.gameObject.SetActive(false);
  81. Btn_XaiXuan.gameObject.SetActive(true);
  82. bigMaoXaiXuan = 0;
  83. placesXaiXuan = 0;
  84. places.Clear();
  85. UIManager.Instance.DormancyAllGComponent<MainEventLogWidget>();
  86. UIManager.Instance.DormancyAllGComponent<EventLogWidget>();
  87. UIManager.Instance.DormancyAllGComponent<EventLogTitleWidget>();
  88. components.Clear();
  89. type = 2;
  90. shoeXianTuLogConfigs = GetTypeXiantuLogConfigs(type);
  91. XaiXuanMap(shoeXianTuLogConfigs);
  92. if (xianTuDatas.Count > 0)
  93. {
  94. eventLogTitleWidget.own.SetActive(true);
  95. eventLogTitleWidget.CustomInit(xianTuDatas[0].name);
  96. }
  97. else
  98. {
  99. eventLogTitleWidget.own.SetActive(false);
  100. }
  101. Content.Init(this, xianTuDatas.Count);
  102. }
  103. private void XaiXuanMap(List<XianTuLogConfig> configs)
  104. {
  105. xianTuDatas.Clear();
  106. // List<XianTuLogConfig> showConfigs = new List<XianTuLogConfig>();
  107. Map<int, List<XianTuLogConfig>> xiantuMap = new Map<int, List<XianTuLogConfig>>();
  108. //全部 不筛选
  109. if (bigMaoXaiXuan == 0)
  110. {
  111. if (type == 1)
  112. {
  113. foreach (var xianTuLogConfig in configs)
  114. {
  115. XianTuData xianTuData2 = new XianTuData();
  116. xianTuData2.type = 2;
  117. xianTuData2.xianTuLogConfig = xianTuLogConfig;
  118. xianTuDatas.Add(xianTuData2);
  119. }
  120. return;
  121. }
  122. else
  123. {
  124. foreach (var xianTuLogConfig in configs)
  125. {
  126. if (xianTuMapConfigd.ContainsKey(xianTuLogConfig.ID))
  127. {
  128. foreach (var i in xianTuMapConfigd[xianTuLogConfig.ID])
  129. {
  130. if (!xiantuMap.ContainsKey(i))
  131. {
  132. xiantuMap.Add(i, new List<XianTuLogConfig>());
  133. }
  134. xiantuMap[i].Add(xianTuLogConfig);
  135. }
  136. }
  137. }
  138. }
  139. }
  140. else
  141. {
  142. List<EventConfig> eventConfigs;
  143. foreach (var xianTuLogConfig in configs)
  144. {
  145. if (EventSystemManager.Instance.eventConfigsMap.ContainsKey(xianTuLogConfig.ID))
  146. {
  147. eventConfigs = EventSystemManager.Instance.eventConfigsMap[xianTuLogConfig.ID];
  148. foreach (var eventConfig in eventConfigs)
  149. {
  150. if (places.Contains(eventConfig.placeID))
  151. {
  152. PlacesConfig placesConfig = ConfigComponent.Instance.Get<PlacesConfig>(eventConfig.placeID);
  153. if (!xiantuMap.ContainsKey(placesConfig.bigMapID))
  154. {
  155. xiantuMap.Add(placesConfig.bigMapID, new List<XianTuLogConfig>());
  156. }
  157. xiantuMap[placesConfig.bigMapID].Add(xianTuLogConfig);
  158. break;
  159. }
  160. }
  161. }
  162. }
  163. }
  164. foreach (var keyValuePair in xiantuMap)
  165. {
  166. XianTuData xianTuData = new XianTuData();
  167. xianTuData.type = 1;
  168. BigMapConfig bigMapConfig = ConfigComponent.Instance.Get<BigMapConfig>(keyValuePair.Key);
  169. int count = 0;
  170. int allCount = 0;
  171. xianTuDatas.Add(xianTuData);
  172. foreach (var xianTuLogConfig in keyValuePair.Value)
  173. {
  174. if (EventSystemManager.Instance.eventConfigsMap.ContainsKey(xianTuLogConfig.ID))
  175. {
  176. var eventConfigs1 = EventSystemManager.Instance.eventConfigsMap[xianTuLogConfig.ID];
  177. foreach (var eventConfig in eventConfigs1)
  178. {
  179. if (places.Contains(eventConfig.placeID) || places.Count <= 0)
  180. {
  181. AccountFileInfo.EventList eventList = AccountFileInfo.Instance.playerData.completeEvents.FirstOrDefault(cl => cl.eventID == eventConfig.ID);
  182. if (eventList != null)
  183. {
  184. count++;
  185. }
  186. allCount++;
  187. }
  188. }
  189. }
  190. XianTuData xianTuData2 = new XianTuData();
  191. xianTuData2.type = 2;
  192. xianTuData2.xianTuLogConfig = xianTuLogConfig;
  193. xianTuData2.fatherXianTuData = xianTuData;
  194. xianTuDatas.Add(xianTuData2);
  195. }
  196. xianTuData.name = LanguageManager.Instance.Text(bigMapConfig.mapName) + " (" + count + "/" + allCount + ")";
  197. }
  198. }
  199. public async override CTask<bool> AsyncInit(object[] uiData)
  200. {
  201. xianTuLogConfigs = ConfigComponent.Instance.GetAll<XianTuLogConfig>().ToList();
  202. List<EventConfig> eventConfigs = ConfigComponent.Instance.GetAll<EventConfig>().ToList();
  203. foreach (var xianTuLogConfig in xianTuLogConfigs)
  204. {
  205. List<EventConfig> configs = eventConfigs.Where(ec => ec.XiantuID == xianTuLogConfig.ID).ToList();
  206. foreach (var eventConfig in configs)
  207. {
  208. PlacesConfig placesConfig = ConfigComponent.Instance.Get<PlacesConfig>(eventConfig.placeID);
  209. if (!xianTuMapConfigd.ContainsKey(xianTuLogConfig.ID))
  210. {
  211. xianTuMapConfigd.Add(xianTuLogConfig.ID, new List<int>());
  212. }
  213. if (!xianTuMapConfigd[xianTuLogConfig.ID].Contains(placesConfig.bigMapID))
  214. {
  215. xianTuMapConfigd[xianTuLogConfig.ID].Add(placesConfig.bigMapID);
  216. }
  217. }
  218. }
  219. XianTuSaiXuanWidget xianTuSaiXuanWidget1 = await UIManager.Instance.CreateGComponentForObject<XianTuSaiXuanWidget>(XianTuSaiXuanWidget1, null);
  220. xianTuSaiXuanWidget1.CustomInit(1, 0);
  221. xianTuSaiXuanWidget1.OnClick = OnClick;
  222. xianTuSaiXuanWidget1 = await UIManager.Instance.CreateGComponentForObject<XianTuSaiXuanWidget>(XianTuSaiXuanWidget2, null);
  223. xianTuSaiXuanWidget1.CustomInit(2, 0);
  224. xianTuSaiXuanWidget1.OnClick = OnClick;
  225. BigMapConfig[] bigMapConfigs = ConfigComponent.Instance.GetAll<BigMapConfig>();
  226. foreach (var bigMapConfig in bigMapConfigs)
  227. {
  228. XianTuSaiXuanWidget xianTuSaiXuanWidget = await UIManager.Instance.CreateGComponent<XianTuSaiXuanWidget>(null, BigMapConnect);
  229. xianTuSaiXuanWidget.CustomInit(1, bigMapConfig.ID);
  230. xianTuSaiXuanWidget.OnClick = OnClick;
  231. bigMapXianTuSaiWidgets.Add(xianTuSaiXuanWidget);
  232. }
  233. eventLogTitleWidget = await UIManager.Instance.CreateGComponentForObject<EventLogTitleWidget>(EventLogTitleWidgetGam, null);
  234. BigMapList.GetChildObj();
  235. BigMapList.ShowTargetIndex(0);
  236. Btn_Main_OnClick();
  237. return await base.AsyncInit(uiData);
  238. }
  239. private async void OnClick(ItemWidgetBasic obj)
  240. {
  241. XianTuSaiXuanWidget xianTuSaiXuanWidge = obj as XianTuSaiXuanWidget;
  242. if (xianTuSaiXuanWidge.type == 1)
  243. {
  244. bigMaoXaiXuan = xianTuSaiXuanWidge._bigMapConfig.ID;
  245. placesXaiXuan = 0;
  246. foreach (var placesXianTuSaiWidget in placesXianTuSaiWidgets)
  247. {
  248. UIManager.Instance.DormancyGComponent(placesXianTuSaiWidget);
  249. }
  250. placesXianTuSaiWidgets.Clear();
  251. if (bigMaoXaiXuan == 0)
  252. {
  253. PlacesRoot.gameObject.SetActive(false);
  254. BigMapList.ShowTargetIndex(0);
  255. }
  256. else
  257. {
  258. PlacesRoot.gameObject.SetActive(true);
  259. foreach (var place in xianTuSaiXuanWidge._bigMapConfig.places)
  260. {
  261. XianTuSaiXuanWidget xianTuSaiXuanWidget = await UIManager.Instance.CreateGComponent<XianTuSaiXuanWidget>(null, PlacesConnect);
  262. xianTuSaiXuanWidget.CustomInit(2, place);
  263. xianTuSaiXuanWidget.OnClick = OnClick;
  264. placesXianTuSaiWidgets.Add(xianTuSaiXuanWidget);
  265. }
  266. BigMapList.ClickWidget(xianTuSaiXuanWidge.own.GetComponent<UIToggleWidgetBasic>());
  267. PlacesRootList.GetChildObj();
  268. PlacesRootList.ShowTargetIndex(0);
  269. }
  270. }
  271. else if (xianTuSaiXuanWidge.type == 2)
  272. {
  273. placesXaiXuan = xianTuSaiXuanWidge._placesConfig.ID;
  274. if (placesXaiXuan == 0)
  275. {
  276. PlacesRootList.ShowTargetIndex(0);
  277. }
  278. else
  279. {
  280. PlacesRootList.ClickWidget(xianTuSaiXuanWidge.own.GetComponent<UIToggleWidgetBasic>());
  281. }
  282. }
  283. BigMapConfig bigMapConfig = ConfigComponent.Instance.Get<BigMapConfig>(bigMaoXaiXuan);
  284. PlacesConfig placesConfig = ConfigComponent.Instance.Get<PlacesConfig>(placesXaiXuan);
  285. places.Clear();
  286. if (bigMaoXaiXuan == 0)
  287. {
  288. }
  289. else if (bigMaoXaiXuan != 0 && placesXaiXuan == 0)
  290. {
  291. places.AddRange(bigMapConfig.places);
  292. }
  293. else if (bigMaoXaiXuan != 0 && placesXaiXuan != 0)
  294. {
  295. places.Add(placesConfig.ID);
  296. }
  297. UIManager.Instance.DormancyAllGComponent<MainEventLogWidget>();
  298. UIManager.Instance.DormancyAllGComponent<EventLogWidget>();
  299. shoeXianTuLogConfigs = GetTypeXiantuLogConfigs(type);
  300. XaiXuanMap(shoeXianTuLogConfigs);
  301. components.Clear();
  302. if (xianTuDatas.Count > 0)
  303. {
  304. eventLogTitleWidget.own.SetActive(true);
  305. eventLogTitleWidget.CustomInit(xianTuDatas[0].name);
  306. }
  307. else
  308. {
  309. eventLogTitleWidget.own.SetActive(false);
  310. }
  311. Content.Init(this, xianTuDatas.Count);
  312. }
  313. private List<XianTuLogConfig> GetTypeXiantuLogConfigs(int type)
  314. {
  315. List<XianTuLogConfig> xianTuLogConfiges = new List<XianTuLogConfig>();
  316. foreach (var xianTuLogConfig in xianTuLogConfigs)
  317. {
  318. if (xianTuLogConfig.EventType == type)
  319. {
  320. xianTuLogConfiges.Add(xianTuLogConfig);
  321. }
  322. }
  323. return xianTuLogConfiges;
  324. }
  325. public async CTask<IScorllListWidget> GetIScorllListWidget(int index, RectTransform root)
  326. {
  327. if (index < 0 || index >= xianTuDatas.Count)
  328. {
  329. return null;
  330. }
  331. if (type == 1)
  332. {
  333. MainEventLogWidget mainEventLogWidget = await UIManager.Instance.CreateGComponent<MainEventLogWidget>(null, Content.GetComponent<RectTransform>());
  334. mainEventLogWidget.CustomInit(xianTuDatas[index].xianTuLogConfig);
  335. return mainEventLogWidget;
  336. }
  337. else
  338. {
  339. XianTuData xianTuData = xianTuDatas[index];
  340. if (xianTuData.type == 1)
  341. {
  342. EventLogTitleWidget eventLogTitleWidget = await UIManager.Instance.CreateGComponent<EventLogTitleWidget>(null, Content.GetComponent<RectTransform>());
  343. eventLogTitleWidget.CustomInit(xianTuData);
  344. components.Add(eventLogTitleWidget);
  345. // xianTuTitleWidgets.Add(eventLogTitleWidget);
  346. return eventLogTitleWidget;
  347. }
  348. else
  349. {
  350. EventLogWidget EventLogWidget = await UIManager.Instance.CreateGComponent<EventLogWidget>(null, Content.GetComponent<RectTransform>());
  351. await EventLogWidget.CustomInit(xianTuData, places);
  352. components.Add(EventLogWidget);
  353. return EventLogWidget;
  354. }
  355. }
  356. }
  357. public void HindIScorllListWidget(IScorllListWidget widget)
  358. {
  359. UIManager.Instance.DormancyGComponent(widget as UIComponent);
  360. if (components.Contains(widget as UIComponent))
  361. {
  362. components.Remove(widget as EventLogTitleWidget);
  363. }
  364. }
  365. public async static CTask OpenPanel()
  366. {
  367. XianTuLogPanel xianTuLogPanel = await UIManager.Instance.LoadAndOpenPanel<XianTuLogPanel>(null);
  368. }
  369. List<UIComponent> _components = new List<UIComponent>();
  370. private float maxY;
  371. private float minY;
  372. [CustomMethod(CustomMethodType.Update)]
  373. public void Update()
  374. {
  375. if (type != 2)
  376. return;
  377. UIComponent highestItem = null;
  378. maxY = float.MinValue;
  379. minY = float.MaxValue;
  380. _components.Clear();
  381. foreach (var xianTuTitleWidget in components)
  382. {
  383. float itemY = xianTuTitleWidget.own.transform.position.y; // 使用世界坐标的 Y 值
  384. if (itemY > eventLogTitleWidget.own.transform.position.y)
  385. {
  386. maxY = itemY;
  387. _components.Add(xianTuTitleWidget);
  388. }
  389. }
  390. foreach (var uiComponent in _components)
  391. {
  392. float itemY = uiComponent.own.transform.position.y; // 使用世界坐标的 Y 值
  393. if (itemY < minY)
  394. {
  395. minY = itemY;
  396. highestItem = uiComponent;
  397. }
  398. }
  399. if (highestItem != null)
  400. {
  401. float outsideY = eventLogTitleWidget.own.transform.position.y;
  402. if (maxY > outsideY)
  403. {
  404. XianTuData xianTuData = default;
  405. if (highestItem is EventLogTitleWidget)
  406. {
  407. EventLogTitleWidget eventLogTitleWidget = highestItem as EventLogTitleWidget;
  408. xianTuData = eventLogTitleWidget.xiantuData;
  409. }
  410. else if (highestItem is EventLogWidget)
  411. {
  412. EventLogWidget eventLogWidget = highestItem as EventLogWidget;
  413. xianTuData = eventLogWidget.XianTuData.fatherXianTuData;
  414. }
  415. eventLogTitleWidget.CustomInit(xianTuData.name);
  416. }
  417. }
  418. }
  419. public override void Close()
  420. {
  421. UIManager.Instance.DormancyAllGComponent<MainEventLogWidget>();
  422. UIManager.Instance.DormancyAllGComponent<EventLogWidget>();
  423. UIManager.Instance.DormancyAllGComponent<EventLogTitleWidget>();
  424. components.Clear();
  425. type = 0;
  426. foreach (var bigMapXianTuSaiWidget in bigMapXianTuSaiWidgets)
  427. {
  428. UIManager.Instance.DormancyGComponent(bigMapXianTuSaiWidget);
  429. }
  430. bigMapXianTuSaiWidgets.Clear();
  431. foreach (var placesXianTuSaiWidget in placesXianTuSaiWidgets)
  432. {
  433. UIManager.Instance.DormancyGComponent(placesXianTuSaiWidget);
  434. }
  435. placesXianTuSaiWidgets.Clear();
  436. Btn_XaiXuanClose.gameObject.SetActive(false);
  437. Btn_XaiXuan.gameObject.SetActive(false);
  438. bigMaoXaiXuan = 0;
  439. placesXaiXuan = 0;
  440. places.Clear();
  441. base.Close();
  442. }
  443. }
  444. }