using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; namespace vnxbqy.UI { public class FlashRushToBuyModel : Model,IBeforePlayerDataInitialize,IPlayerLoginOk,IOpenServerActivity { StoreModel storeModel { get { return ModelCenter.Instance.GetModel(); } } HeavenBattleModel battleModel { get { return ModelCenter.Instance.GetModel(); } } public string AlreadyOpenSaleTimeRecord = ""; public override void Init() { OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent; OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent; OperationTimeHepler.Instance.operationAdvanceEvent += OperationAdvanceEvent; OpenServerActivityCenter.Instance.Register(14, this); } public void OnBeforePlayerDataInitialize() { fullSeverBuyInfoDict.Clear(); } public void OnPlayerLoginOk() { AlreadyOpenSaleTimeRecord = StringUtility.Contact("AlreadyOpenSaleTimeRecord",PlayerDatas.Instance.baseData.PlayerID); PlayerPrefs.DeleteKey(AlreadyOpenSaleTimeRecord); GetAlreadyOpenSaleTime(); UpdateRedpoint(); } public override void UnInit() { OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent; OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent; OperationTimeHepler.Instance.operationAdvanceEvent -= OperationAdvanceEvent; } public bool IsOpen { get { var operation = GetOperationFlashRushToBuy(); if (operation != null) { return operation.SatisfyOpenCondition(); } return false; } } public bool priorityOpen { get { return flashRushToBuyRedpoint.state == RedPointState.Simple; } } public bool IsAdvance { get { return OperationTimeHepler.Instance.SatisfyAdvanceCondition(Operation.FlashRushToBuy); } } public void SetDefaultSelectSaleTime() { OperationFlashRushToBuy operation = GetOperationFlashRushToBuy(); int seconds = 0; if (presentFlashShop != null) { int buyState = operation.GetBuyTimeState(TimeUtility.ServerNow,presentFlashShop.dayIndex,presentFlashShop.timeIndex, out seconds); if(buyState != 1) { return; } } OperationTime operationTime; OperationFlashRushToBuy.FlashSaleShop saleShop = null; var flashRushToBuySate = GetActivityState(out seconds, out operationTime, out saleShop); if(flashRushToBuySate != FlashRushToBuySate.End) { presentFlashShop = saleShop; } else { presentFlashShop = null; } } public event Action UpdatePresentFlashShopCloseEvent; public void PresentFlashShopActivityClose() { SetDefaultSelectSaleTime(); if (UpdatePresentFlashShopCloseEvent != null) { UpdatePresentFlashShopCloseEvent(); } } public void ResetFlashShop() { presentFlashShop = null; } #region 本地数据处理 public OperationFlashRushToBuy.FlashSaleShop presentFlashShop { get; private set; } public event Action UpdateSelectSaleTimeEvent; public void UpdateSelectFlashSaleTime(int dayIndex,int timeIndex) { presentFlashShop = null; OperationFlashRushToBuy operation = GetOperationFlashRushToBuy(); if(operation != null) { OperationFlashRushToBuy.FlashSaleShop flashShop; operation.TryGetFlashShop(dayIndex, timeIndex, out flashShop); presentFlashShop = flashShop; if(UpdateSelectSaleTimeEvent != null) { UpdateSelectSaleTimeEvent(); } } } public OperationFlashRushToBuy GetOperationFlashRushToBuy() { OperationBase operationBase; if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.FlashRushToBuy, out operationBase)) { return operationBase as OperationFlashRushToBuy; } return null; } #endregion #region 协议 public event Action UpdateAllAppointmentEvent; public event Action UpdateAppointmentEvent; public void UpdateFlashSaleAppointmentInfo(HAA18_tagMCFlashSaleAppointmentInfo appointmentInfo) { var operation = GetOperationFlashRushToBuy(); if (operation == null) return; if (operation.ActNum != appointmentInfo.ActNum) { return; } if (appointmentInfo.IsAll == 1) { for (int j = 0; j < operation.flashShops.Count; j++) { var saleItems = operation.flashShops[j].items; for (int k = 0; k < saleItems.Length; k++) { saleItems[k].isAppointment = 0; } } } for (int i = 0; i < appointmentInfo.GoodsCount; i++) { var saleItemInfo = appointmentInfo.GoodsList[i]; if (appointmentInfo.GoodsCount < 2 && saleItemInfo.State == 1 && appointmentInfo.IsAll != 1) { SysNotifyMgr.Instance.ShowTip("FlashRushToBuy1"); } for (int j = 0; j < operation.flashShops.Count; j++) { var saleItems = operation.flashShops[j].items; for (int k = 0; k < saleItems.Length; k++) { if (saleItems[k].shopGuid == saleItemInfo.GoodsMark) { if(saleItems[k].isAppointment != saleItemInfo.State) { saleItems[k].isAppointment = saleItemInfo.State; if(UpdateAppointmentEvent != null && appointmentInfo.IsAll != 1) { UpdateAppointmentEvent((int)saleItemInfo.GoodsMark); } } } } } } if(appointmentInfo.IsAll == 1) { if (UpdateAllAppointmentEvent != null) { UpdateAllAppointmentEvent(); } } } public event ActionUpdateFullSeverBuyEvent; private Dictionary fullSeverBuyInfoDict = new Dictionary(); public void UpdateFullSeverBuyInfo(HA906_tagGCStoreServerBuyCntInfo buyCntInfo) { ModelCenter.Instance.GetModel().UpdateFullSeverBuyInfo(buyCntInfo); for (int i = 0; i < buyCntInfo.Count; i++) { var info = buyCntInfo.InfoList[i]; if(!fullSeverBuyInfoDict.ContainsKey((int)info.GoodsID)) { fullSeverBuyInfoDict.Add((int)info.GoodsID,(int)info.BuyCnt); } else { fullSeverBuyInfoDict[(int)info.GoodsID] = (int)info.BuyCnt; } if (UpdateFullSeverBuyEvent != null) { UpdateFullSeverBuyEvent((int)info.GoodsID); } } } public int GetFullServerBuyCntById(int goodsId) { int buyCnt = 0; fullSeverBuyInfoDict.TryGetValue(goodsId,out buyCnt); return buyCnt; } /// /// 限时抢购预约 /// public void SendFlashSaleAppointment(int shopGuid,int state) { var operation = GetOperationFlashRushToBuy(); if (operation == null) return; CAA05_tagCMFlashSaleAppointment appointment = new CAA05_tagCMFlashSaleAppointment(); appointment.GoodsID = (uint)shopGuid; appointment.State = (byte)state; appointment.ActNum = (byte)operation.ActNum; GameNetSystem.Instance.SendInfo(appointment); } #endregion /// /// 获得限时抢购活动状态 /// /// /// public FlashRushToBuySate GetActivityState(out int seconds,out OperationTime operationTime,out OperationFlashRushToBuy.FlashSaleShop saleShop) { seconds = 0; saleShop = null; operationTime = default(OperationTime); var operation = GetOperationFlashRushToBuy(); if (!IsOpen || operation == null) return FlashRushToBuySate.NoOpen; int openState = 0; int endState = 0; int openSeconds = 0; int endSeconds = 0; for(int i = 0; i < operation.flashShops.Count;i++) { OperationFlashRushToBuy.FlashSaleShop openSaleShop = operation.flashShops[i]; operationTime = operation.times[openSaleShop.timeIndex]; openState = operation.GetBuyTimeState(TimeUtility.ServerNow, openSaleShop.dayIndex, openSaleShop.timeIndex, out openSeconds); if(openState != 1) { saleShop = openSaleShop; break; } } if(operation.flashShops.Count > 0) { OperationFlashRushToBuy.FlashSaleShop endSaleShop = operation.flashShops[operation.flashShops.Count - 1]; endState = operation.GetBuyTimeState(TimeUtility.ServerNow, endSaleShop.dayIndex, endSaleShop.timeIndex, out endSeconds); } switch(openState) { case -1: seconds = openSeconds; return FlashRushToBuySate.InAdvance; case 0: return FlashRushToBuySate.Begining; } switch(endState) { case -1: return FlashRushToBuySate.Begining; case 0: return FlashRushToBuySate.Begining; case 1: return FlashRushToBuySate.End; default: return FlashRushToBuySate.NoOpen; } } public bool CheckIsPush(out OperationFlashRushToBuy.FlashSaleShop saleShop) { int seconds = 0; OperationTime operationTime; saleShop = null; var buyState = GetActivityState(out seconds,out operationTime,out saleShop); switch (buyState) { case FlashRushToBuySate.NoOpen: break; case FlashRushToBuySate.InAdvance: if(saleShop != null && seconds <= 180) { for(int i = 0; i < saleShop.items.Length; i++) { if(saleShop.items[i].isAppointment == 1) { return true; } } } break; case FlashRushToBuySate.Begining: if (saleShop != null) { for (int i = 0; i < saleShop.items.Length; i++) { var saleItem = saleShop.items[i]; if(GetSellSate(saleItem) == 0) { return true; } } } break; case FlashRushToBuySate.End: break; } return false; } /// /// 0 秒杀 1 已买到 2 已抢光 /// /// private int GetSellSate(OperationFlashRushToBuy.FlashSaleItem saleItem) { var buyInfo = storeModel.GetBuyShopLimit((uint)saleItem.shopId); var buyCount = 0; int fullRemainNum = saleItem.fullServerLimitNum - GetFullServerBuyCntById(saleItem.shopId); if (buyInfo != null) { buyCount = buyInfo.BuyCnt; } if (buyCount >= saleItem.limitNum) { return 1; } if (fullRemainNum <= 0) { return 2; } return 0; } private void OperationEndEvent(Operation type, int state) { if (type == Operation.FlashRushToBuy && state == 0) { UpdateRedpoint(); if (onStateUpdate != null) { onStateUpdate(14); } } } private void OperationAdvanceEvent(Operation type) { if (type == Operation.FlashRushToBuy) { if (onStateUpdate != null) { onStateUpdate(14); } } } private void OperationStartEvent(Operation type, int state) { if (type == Operation.FlashRushToBuy && state == 0) { UpdateRedpoint(); if (onStateUpdate != null) { onStateUpdate(14); } } } public void SetDayRemind() { if (flashRushToBuyRedpoint.state == RedPointState.Simple) { SetAlreadyOpenSaleTime(); UpdateRedpoint(); } } public Redpoint flashRushToBuyRedpoint = new Redpoint(MainRedDot.REDPOINT_OPENSERVER, 20914); public event Action onStateUpdate; public void SetAlreadyOpenSaleTime() { int seconds = 0; OperationTime operationTime; OperationFlashRushToBuy.FlashSaleShop saleShop = null; var buyState = GetActivityState(out seconds, out operationTime, out saleShop); if(buyState == FlashRushToBuySate.Begining) { int key = saleShop.dayIndex * 100 + saleShop.timeIndex; if (!flashSaleShops.Contains(key)) { flashSaleShops.Add(key); } } } public List flashSaleShops = new List(); public List GetAlreadyOpenSaleTime() { int[] saveKeys = LocalSave.GetIntArray(AlreadyOpenSaleTimeRecord); flashSaleShops.Clear(); if(saveKeys != null) { for(int i = 0; i < saveKeys.Length; i++) { flashSaleShops.Add(saveKeys[i]); } } return flashSaleShops; } private void UpdateRedpoint() { flashRushToBuyRedpoint.state = RedPointState.None; int seconds = 0; OperationTime operationTime; OperationFlashRushToBuy.FlashSaleShop saleShop = null; var buyState = GetActivityState(out seconds, out operationTime, out saleShop); if(buyState == FlashRushToBuySate.Begining) { int key = saleShop.dayIndex * 100 + saleShop.timeIndex; if(!flashSaleShops.Contains(key)) { flashRushToBuyRedpoint.state = RedPointState.Simple; } } } public enum FlashRushToBuySate { NoOpen, //活动未开启 InAdvance,//提前 Begining, //活动中 End, //结束 } } }