using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
|
namespace Snxxz.UI
|
{
|
public class FlashRushToBuyModel : Model,IBeforePlayerDataInitialize,IPlayerLoginOk,IOpenServerActivity
|
{
|
StoreModel storeModel { get { return ModelCenter.Instance.GetModel<StoreModel>(); } }
|
HeavenBattleModel battleModel { get { return ModelCenter.Instance.GetModel<HeavenBattleModel>(); } }
|
|
public override void Init()
|
{
|
OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent;
|
OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent;
|
OperationTimeHepler.Instance.operationAdvanceEvent += OperationAdvanceEvent;
|
TimeMgr.Instance.OnDayEvent += OnDayEvent;
|
OpenServerActivityCenter.Instance.Register(4, this);
|
}
|
|
public void OnBeforePlayerDataInitialize()
|
{
|
}
|
|
public void OnPlayerLoginOk()
|
{
|
if(!WindowCenter.Instance.IsOpen<OpenServerActivityNotifyWin>())
|
{
|
WindowCenter.Instance.Open<OpenServerActivityNotifyWin>();
|
}
|
//UpdateRedpoint();
|
}
|
|
public override void UnInit()
|
{
|
OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent;
|
OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent;
|
OperationTimeHepler.Instance.operationAdvanceEvent -= OperationAdvanceEvent;
|
TimeMgr.Instance.OnDayEvent -= OnDayEvent;
|
}
|
|
public bool IsOpen
|
{
|
get
|
{
|
var operation = GetOperationFlashRushToBuy();
|
if(operation != null)
|
{
|
return operation.SatisfyOpenCondition();
|
}
|
return false;
|
}
|
}
|
|
public bool priorityOpen
|
{
|
get
|
{
|
return flashSaleRedpoint.state == RedPointState.Simple;
|
}
|
}
|
|
public bool IsAdvance
|
{
|
get
|
{
|
return OperationTimeHepler.Instance.SatisfyAdvanceCondition(Operation.FlashRushToBuy);
|
}
|
}
|
|
public void SetDefaultSelectSaleTime()
|
{
|
OperationFlashRushToBuy operation = GetOperationFlashRushToBuy();
|
if (presentFlashShop != null)
|
{
|
int seconds = 0;
|
int buyState = operation.GetBuyTimeState(TimeUtility.ServerNow,presentFlashShop.dayIndex,presentFlashShop.timeIndex, out seconds);
|
if(buyState != 1)
|
{
|
return;
|
}
|
}
|
|
for (int i = 0; i < operation.flashShops.Count; i++)
|
{
|
int days = operation.totalDays + 1;
|
int dayIndex = i / (operation.flashShops.Count / days);
|
int timeIndex = i % (operation.flashShops.Count / days);
|
int seconds = 0;
|
OperationTime operationTime = operation.times[timeIndex];
|
var date = operation.startDate;
|
int buyState = operation.GetBuyTimeState(TimeUtility.ServerNow, dayIndex, timeIndex, out seconds);
|
switch(buyState)
|
{
|
case -1:
|
case 0:
|
UpdateSelectFlashSaleTime(dayIndex,timeIndex);
|
return;
|
}
|
}
|
}
|
|
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<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];
|
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)
|
{
|
UpdateAppointmentEvent((int)saleItemInfo.GoodsMark);
|
}
|
}
|
}
|
}
|
}
|
}
|
if(appointmentInfo.IsAll == 1)
|
{
|
if (UpdateAllAppointmentEvent != null)
|
{
|
UpdateAllAppointmentEvent();
|
}
|
}
|
|
}
|
/// <summary>
|
/// Value1 商品ID Value2 全服购买次数
|
/// </summary>
|
/// <returns></returns>
|
public GameRecInfo GetFullServerInfo()
|
{
|
var infolist = battleModel.GetBatterInfoListByType(8);
|
if(infolist != null && infolist.Count > 0)
|
{
|
return infolist[0];
|
}
|
return null;
|
}
|
|
/// <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:
|
return true;
|
case FlashRushToBuySate.End:
|
break;
|
}
|
return false;
|
}
|
|
private void OperationEndEvent(Operation type, int state)
|
{
|
if (type == Operation.FlashRushToBuy && state == 0)
|
{
|
UpdateRedpoint();
|
if (onStateUpate != null)
|
{
|
onStateUpate(4);
|
}
|
}
|
}
|
|
private void OperationAdvanceEvent(Operation type)
|
{
|
if (type == Operation.FlashRushToBuy)
|
{
|
if (onStateUpate != null)
|
{
|
onStateUpate(4);
|
}
|
}
|
}
|
|
private void OperationStartEvent(Operation type, int state)
|
{
|
if (type == Operation.FlashRushToBuy && state == 0)
|
{
|
UpdateRedpoint();
|
if (onStateUpate != null)
|
{
|
onStateUpate(4);
|
}
|
}
|
}
|
|
private void OnDayEvent()
|
{
|
UpdateRedpoint();
|
}
|
|
public void SetDayRemind()
|
{
|
if (flashSaleRedpoint.state == RedPointState.Simple)
|
{
|
DayRemind.Instance.SetDayRemind(DayRemind.FLASHSALE_REDPOINT, true);
|
UpdateRedpoint();
|
}
|
}
|
|
public void SendBuyFlashSale(OperationFlashSale.FlashSaleGift gift)
|
{
|
OperationBase operationBase;
|
if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.FlashSale, out operationBase))
|
{
|
OperationFlashSale operation = operationBase as OperationFlashSale;
|
if (operation.InAdvanceTime(TimeUtility.ServerNow))
|
{
|
var seconds = operation.GetSecondsBeforeStart(TimeUtility.ServerNow);
|
SysNotifyMgr.Instance.ShowTip("FlashSaleAdvanceLimit", TimeUtility.SecondsToHMS(seconds));
|
return;
|
}
|
if (!operation.InTime(TimeUtility.ServerNow))
|
{
|
SysNotifyMgr.Instance.ShowTip("ActiveOutTime");
|
return;
|
}
|
if (!gift.Equals(default(OperationFlashSale.FlashSaleGift)))
|
{
|
var buyInfo = storeModel.GetBuyShopLimit((uint)gift.id);
|
var buyCount = 0;
|
if (buyInfo != null)
|
{
|
buyCount = buyInfo.BuyCnt;
|
}
|
if (buyCount >= gift.limitNum)
|
{
|
return;
|
}
|
|
if (UIHelper.GetMoneyCnt(gift.moneyType) < (ulong)gift.moneyNumber)
|
{
|
switch (gift.moneyType)
|
{
|
case 1:
|
if (VersionConfig.Get().isBanShu)
|
{
|
SysNotifyMgr.Instance.ShowTip("GoldErr");
|
return;
|
}
|
WindowCenter.Instance.Open<RechargeTipWin>();
|
break;
|
default:
|
SysNotifyMgr.Instance.ShowTip("LackMoney", gift.moneyType);
|
break;
|
}
|
return;
|
}
|
if (gift.moneyType == 1)
|
{
|
ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"),
|
Language.Get("OSTimeLimitGiftConfirm", gift.moneyNumber), (bool isOk) =>
|
{
|
if (isOk)
|
{
|
C0803_tagCBuyItemList pak = new C0803_tagCBuyItemList();
|
pak.NPCID = 0;
|
pak.BuyItemIndex = (ushort)gift.id;
|
pak.BuyCount = 1;
|
GameNetSystem.Instance.SendInfo(pak);
|
}
|
});
|
}
|
else
|
{
|
C0803_tagCBuyItemList pak = new C0803_tagCBuyItemList();
|
pak.NPCID = 0;
|
pak.BuyItemIndex = (ushort)gift.id;
|
pak.BuyCount = 1;
|
GameNetSystem.Instance.SendInfo(pak);
|
}
|
}
|
}
|
else
|
{
|
SysNotifyMgr.Instance.ShowTip("ActiveOutTime");
|
}
|
|
}
|
|
public bool HasNotBuyGift()
|
{
|
OperationBase operationBase;
|
OperationTimeHepler.Instance.TryGetOperationTime(Operation.FlashSale, out operationBase);
|
if (operationBase != null && operationBase.InTime(TimeUtility.ServerNow))
|
{
|
OperationFlashSale operation = operationBase as OperationFlashSale;
|
OperationFlashSale.FlashSale flashShop;
|
if (operation.TryGetFlashSale(TimeUtility.ServerNow, out flashShop))
|
{
|
for (int i = 0; i < flashShop.gifts.Length; i++)
|
{
|
var gift = flashShop.gifts[i];
|
var buyInfo = storeModel.GetBuyShopLimit((uint)gift.id);
|
if (buyInfo == null || buyInfo.BuyCnt < gift.limitNum)
|
{
|
return true;
|
}
|
}
|
}
|
}
|
return false;
|
}
|
|
public Redpoint flashSaleRedpoint = new Redpoint(MainRedDot.REDPOINT_OPENSERVER, 20904);
|
|
public event Action<int> onStateUpate;
|
|
private void UpdateRedpoint()
|
{
|
flashSaleRedpoint.state = RedPointState.None;
|
if (IsOpen && HasNotBuyGift() && !DayRemind.Instance.GetDayRemind(DayRemind.FLASHSALE_REDPOINT))
|
{
|
flashSaleRedpoint.state = RedPointState.Simple;
|
}
|
}
|
|
public enum FlashRushToBuySate
|
{
|
NoOpen, //活动未开启
|
InAdvance,//提前
|
Begining, //活动中
|
End, //结束
|
}
|
}
|
}
|