using asap.core; using cfg; using game; using GameCore; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using UnityEngine; public struct FaceUIData { public FaceUIData(FaceUI faceUI, int redirectID) { this.faceUI = faceUI; this.redirectID = redirectID; } public FaceUI faceUI; public int redirectID; } public struct FaceGiftUIData { public FaceGiftUIData(UIType faceUI, int redirectID, int PackType) { this.faceUI = faceUI; this.redirectID = redirectID; this.PackType = PackType; } public int PackType; public UIType faceUI; public int redirectID; } public struct FaceCustomUIData { public FaceCustomUIData(UIType faceUI) { this.faceUI = faceUI; } public UIType faceUI; } public class FaceUICloseEvent { } public interface IFaceUIService { void AddFaceCustomUIData(UIType faceUI, bool forceAdd = false); void AddFaceUIData(int id, int redirectID, int NoticeType); void ShowFaceUI(string uiName = ""); void AddGiftFaceUI(int id, UIType faceUI, int PackType, bool forceAdd = false); int GetFaceUICount(); void StopFaceUI(); public int curRedirectID { set; get; } } public class FaceUIService : IFaceUIService { List faceUIDatas = new List(); List FaceGiftUIDatas = new List(); Queue faceCustomUIDatas = new Queue(); public int curRedirectID { set; get; } bool isFace; public int GetFaceUICount() { return faceUIDatas.Count + FaceGiftUIDatas.Count + faceCustomUIDatas.Count; } void RemoveFace(string uiName) { if (faceCustomUIDatas.Count > 0) { var data = faceCustomUIDatas.Peek(); if (data.faceUI.Name == uiName) { faceCustomUIDatas.Dequeue(); return; } } if (FaceGiftUIDatas.Count > 0) { int result = 0;// FaceGiftUIDatas.RemoveAll(x => x.faceUI.Name == uiName); for (int i = 0; i < FaceGiftUIDatas.Count; i++) { if (FaceGiftUIDatas[i].faceUI.Name == uiName) { FaceGiftUIDatas.RemoveAt(i); result = 1; break; } } if (result > 0) { return; } } if (faceUIDatas.Count > 0) { int result = faceUIDatas.RemoveAll(x => x.faceUI.Prefab == uiName); if (result > 0) { return; } } } public async void ShowFaceUI(string uiName = "") { CurRewardQCount curRewardQCount = new CurRewardQCount(); if (!string.IsNullOrEmpty(uiName)) { GContext.Publish(curRewardQCount); RemoveFace(uiName); } //触发礼包拍脸 if (isFace) { return; } if (FaceGiftUIDatas.Count > 0 && curRewardQCount.count == 0) { var data = FaceGiftUIDatas[0]; UIType faceUI = data.faceUI; curRedirectID = data.redirectID; ShowUI(data.faceUI, faceUI.Name); await Awaiters.NextFrame; curRedirectID = 0; return; } //FaceUI配置中的拍脸 if (faceUIDatas.Count > 0 && curRewardQCount.count == 0) { var data = faceUIDatas[0]; FaceUI faceUI = data.faceUI; curRedirectID = data.redirectID; UIType uIType = UITypes.GetUIType(faceUI.Prefab); if (uIType != null) { ShowUI(uIType, faceUI.Prefab); await Awaiters.NextFrame; curRedirectID = 0; return; } } //不在配置中的拍脸 if (faceCustomUIDatas.Count > 0 && curRewardQCount.count == 0) { var data = faceCustomUIDatas.Peek(); ShowUI(data.faceUI, data.faceUI.Name); return; } GContext.Publish(new FaceUICloseEvent()); } async void ShowUI(UIType ui_type, string uiname) { isFace = true; GameObject go = await UIManager.Instance.ShowUIPack(ui_type); if (go == null) { isFace = false; ShowFaceUI(uiname); } else { NextFaceUI(go, uiname); } } TaskCompletionSource ConfirmTask; async void NextFaceUI(GameObject go, string uiname) { try { ConfirmTask = new TaskCompletionSource(); AwaitConfirmTask(go); await ConfirmTask.Task; isFace = false; ShowFaceUI(uiname); } catch (OperationCanceledException) { Debug.Log($" Manual Stop Face => {uiname}"); //打断拍脸并删除当前拍脸 RemoveFace(uiname); } finally { isFace = false; if (ConfirmTask != null) { ConfirmTask.Task?.Dispose(); ConfirmTask = null; } } } async void AwaitConfirmTask(GameObject go) { //当gameObject.activeSelf==false时,说明UI已经被关闭 await Awaiters.Until(() => go == null || !go.activeSelf); isFace = false; if (ConfirmTask != null && !ConfirmTask.Task.IsCompleted) { ConfirmTask.SetResult(true); } } //打断拍脸 public void StopFaceUI() { isFace = false; if (ConfirmTask != null) { ConfirmTask.SetCanceled(); } } public void AddFaceCustomUIData(UIType faceUI, bool forceAdd = false) { bool idAdd = false; int day = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; string userID = GContext.container.Resolve().UserId; if (PlayerPrefs.GetInt($"{faceUI.Name}_{userID}", 0) != day) { PlayerPrefs.SetInt($"{faceUI.Name}_{userID}", day); idAdd = true; } if (idAdd || forceAdd) { FaceCustomUIData faceUIData = new FaceCustomUIData(faceUI); faceCustomUIDatas.Enqueue(faceUIData); } } public void AddGiftFaceUI(int id, UIType faceUI, int PackType, bool forceAdd = false) { bool idAdd = false; if (!forceAdd) { TbGlobalConfig tbGlobalConfig = GContext.container.Resolve().TbGlobalConfig; if (FaceGiftUIDatas.Count >= tbGlobalConfig.ShowPopupPack || FaceGiftUIDatas.Where(_ => _.faceUI == faceUI).Count() > 0) { return; } int day = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; //本地存储 string userID = GContext.container.Resolve().UserId; if (PlayerPrefs.GetInt($"{id}_{userID}", 0) != day) { PlayerPrefs.SetInt($"{id}_{userID}", day); idAdd = true; } } if (idAdd || forceAdd) { //可能多个活动用同一个界面,所以使用有时不能用界面名判断 用 id 判断 if (FaceGiftUIDatas.Where(_ => _.redirectID == id).Count() > 0) { return; } FaceGiftUIData faceUIData = new FaceGiftUIData(faceUI, id, PackType); FaceGiftUIDatas.Add(faceUIData); FaceGiftUIDatas.Sort((a, b) => a.PackType.CompareTo(b.PackType)); } } public void AddFaceUIData(int id, int redirectID, int NoticeType) { TbGlobalConfig tbGlobalConfig = GContext.container.Resolve().TbGlobalConfig; FaceUI faceUI = GContext.container.Resolve().TbFaceUI.GetOrDefault(id); if (faceUIDatas.Count >= tbGlobalConfig.ShowPopupEvent && faceUI.ServerType == 0) { int allCount = faceUIDatas.Where(x => x.faceUI.ServerType == 0).Count(); if (allCount >= tbGlobalConfig.ShowPopupEvent) { return; } } if (faceUI == null) { return; } bool idAdd = false; if (faceUI.NoticeType == NoticeType) { int day = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; string userID = GContext.container.Resolve().UserId; if (PlayerPrefs.GetInt($"{id}_{userID}", 0) != day) { PlayerPrefs.SetInt($"{id}_{userID}", day); PlayerPrefs.SetInt($"{faceUI.Prefab}_{userID}", 0); } int count = PlayerPrefs.GetInt($"{faceUI.Prefab}_{userID}", 0); if (count < faceUI.NoticeParam) { PlayerPrefs.SetInt($"{faceUI.Prefab}_{userID}", count + 1); idAdd = true; } } if (idAdd || (faceUI.ServerType == 1 && NoticeType == 2)) { FaceUIData faceUIData = new FaceUIData(faceUI, redirectID); faceUIDatas.Add(faceUIData); faceUIDatas.Sort((a, b) => a.faceUI.FaceOrder.CompareTo(b.faceUI.FaceOrder)); } } }