| New file |
| | |
| | | using System;
|
| | | using System.Collections.Generic;
|
| | | using System.Linq;
|
| | | using System.Text;
|
| | | using UnityEngine;
|
| | |
|
| | | namespace Snxxz.UI
|
| | | {
|
| | | [XLua.LuaCallCSharp]
|
| | | public class MysticalPurchaseModel : Model,IBeforePlayerDataInitialize,IPlayerLoginOk,IOpenServerActivity
|
| | | {
|
| | | StoreModel storeModel { get { return ModelCenter.Instance.GetModel<StoreModel>(); } }
|
| | | public override void Init()
|
| | | {
|
| | | OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent;
|
| | | OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent;
|
| | | OperationTimeHepler.Instance.operationAdvanceEvent += OperationAdvanceEvent;
|
| | | OpenServerActivityCenter.Instance.Register((int)OpenServerActivityCenter.OSActivityType.MysticalPurchase, this);
|
| | | }
|
| | |
|
| | | public void OnBeforePlayerDataInitialize()
|
| | | {
|
| | | fullSeverBuyInfoDict.Clear();
|
| | | }
|
| | |
|
| | | public void OnPlayerLoginOk()
|
| | | {
|
| | | 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.MysticalPurchase);
|
| | | }
|
| | | }
|
| | |
|
| | | 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.MysticalPurchase, out operationBase))
|
| | | {
|
| | | return operationBase as OperationFlashRushToBuy;
|
| | | }
|
| | |
|
| | | return null;
|
| | | }
|
| | | #endregion
|
| | |
|
| | | #region 协议
|
| | | public event Action UpdateAllAppointmentEvent;
|
| | | public event Action<int> UpdateAppointmentEvent;
|
| | | public void UpdateFlashSaleAppointmentInfo(HAA18_tagMCFlashSaleAppointmentInfo appointmentInfo)
|
| | | {
|
| | | var operation = GetOperationFlashRushToBuy();
|
| | | if (operation == null) 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)
|
| | | {
|
| | | 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 Action<int>UpdateFullSeverBuyEvent;
|
| | | private Dictionary<int, int> fullSeverBuyInfoDict = new Dictionary<int, int>();
|
| | | public void UpdateFullSeverBuyInfo(HA906_tagGCStoreServerBuyCntInfo 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;
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 限时抢购预约
|
| | | /// </summary>
|
| | | public void SendFlashSaleAppointment(int shopGuid,int state)
|
| | | {
|
| | | CAA05_tagCMFlashSaleAppointment appointment = new CAA05_tagCMFlashSaleAppointment();
|
| | | appointment.GoodsID = (uint)shopGuid;
|
| | | appointment.State = (byte)state;
|
| | | GameNetSystem.Instance.SendInfo(appointment);
|
| | | }
|
| | | #endregion
|
| | |
|
| | | /// <summary>
|
| | | /// 获得限时抢购活动状态
|
| | | /// </summary>
|
| | | /// <param name="seconds"></param>
|
| | | /// <returns></returns>
|
| | | 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;
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 0 秒杀 1 已买到 2 已抢光
|
| | | /// </summary>
|
| | | /// <returns></returns>
|
| | | 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.MysticalPurchase && state == 0)
|
| | | {
|
| | | UpdateRedpoint();
|
| | | if (onStateUpate != null)
|
| | | {
|
| | | onStateUpate((int)OpenServerActivityCenter.OSActivityType.MysticalPurchase);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | private void OperationAdvanceEvent(Operation type)
|
| | | {
|
| | | if (type == Operation.MysticalPurchase)
|
| | | {
|
| | | if (onStateUpate != null)
|
| | | {
|
| | | onStateUpate((int)OpenServerActivityCenter.OSActivityType.MysticalPurchase);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | private void OperationStartEvent(Operation type, int state)
|
| | | {
|
| | | if (type == Operation.MysticalPurchase && state == 0)
|
| | | {
|
| | | UpdateRedpoint();
|
| | | if (onStateUpate != null)
|
| | | {
|
| | | onStateUpate((int)OpenServerActivityCenter.OSActivityType.MysticalPurchase);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | public void SetDayRemind()
|
| | | {
|
| | | if (flashRushToBuyRedpoint.state == RedPointState.Simple)
|
| | | {
|
| | | SetAlreadyOpenSaleTime();
|
| | | UpdateRedpoint();
|
| | | }
|
| | | }
|
| | | |
| | | public Redpoint flashRushToBuyRedpoint = new Redpoint(MainRedDot.REDPOINT_OPENSERVER, 20914);
|
| | |
|
| | | public event Action<int> onStateUpate;
|
| | | 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;
|
| | | }
|
| | | }
|
| | |
|
| | | 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;
|
| | | }
|
| | | |
| | | }
|
| | |
|
| | | public enum FlashRushToBuySate
|
| | | {
|
| | | NoOpen, //活动未开启
|
| | | InAdvance,//提前
|
| | | Begining, //活动中
|
| | | End, //结束
|
| | | }
|
| | | }
|
| | | }
|