少年修仙传客户端代码仓库
Client_PangDeRong
2018-11-16 f8e93ee9145f4aebaffac16223c7bf8d8d1b9aa8
4742 【1.3】【前端】神秘限购开发
2个文件已修改
4个文件已添加
693 ■■■■■ 已修改文件
System/OpenServerActivity/ImpactRankModel.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/MysticalPurchaseModel.cs 438 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/MysticalPurchaseModel.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/OperationMysticalPurchase.cs 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/OperationMysticalPurchase.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Welfare/OperationTimeHepler.cs 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/ImpactRankModel.cs
@@ -803,6 +803,8 @@
            WheelOfrtune,
            [Header("累计充值")]
            AccumulateRecharge,
            [Header("神秘限购")]
            MysticalPurchase,
        }
    }
System/OpenServerActivity/MysticalPurchaseModel.cs
New file
@@ -0,0 +1,438 @@
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, //结束
        }
    }
}
System/OpenServerActivity/MysticalPurchaseModel.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: a257cceb6520e8d489f43e538f684d52
timeCreated: 1542336543
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/OpenServerActivity/OperationMysticalPurchase.cs
New file
@@ -0,0 +1,188 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Snxxz.UI
{
    public class OperationMysticalPurchase : OperationBase
    {
        public List<FlashSaleShop> flashShops = new List<FlashSaleShop>();
        public bool TryGetFlashShop(int dayIndex,int timeIndex ,out FlashSaleShop flashSaleShop)
        {
           flashSaleShop = null;
           for (int i = 0; i < flashShops.Count; i++)
            {
                var shop = flashShops[i];
                if (shop.dayIndex == dayIndex
                    && shop.timeIndex == timeIndex)
                {
                    flashSaleShop = shop;
                    return true;
                }
            }
            return false;
        }
        public bool TryGetFlashItem(int shopGuid,out FlashSaleShop flashSaleShop, out FlashSaleItem saleItem)
        {
            saleItem = null;
            flashSaleShop = null;
            for (int i = 0; i < flashShops.Count; i++)
            {
                var saleItems = flashShops[i].items;
                for (int j = 0; j < saleItems.Length; j++)
                {
                    if (saleItems[j].shopGuid == shopGuid)
                    {
                        flashSaleShop = flashShops[i];
                        saleItem = saleItems[j];
                        return true;
                    }
                }
            }
            return false;
        }
        /// <summary>
        ///-1 未开始 0 开始 1结束
        /// </summary>
        /// <param name="time"></param>
        /// <param name="dayIndex"></param>
        /// <param name="timeIndex"></param>
        /// <returns></returns>
        public int GetBuyTimeState(DateTime time,int dayIndex,int timeIndex,out int seconds)
        {
            seconds = 0;
            int day = startDate.day + dayIndex;
            OperationTime operationTime = times[timeIndex];
            var startTime = new DateTime(startDate.year, startDate.month,day, operationTime.startHour, operationTime.startMinute,0);
            var endTime = new DateTime(startDate.year, startDate.month,day, operationTime.endHour, operationTime.endMinute, 0);
            int advanceSec = Mathf.CeilToInt((float)(startTime - time).TotalSeconds);
            int endSec = Mathf.CeilToInt((float)(endTime - time).TotalSeconds);
            if (advanceSec > 0)
            {
                seconds = advanceSec;
                return -1;
            }
            else if(endSec <= 0)
            {
                return 1;
            }
            else
            {
                seconds = endSec;
                return 0;
            }
        }
        public string ToDisplayBuyTime(int month,int day,int startHour,int startMinute)
        {
            return StringUtility.Contact(month, Language.Get("Month"), day, Language.Get("Day"), startHour.ToString("D2"), ":", startMinute.ToString("D2"));
        }
        public string ToDisplayBuyTime(int startHour, int startMinute)
        {
            return StringUtility.Contact(startHour.ToString("D2"), ":", startMinute.ToString("D2"));
        }
        public override bool SatisfyOpenCondition()
        {
            if(PlayerDatas.Instance.baseData.LV >= limitLv)
            {
                if(flashShops.Count > 0)
                {
                    int openSeconds = 0;
                    int endSeconds = 0;
                    var fristShop = flashShops[0];
                    var lastShop = flashShops[flashShops.Count - 1];
                    int OpenState = GetBuyTimeState(TimeUtility.ServerNow,fristShop.dayIndex,fristShop.timeIndex, out openSeconds);
                    int endState = GetBuyTimeState(TimeUtility.ServerNow,lastShop.dayIndex, lastShop.timeIndex,out endSeconds);
                    if(OpenState == -1 && openSeconds <= inAdvanceMinute*60)
                    {
                        return true;
                    }
                    else if(endState != 1 && OpenState != -1)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
        public override void Reset()
        {
            base.Reset();
            flashShops.Clear();
        }
        public override string ToDisplayTime()
        {
            var textBuilder = OperationTimeHepler.textBuilder;
            textBuilder.Length = 0;
            textBuilder.Append(startDate.ToDisplay());
            if (startDate != endDate)
            {
                textBuilder.Append("—");
                textBuilder.Append(endDate.ToDisplay());
            }
            return textBuilder.ToString();
        }
        public void ParsePackage(HAA17_tagMCFlashSaleInfo package)
        {
            for (int i = 0; i < package.ShopCount; i++)
            {
                var gift = new FlashSaleShop();
                var shop = package.ShopInfo[i];
                gift.dayIndex = shop.DayIndex;
                gift.timeIndex = shop.TimeIndex;
                gift.items = new FlashSaleItem[shop.GiftbagCount];
                for (int k = 0; k < shop.GiftbagCount; k++)
                {
                    var item = new FlashSaleItem();
                    var saleItem = shop.GiftbagInfo[k];
                    item.shopId = (int)saleItem.GiftID;
                    item.shopGuid = shop.DayIndex*10000 + shop.TimeIndex*100 + k;
                    item.limitNum = saleItem.BuyCountLimit;
                    item.fullServerLimitNum = saleItem.ServerBuyCountLimit;
                    item.moneyType = saleItem.MoneyType;
                    item.moneyNumber = (int)saleItem.MoneyNumber;
                    item.moneyOriginal = (int)saleItem.MoneyOriginal;
                    item.itemId = (int)saleItem.ItemID;
                    item.itemCount = saleItem.ItemCount;
                    item.isBind = saleItem.IsBind;
                    item.isAppointment = 0;
                    gift.items[k] = item;
                }
                flashShops.Add(gift);
            }
        }
        public class FlashSaleShop
        {
            public int dayIndex; // 活动第几天
            public int timeIndex;//第几个时间段
            public FlashSaleItem[] items;
        }
        public class FlashSaleItem
        {
            public int shopId;
            public int shopGuid;
            public int limitNum;//个人限购数量
            public int fullServerLimitNum; //个人限购数量
            public int moneyType;
            public int moneyNumber;
            public int moneyOriginal;
            public int itemId;
            public int itemCount;
            public int isBind;
            public int isAppointment; //是否预约
        }
    }
}
System/OpenServerActivity/OperationMysticalPurchase.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 7221a4f58ebdf3644aae88456e0e2f31
timeCreated: 1542336331
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/Welfare/OperationTimeHepler.cs
@@ -296,6 +296,46 @@
        }
        /// <summary>
        /// 神秘限购
        /// </summary>
        /// <param name="package"></param>
        public void UpdateMysticalPurchase(HAA17_tagMCFlashSaleInfo package)
        {
            OperationBase operationBase = null;
            operationDict.TryGetValue(Operation.MysticalPurchase, out operationBase);
            if (string.IsNullOrEmpty(package.StartDate) || string.IsNullOrEmpty(package.EndtDate))
            {
                ForceStopOperation(Operation.MysticalPurchase);
            }
            else
            {
                if (operationBase == null)
                {
                    operationBase = new OperationMysticalPurchase();
                    operationDict.Add(Operation.MysticalPurchase, operationBase);
                }
                OperationMysticalPurchase operation = operationBase as OperationMysticalPurchase;
                operation.Reset();
                operation.limitLv = package.LimitLV;
                operation.startDate = ParseOperationDate(package.StartDate);
                operation.endDate = ParseOperationDate(package.EndtDate);
                operation.dayReset = package.IsDayReset == 1;
                operation.inAdvanceMinute = package.AdvanceMinutes;
                for (int i = 0; i < package.ActivityTimeCount; i++)
                {
                    operation.times.Add(ParseOperationTime(package.ActivityTime[i].StartTime,
                        package.ActivityTime[i].EndtTime));
                }
                operation.ParsePackage(package);
                if (operationTimeUpdateEvent != null)
                {
                    operationTimeUpdateEvent(Operation.MysticalPurchase);
                }
            }
        }
        /// <summary>
        /// 许愿池
        /// </summary>
        /// <param name="package"></param>
@@ -758,6 +798,7 @@
        FlashRushToBuy, //限时抢购
        WishingWellInfo, //许愿池
        AccumulateRecharge,//累计充值
        MysticalPurchase, //神秘限购
        max,
    }
}