using System;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using UnityEngine.UI;
|
|
|
namespace vnxbqy.UI
|
{
|
|
public class WishingPoolModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk, IOpenServerActivity
|
{
|
public event Action<int> UpdateWishingDataEvent;
|
public event Action<int> UpdatePoolDataEvent;
|
public event Action UpdateWishAwardEvent;
|
public event Action<int> 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<int, string> 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<int, string>(WishingIcon.Numerical1);
|
}
|
#endregion
|
|
#region 协议
|
Dictionary<int, WishingWellItem> poolDataDict = new Dictionary<int, WishingWellItem>();
|
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<int>(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<int, WishingWellItem> wishingDataDict = new Dictionary<int, WishingWellItem>();
|
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<int, WishingWellItem> wishingAwardDict = new Dictionary<int, WishingWellItem>();
|
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<Redpoint> wishPointlist = new List<Redpoint>();
|
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;
|
}
|
}
|
}
|
}
|