备份CatanBuilding瘦身独立工程
This commit is contained in:
303
Assets/Scripts/UI/FaceUIService.cs
Normal file
303
Assets/Scripts/UI/FaceUIService.cs
Normal file
@@ -0,0 +1,303 @@
|
||||
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<FaceUIData> faceUIDatas = new List<FaceUIData>();
|
||||
List<FaceGiftUIData> FaceGiftUIDatas = new List<FaceGiftUIData>();
|
||||
Queue<FaceCustomUIData> faceCustomUIDatas = new Queue<FaceCustomUIData>();
|
||||
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<bool> ConfirmTask;
|
||||
async void NextFaceUI(GameObject go, string uiname)
|
||||
{
|
||||
try
|
||||
{
|
||||
ConfirmTask = new TaskCompletionSource<bool>();
|
||||
AwaitConfirmTask(go);
|
||||
await ConfirmTask.Task;
|
||||
isFace = false;
|
||||
ShowFaceUI(uiname);
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
Debug.Log($"<color=yellow> Manual Stop Face => {uiname}</color>");
|
||||
//打断拍脸并删除当前拍脸
|
||||
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<IUserService>().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<Tables>().TbGlobalConfig;
|
||||
if (FaceGiftUIDatas.Count >= tbGlobalConfig.ShowPopupPack || FaceGiftUIDatas.Where(_ => _.faceUI == faceUI).Count() > 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
int day = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear;
|
||||
//本地存储
|
||||
string userID = GContext.container.Resolve<IUserService>().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<Tables>().TbGlobalConfig;
|
||||
FaceUI faceUI = GContext.container.Resolve<Tables>().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<IUserService>().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));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user