using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace vnxbqy.UI { public class WishingPoolModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk, IOpenServerActivity { public event Action UpdateWishingDataEvent; public event Action UpdatePoolDataEvent; public event Action UpdateWishAwardEvent; public event Action onStateUpdate; public const int WishRedKey = 20915; public bool isOpenPrompting { get; set; } public override void Init() { ParseConfig(); OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent; OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent; OperationTimeHepler.Instance.operationAdvanceEvent += OperationAdvanceEvent; OpenServerActivityCenter.Instance.Register(15, this); SetWishRedpoint(); } public void OnBeforePlayerDataInitialize() { GlobalTimeEvent.Instance.secondEvent -= UpdateSecond; isOpenPrompting = true; ResetDragData(); ResetPoolData(); } public void OnPlayerLoginOk() { GlobalTimeEvent.Instance.secondEvent += UpdateSecond; UpdateRedpoint(); UpdateFreeWishRedpoint(); } public override void UnInit() { } public bool IsOpen { get { return OperationTimeHepler.Instance.SatisfyOpenCondition(Operation.WishingWellInfo); } } public bool priorityOpen { get { return wishPoolRedpoint.state == RedPointState.Simple; } } public bool IsAdvance { get { return OperationTimeHepler.Instance.SatisfyAdvanceCondition(Operation.WishingWellInfo); } } private void OperationEndEvent(Operation type, int state) { if (type == Operation.WishingWellInfo && state == 0) { UpdateRedpoint(); UpdateFreeWishRedpoint(); if (onStateUpdate != null) { onStateUpdate(15); } } } private void OperationAdvanceEvent(Operation type) { if (type == Operation.WishingWellInfo) { if (onStateUpdate != null) { onStateUpdate(15); } } } private void OperationStartEvent(Operation type, int state) { if (type == Operation.WishingWellInfo && state == 0) { UpdateRedpoint(); UpdateFreeWishRedpoint(); if (onStateUpdate != null) { onStateUpdate(15); } } } public OperationWishingWellInfo GetOperationWishing() { OperationBase operationBase; if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.WishingWellInfo, out operationBase)) { return operationBase as OperationWishingWellInfo; } return null; } public bool TryGetFreeWishCoolTime(out int second) { second = 0; int endSeconds = freeStartTime + freeRefreshCoolTime; DateTime endTime = TimeUtility.GetTime((uint)endSeconds); second = Mathf.CeilToInt((float)(endTime - TimeUtility.ServerNow).TotalSeconds); if (second > 0) { return true; } return false; } public bool IsBestItem() { foreach (var key in poolDataDict.Keys) { if (poolDataDict[key].rare == 1) { return true; } } return false; } public bool TryGetItemRareIcon(int rare, out string iconKey) { iconKey = string.Empty; return wishItemRareDict.TryGetValue(rare, out iconKey); } public int handStartIndex { get; private set; } public int handEndIndex { get; private set; } public event Action UpdateHandMoveEvent; public bool isClick { get; set; } public void SetHandMovePos(int wishIndex) { if (!isClick) return; foreach (var key in poolDataDict.Keys) { if (poolDataDict[key].itemId != 0) { handStartIndex = key; break; } } handEndIndex = wishIndex; if (UpdateHandMoveEvent != null) { isClick = false; UpdateHandMoveEvent(); } } private void UpdateSecond() { if (!IsOpen || freeWishRedpoint.state != RedPointState.None) return; int second = 0; bool isCool = TryGetFreeWishCoolTime(out second); if (!isCool) { UpdateFreeWishRedpoint(); } } #region 本地数据 public bool isDraging { get; set; } public int dragIndex { get; set; } public void ResetDragData() { isDraging = false; dragIndex = -1; } public int freeRefreshCoolTime { get; private set; } public string wishingPriceFormula { get; private set; } public Dictionary wishItemRareDict { get; private set; } public void ParseConfig() { FuncConfigConfig funcConfig = FuncConfigConfig.Get("WishingWellCfg"); freeRefreshCoolTime = int.Parse(funcConfig.Numerical1); wishingPriceFormula = funcConfig.Numerical2; FuncConfigConfig WishingIcon = FuncConfigConfig.Get("WishingIcon"); wishItemRareDict = ConfigParse.GetDic(WishingIcon.Numerical1); } #endregion #region 协议 Dictionary poolDataDict = new Dictionary(); public int freeStartTime { get; private set; }// 免费开始倒计时时间 public int alreadyWishNum { get; private set; } // 许愿付费刷新次数 public int wishingPrice { get; private set; } public void SetWishingWellPlayerInfo(HAA1A_tagMCActWishingWellPlayerInfo wishInfo) { freeStartTime = (int)wishInfo.FreeStartTime; alreadyWishNum = (int)wishInfo.WishCnt; wishingPrice = GetWishingPrice((int)wishInfo.WishCnt); for (int i = 0; i < wishInfo.WellItemCnt; i++) { var itemInfo = wishInfo.WellItemInfo[i]; WishingWellItem wellItem = new WishingWellItem((int)itemInfo.ItemID, itemInfo.ItemCnt, itemInfo.IsSpecial); SetWishingPoolData(i, wellItem); } for (int i = 0; i < wishInfo.CurAwardCnt; i++) { var itemInfo = wishInfo.CurAwardItemInfo[i]; WishingWellItem wellItem = new WishingWellItem((int)itemInfo.ItemID, itemInfo.ItemCnt, itemInfo.IsSpecial); SetWishingData(i, wellItem); } wishingAwardDict.Clear(); for (int i = 0; i < wishInfo.LastAwardCnt; i++) { var itemInfo = wishInfo.LastAwardItemInfo[i]; if (itemInfo.ItemID != 0) { WishingWellItem wellItem = new WishingWellItem((int)itemInfo.ItemID, itemInfo.ItemCnt, itemInfo.IsSpecial); SetWishingAwardData(i, wellItem); } } UpdateRedpoint(); UpdateFreeWishRedpoint(); if (UpdateWishAwardEvent != null) { UpdateWishAwardEvent(); } } public int GetWishingPrice(int wishNum) { Equation.Instance.Clear(); Equation.Instance.AddKeyValue("refreshCnt", wishNum); return Equation.Instance.Eval(wishingPriceFormula); } public void SetWishingResultInfo(HAA1B_tagMCActWishingDragResult result) { for (int i = 0; i < result.Cnt; i++) { var resultInfo = result.InfoList[i]; WishingWellItem wellItem = new WishingWellItem((int)resultInfo.ItemID, resultInfo.ItemCnt, resultInfo.IsSpecial); switch (resultInfo.WellType) { case 0: SetWishingPoolData(resultInfo.Index, wellItem); break; case 1: SetWishingData(resultInfo.Index, wellItem); break; } } UpdateRedpoint(); UpdateFreeWishRedpoint(); } public void SetWishingPoolData(int index, WishingWellItem wellItem) { if (!poolDataDict.ContainsKey(index)) { poolDataDict.Add(index, wellItem); } else { poolDataDict[index] = wellItem; } if (UpdatePoolDataEvent != null) { UpdatePoolDataEvent(index); } } public void RemovetWishingPoolData(int index) { if (poolDataDict.ContainsKey(index)) { poolDataDict.Remove(index); } if (UpdatePoolDataEvent != null) { UpdatePoolDataEvent(index); } } Dictionary wishingDataDict = new Dictionary(); public void SetWishingData(int index, WishingWellItem wellItem) { if (!wishingDataDict.ContainsKey(index)) { wishingDataDict.Add(index, wellItem); } else { wishingDataDict[index] = wellItem; } if (UpdateWishingDataEvent != null) { UpdateWishingDataEvent(index); } } public Dictionary wishingAwardDict = new Dictionary(); public void SetWishingAwardData(int index, WishingWellItem wellItem) { if (!wishingAwardDict.ContainsKey(index)) { wishingAwardDict.Add(index, wellItem); } else { wishingAwardDict[index] = wellItem; } } public bool IsBetterItem() { return false; } public bool TryGetPoolDataByIndex(int index, out WishingWellItem wellItem) { if (poolDataDict.TryGetValue(index, out wellItem)) { if (wellItem.itemId != 0) { return true; } } return false; } public bool TryGetWishDataByIndex(int index, out WishingWellItem wellItem) { if (wishingDataDict.TryGetValue(index, out wellItem)) { if (wellItem.itemId != 0) { return true; } } return false; } public void SendRefreshPoolInfo(int refreshType) { CAA07_tagCMActWishingRefresh wishingRefresh = new CAA07_tagCMActWishingRefresh(); wishingRefresh.IsFree = (byte)refreshType; GameNetSystem.Instance.SendInfo(wishingRefresh); } public void SendGetAwardQuest() { CA504_tagCMPlayerGetReward getReward = new CA504_tagCMPlayerGetReward(); getReward.RewardType = (byte)GotServerRewardType.Def_RewardType_WishingWell; getReward.DataEx = 0; getReward.DataExStrLen = 0; getReward.DataExStr = string.Empty; GameNetSystem.Instance.SendInfo(getReward); } public void SendRefreshWishInfo(int poolIndex, int wishIndex) { CAA06_tagCMActWishing actWishing = new CAA06_tagCMActWishing(); actWishing.SrcWellType = 0; actWishing.SrcIndex = (byte)poolIndex; actWishing.DesWellType = 1; actWishing.DesIndex = (byte)wishIndex; GameNetSystem.Instance.SendInfo(actWishing); } #endregion #region 红点 public Redpoint wishPoolRedpoint = new Redpoint(MainRedDot.REDPOINT_OPENSERVER, WishRedKey); public const int FREEWISH_REDKEY = 2091501; public Redpoint freeWishRedpoint = new Redpoint(WishRedKey, FREEWISH_REDKEY); public List wishPointlist = new List(); public void SetWishRedpoint() { wishPointlist.Clear(); for (int i = 0; i < 5; i++) { int redKey = WishRedKey * 100 + (i + 2); Redpoint redpoint = new Redpoint(WishRedKey, redKey); wishPointlist.Add(redpoint); } } private void UpdateFreeWishRedpoint() { freeWishRedpoint.state = RedPointState.None; if (!IsOpen) return; for (int i = 0; i < wishPointlist.Count; i++) { var wishPoint = wishPointlist[i]; if (wishPoint.state != RedPointState.None) { return; } } int second = 0; bool isCool = TryGetFreeWishCoolTime(out second); if (!isCool) { freeWishRedpoint.state = RedPointState.Simple; } } private void UpdateRedpoint() { for (int i = 0; i < wishPointlist.Count; i++) { var wishPoint = wishPointlist[i]; wishPoint.state = RedPointState.None; } if (!IsOpen) return; for (int i = 0; i < wishPointlist.Count; i++) { var wishPoint = wishPointlist[i]; WishingWellItem wellItem = null; bool isWishData = TryGetWishDataByIndex(i, out wellItem); if (!isWishData) { wishPoint.state = RedPointState.Simple; return; } } } #endregion public void ResetPoolData() { freeStartTime = 0; poolDataDict.Clear(); wishingDataDict.Clear(); wishingAwardDict.Clear(); } public class WishingWellItem { public int itemId; public int itemCount; public int rare; public WishingWellItem(int id, int count, int rare) { this.itemId = id; this.itemCount = count; this.rare = rare; } } } }