ActivityDay7View.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using cfg.GfgCfg;
  5. using ET;
  6. using FairyGUI;
  7. using UI.ActivityDay7;
  8. using UI.CommonGame;
  9. using UI.Task;
  10. using UnityEngine;
  11. namespace GFGGame
  12. {
  13. public class ActivityDay7View : BaseWindow
  14. {
  15. private UI_ActivityDay7UI _ui;
  16. //7日活动配置
  17. private List<Activity7DaysTaskCfg> cfgDataArray;
  18. //7日活动积分配置
  19. private System.Collections.Generic.List<cfg.GfgCfg.Activity7DaysCfg> activity7DaysCfgs;
  20. //选中的天数index 天数=index+1
  21. private int onClickDayIndex;
  22. private List<EffectUI> _effectUIs = new List<EffectUI>();
  23. private List<EffectUI> _effectTaskUIs = new List<EffectUI>();
  24. public override void Dispose()
  25. {
  26. if (_ui != null)
  27. {
  28. _ui.Dispose();
  29. _ui = null;
  30. }
  31. base.Dispose();
  32. }
  33. protected override void OnInit()
  34. {
  35. base.OnInit();
  36. packageName = UI_ActivityDay7UI.PACKAGE_NAME;
  37. _ui = UI_ActivityDay7UI.Create();
  38. viewCom = _ui.target;
  39. isfullScreen = true;
  40. isReturnView = true;
  41. bringToFontOnClick = false;
  42. _ui.m_btnBack.onClick.Add(OnBtnBackClick);
  43. _ui.m_loabg.url = ResPathUtil.GetBgImgPath("cp_beijing");
  44. _ui.m_DayList.itemRenderer = DayListRenderer;
  45. _ui.m_comTaskList.m_TaskList.itemRenderer = TaskListRenderer;
  46. _ui.m_tip.onClick.Add(RuleController.ShowRuleView);
  47. _ui.m_tip.data = 300014;
  48. }
  49. private void OnBtnBackClick()
  50. {
  51. ViewManager.GoBackFrom(typeof(ActivityDay7View).FullName);
  52. }
  53. protected override void OnShown()
  54. {
  55. base.OnShown();
  56. var maxDay = ActivityDay7DataManager.Instance.GetActivityDay7MaxPassDay();
  57. onClickDayIndex = Math.Max(0, maxDay - 1);
  58. SetScoreList();
  59. SetScore();
  60. SetDayList();
  61. SetTasks();
  62. SetTime();
  63. }
  64. public override void Hide()
  65. {
  66. Timers.inst.Remove(UpdateTime);
  67. ClearScoreItemEff();
  68. ClearTaskItemEff();
  69. base.Hide();
  70. }
  71. protected override void AddEventListener()
  72. {
  73. EventAgent.AddEventListener(ConstMessage.ITEM_CHANGED, OnItemChange);
  74. // ConstMessage.NOTICE_TASK_STATE_CHANGE
  75. EventAgent.AddEventListener(ConstMessage.NOTICE_BATCH_TASK_STATE_CHANGE, OnTasksChange);
  76. }
  77. private void OnTasksChange(EventContext context)
  78. {
  79. var taskIds = (List<int>)context.data;
  80. foreach (var _ in taskIds.Select(taskId => CommonDataManager.Tables.TblTaskCfg.GetOrDefault(taskId))
  81. .Where(taskCfg => taskCfg is { FuncType: TaskFuncType.Day7 }))
  82. {
  83. TaskChange();
  84. }
  85. }
  86. private void OnTaskChange(EventContext context)
  87. {
  88. var taskId = (int)context.data;
  89. var taskCfg = CommonDataManager.Tables.TblTaskCfg.GetOrDefault(taskId);
  90. if (!(taskCfg is { FuncType: TaskFuncType.Day7 })) return;
  91. TaskChange();
  92. }
  93. private void TaskChange()
  94. {
  95. SetDayList();
  96. SetTasks();
  97. }
  98. protected override void RemoveEventListener()
  99. {
  100. //ConstMessage.ITEM_CHANGED
  101. EventAgent.RemoveEventListener(ConstMessage.ITEM_CHANGED, OnItemChange);
  102. //NOTICE_BATCH_TASK_STATE_CHANGE
  103. EventAgent.RemoveEventListener(ConstMessage.NOTICE_BATCH_TASK_STATE_CHANGE, OnTasksChange);
  104. }
  105. private void OnItemChange(EventContext context)
  106. {
  107. var itemId = (int)context.data;
  108. if (itemId != ConstItemID.ACTIVITY_DAY_7_SCORE) return;
  109. SetScoreList();
  110. SetScore();
  111. }
  112. private void SetScore()
  113. {
  114. var score = ActivityDay7DataManager.Instance.GetScore();
  115. _ui.m_Score.text = score.ToString();
  116. _ui.m_ExpProcess.value = score;
  117. }
  118. //DayListRenderer
  119. private void DayListRenderer(int index, GObject obj)
  120. {
  121. var item = UI_ButtonDay.Proxy(obj);
  122. var cfg = cfgDataArray[index];
  123. if (item.target.data == null)
  124. {
  125. item.m_text.text = $"第{cfg.Days}天";
  126. item.target.data = index;
  127. item.target.onClick.Add(OnClickDay);
  128. }
  129. //设置按钮状态
  130. item.m_c1.selectedIndex = index == onClickDayIndex ? 0 : 1;
  131. RedDotController.Instance.SetComRedDot(item.target,
  132. ActivityDay7DataManager.Instance.CheckActivityDay7TaskRewrdCanGetByDay(cfg.Days));
  133. UI_ButtonDay.ProxyEnd();
  134. }
  135. //选中天数
  136. private void OnClickDay(EventContext context)
  137. {
  138. if (!(context.sender is GObject typeItem)) return;
  139. //检查天数
  140. var day = ActivityDay7DataManager.Instance.GetActivityDay7MaxPassDay();
  141. if (day < (int)typeItem.data + 1)
  142. {
  143. PromptController.Instance.ShowFloatTextPrompt("未到开启时间");
  144. return;
  145. }
  146. onClickDayIndex = (int)typeItem.data;
  147. SetTasks();
  148. //设置其他按钮选中状态
  149. SetDayList();
  150. FreshGetStatus();
  151. }
  152. private void SetTasks()
  153. {
  154. ClearTaskItemEff();
  155. var activity7DaysTaskCfg =
  156. CommonDataManager.Tables.TblActivity7DaysTaskCfg.GetOrDefault(onClickDayIndex + 1);
  157. var taskIdArr = new int[activity7DaysTaskCfg.TaskId.Count];
  158. Array.Copy(activity7DaysTaskCfg.TaskId.ToArray(), taskIdArr, activity7DaysTaskCfg.TaskId.Count);
  159. //田野调查和新增任务特殊处理
  160. long time = GameGlobal.zoneScene.GetComponent<RoleInfosComponent>().GetCurrentRole().CreateTime;
  161. long setTime = 1721768400000;
  162. for (int i = 0; i < taskIdArr.Length; i++)
  163. {
  164. if (taskIdArr[i] == 2039)
  165. {
  166. TaskCfg taskCfg = CommonDataManager.Tables.TblTaskCfg.GetOrDefault(taskIdArr[i]);
  167. if (taskCfg.JumpId == "FieldView")
  168. {
  169. if (time > setTime)
  170. {
  171. for (int j = i; j < taskIdArr.Length - 1; j++)
  172. {
  173. taskIdArr[j] = taskIdArr[j + 1];
  174. }
  175. Array.Resize(ref taskIdArr, taskIdArr.Length - 1);
  176. continue;
  177. }
  178. }
  179. }
  180. else if (taskIdArr[i] == 2057)
  181. {
  182. if (time < setTime)
  183. {
  184. for (int j = i; j < taskIdArr.Length - 1; j++)
  185. {
  186. taskIdArr[j] = taskIdArr[j + 1];
  187. }
  188. Array.Resize(ref taskIdArr, taskIdArr.Length - 1);
  189. continue;
  190. }
  191. }
  192. }
  193. //排序根据领取状态
  194. var taskCfgs = TaskDataManager.Instance.GetTaskCfgs(taskIdArr.ToList());
  195. _ui.m_comTaskList.m_TaskList.data = taskCfgs;
  196. _ui.m_comTaskList.m_TaskList.numItems = taskIdArr.Length;
  197. if (_ui.m_comTaskList.m_TaskList.numItems > 0)
  198. {
  199. _ui.m_comTaskList.m_TaskList.ScrollToView(0);
  200. }
  201. }
  202. //TaskListRenderer
  203. private void TaskListRenderer(int index, GObject obj)
  204. {
  205. var item = UI_TaskListItem.Proxy(obj);
  206. var tasks = (List<TaskCfg>)obj.parent.data;
  207. var taskCfg = tasks[index];
  208. item.m_c1.selectedIndex = TaskDataManager.Instance.GetTaskStateById(taskCfg.Id);
  209. item.m_c2.selectedIndex = taskCfg.JumpId == "" ? 1 : 0;
  210. item.m_txtDesc.text = TaskDataManager.Instance.GetTaskDesc(taskCfg.Id);
  211. item.m_txtCount.text =
  212. $"{TaskDataManager.Instance.GetTaskProgressById(taskCfg.Id)}/{taskCfg.GetTargetCount()}";
  213. if (item.m_GetRewardBt.target.data == null)
  214. {
  215. item.m_GetRewardBt.target.onClick.Add(OnBtnGetClick);
  216. }
  217. item.m_GetRewardBt.target.data = taskCfg.Id;
  218. if (item.m_ComeBt.target.data == null)
  219. {
  220. item.m_ComeBt.target.onClick.Add(OnBtnGoClick);
  221. }
  222. item.m_ComeBt.target.data = taskCfg;
  223. if (item.m_listTaskReward.data == null)
  224. {
  225. item.m_listTaskReward.itemRenderer = ListTaskRewardItemRender;
  226. }
  227. if (item.m_c1.selectedIndex == 1)
  228. {
  229. EffectUIPool.CreateEffectUI(item.m_holderfTaskEff, "ui_Small_parts", "store_button_public",
  230. onComplete: (effect) =>
  231. {
  232. if (effect != null)
  233. {
  234. _effectTaskUIs.Add(effect);
  235. }
  236. else
  237. {
  238. Debug.LogError("背景特效加载失败");
  239. }
  240. });
  241. }
  242. item.m_listTaskReward.data = TaskDataManager.Instance.GetReward(taskCfg);
  243. item.m_listTaskReward.numItems = TaskDataManager.Instance.GetReward(taskCfg).Count;
  244. RedDotController.Instance.SetComRedDot(item.m_GetRewardBt.target, item.m_c1.selectedIndex == 1);
  245. UI_TaskListItem.ProxyEnd();
  246. }
  247. private static void ListTaskRewardItemRender(int index, GObject obj)
  248. {
  249. var rewards = (List<ItemParamProto>)obj.parent.data;
  250. ItemUtil.CreateItemView(rewards[index], obj as GComponent);
  251. }
  252. private void OnBtnGoClick(EventContext context)
  253. {
  254. if (!(context.sender is GObject btnGo)) return;
  255. var taskCfg = (TaskCfg)btnGo.data;
  256. if (!FunctionOpenDataManager.Instance.CheckIsFunOpenById(taskCfg.JumpId)) return;
  257. var param = new object[taskCfg.JumpParam.Count];
  258. for (var i = 0; i < taskCfg.JumpParam.Count; i++)
  259. {
  260. param[i] = taskCfg.JumpParam[i];
  261. }
  262. ViewManager.JumpToView(taskCfg.JumpId, param);
  263. }
  264. private List<GComponent> components = new List<GComponent>();
  265. //设置积分列表
  266. private void SetScoreList()
  267. {
  268. ClearScoreItemEff();
  269. //7日活动配置
  270. activity7DaysCfgs = CommonDataManager.Tables.TblActivity7DaysCfg.DataList;
  271. var maxCfg = activity7DaysCfgs[activity7DaysCfgs.Count - 1];
  272. var maxCfgID = maxCfg.Id;
  273. var maxScore = maxCfg.Score;
  274. var pos = _ui.m_StartIndex.position;
  275. var endX = _ui.m_EndIndex.position.x;
  276. _ui.m_ExpProcess.max = maxScore;
  277. var score = ActivityDay7DataManager.Instance.GetScore();
  278. //循环设置UI
  279. foreach (var cfg in activity7DaysCfgs)
  280. {
  281. var cfgScore = cfg.Score;
  282. var item = UI_ExpProcessItem.Create();
  283. var target = item.target;
  284. components.Add(target);
  285. _ui.target.AddChild(target);
  286. // 根据 maxScore cfgScore pos.y endY 设置target 位置 x,z不变,y根据比例设置
  287. var x = pos.x + (endX - pos.x) * cfgScore / maxScore;
  288. target.SetPosition(x, pos.y, pos.z);
  289. item.m_Score.text = cfgScore.ToString();
  290. var cfgBonusArr = cfg.Bonus;
  291. var itemCfg = CommonDataManager.Tables.TblItemCfg.GetOrDefault(cfgBonusArr[0].ItemId);
  292. item.m_loaIcon.url = string.IsNullOrEmpty(itemCfg.Res) ? "" : ResPathUtil.GetIconPath(itemCfg);
  293. item.m_Num.text = cfgBonusArr.Count.ToString();
  294. item.m_c1.selectedIndex = cfg.Id == maxCfgID ? 1 : 0;
  295. //if (item.m_c2.selectedIndex == 0 && score >= cfgScore) {
  296. // var _effectUI = EffectUIPool.CreateEffectUI(item.m_holderfEff, "ui_Small_parts", "store_NotClaimed_circle");
  297. // _effectUIs.Add(_effectUI);
  298. //}
  299. item.target.data = cfg;
  300. item.target.onClick.Add(OnClickReward);
  301. UI_ExpProcess.ProxyEnd();
  302. }
  303. FreshGetStatus();
  304. }
  305. public void ClearScoreItemEff()
  306. {
  307. for (int i = 0; i < _effectUIs.Count; i++)
  308. {
  309. EffectUIPool.Recycle(_effectUIs[i]);
  310. _effectUIs[i] = null;
  311. }
  312. _effectUIs.Clear();
  313. }
  314. public void ClearTaskItemEff()
  315. {
  316. for (int i = 0; i < _effectTaskUIs.Count; i++)
  317. {
  318. EffectUIPool.Recycle(_effectTaskUIs[i]);
  319. _effectTaskUIs[i] = null;
  320. }
  321. _effectTaskUIs.Clear();
  322. }
  323. //设置天数列表
  324. private void SetDayList()
  325. {
  326. //7日活动配置
  327. cfgDataArray = CommonDataManager.Tables.TblActivity7DaysTaskCfg.DataList;
  328. _ui.m_DayList.numItems = cfgDataArray.Count;
  329. _ui.m_DayList.ScrollToView(onClickDayIndex);
  330. }
  331. private void FreshGetStatus()
  332. {
  333. components.ForEach(com =>
  334. {
  335. var item = UI_ExpProcessItem.Proxy(com);
  336. var cfg = (Activity7DaysCfg)item.target.data;
  337. var cfgID = cfg.Id;
  338. var state = ActivityDay7DataManager.Instance.GetActivityDay7RewardState(cfgID);
  339. item.m_c2.selectedIndex = state ? 1 : 0;
  340. RedDotController.Instance.SetComRedDot(item.target,
  341. ActivityDay7DataManager.Instance.CheckActivityDay7RewardCanGet(cfgID), "", -90);
  342. UI_ExpProcessItem.ProxyEnd();
  343. });
  344. }
  345. private async void OnBtnGetClick(EventContext context)
  346. {
  347. if (!(context.sender is GObject btnGet)) return;
  348. var result = await TaskSProxy.GetTaskBonus((int)btnGet.data);
  349. if (!result) return;
  350. SetTasks();
  351. }
  352. private async void OnClickReward(EventContext context)
  353. {
  354. if (!(context.sender is GObject btnGet)) return;
  355. var activity7DaysCfg = (Activity7DaysCfg)btnGet.data;
  356. var id = activity7DaysCfg.Id;
  357. if (!ActivityDay7DataManager.Instance.CheckActivityDay7RewardCanGet(id))
  358. {
  359. GoodsItemTipsController.ShowItemTips(activity7DaysCfg.Bonus[0].ItemId);
  360. return;
  361. }
  362. var result = await ActivityDay7SProxy.ReqGetActivityDay7Reward(activity7DaysCfg);
  363. if (!result) return;
  364. FreshGetStatus();
  365. }
  366. private void SetTime()
  367. {
  368. UpdateTime(null);
  369. Timers.inst.Add(1, 0, UpdateTime);
  370. }
  371. //UpdateTime
  372. private void UpdateTime(object param)
  373. {
  374. var endTime = ActivityDay7DataManager.Instance.GetEndTime();
  375. var leftTime = endTime - TimeHelper.ServerNow();
  376. if (leftTime <= 0)
  377. {
  378. Timers.inst.Remove(UpdateTime);
  379. return;
  380. }
  381. _ui.m_TimeStr.text = TimeUtil.FormattingTimeTo_DDHHmm((int)leftTime);
  382. }
  383. }
  384. }