#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerFlashSale
|
#
|
# @todo:ÏÞʱÇÀ¹º»î¶¯
|
# @author xdh
|
# @date 2018-7-17
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ÏÞʱÇÀ¹º»î¶¯
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2018-7-17 12:00"""
|
#-------------------------------------------------------------------------------
|
|
import PyGameData
|
import ShareDefine
|
import PlayerControl
|
import IpyGameDataPY
|
import FunctionNPCCommon
|
import ChPyNetSendPack
|
import NetPackCommon
|
import GameWorld
|
import ChConfig
|
|
import datetime
|
|
def GetActNumDictType(actNum):
|
'''»ñÈ¡»î¶¯·Ö×é±àºÅ¶ÔÓ¦µÄ×ÖµäÀàÐÍ
|
ÒòΪ±¾¹¦ÄÜÓÃÁË ClearNomalDict ²»Í¬µÄ»î¶¯·Ö×鱨Ðë²»Ò»ÑùµÄ×ÖµäÀàÐÍ£¬²»ÄÜ¿ÉÄܵ¼Ö²»Í¬»î¶¯·Ö×éÊý¾ÝÒì³£
|
'''
|
actType = actNum / 10
|
if actType == ShareDefine.ActType_OpenComm:
|
return ChConfig.Def_PDictType_FlashSale
|
if actType == ShareDefine.ActType_MixServer:
|
return ChConfig.Def_PDictType_FlashSaleMix
|
if actType == ShareDefine.ActType_Feast:
|
return ChConfig.Def_PDictType_FlashSaleFeast
|
return 0
|
|
def GetShopTypeList(cfgID, dayIndex, state, woldLV):
|
if cfgID == 0 or state == 0:
|
return []
|
ipyData = IpyGameDataPY.GetIpyGameData("ActFlashSale", cfgID)
|
if not ipyData:
|
return []
|
shopTypeList = GameWorld.GetDictValueByRangeKey(ipyData.GetShopTypeList(), woldLV, [])
|
if not shopTypeList:
|
return []
|
todayShopTypeList = shopTypeList[-1] if dayIndex >= len(shopTypeList) else shopTypeList[dayIndex]
|
return [todayShopTypeList[state - 1] if state - 1 < len(todayShopTypeList) else todayShopTypeList[-1]]
|
|
|
def OnPlayerLogin(curPlayer):
|
|
for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {}).values():
|
actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
|
__CheckPlayerflashSaleAction(curPlayer, actNum)
|
|
return
|
|
def RefreshflashSaleActionInfo(actNum):
|
## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢
|
playerManager = GameWorld.GetPlayerManager()
|
for index in xrange(playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(index)
|
if not GameWorld.IsNormalPlayer(curPlayer):
|
continue
|
__CheckPlayerflashSaleAction(curPlayer, actNum)
|
return
|
|
|
def __CheckPlayerflashSaleAction(curPlayer, actNum):
|
## ¼ì²éÍæ¼ÒÏÞʱÇÀ¹º»î¶¯Êý¾ÝÐÅÏ¢
|
|
playerID = curPlayer.GetPlayerID()
|
|
actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashSale, actNum)
|
actID = actInfo.get(ShareDefine.ActKey_ID, 0)
|
state = actInfo.get(ShareDefine.ActKey_State, 0)
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
|
dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)
|
woldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0)
|
dType = GetActNumDictType(actNum)
|
|
playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleID % actNum, 0, dType) # Íæ¼ÒÉíÉϵĻID
|
playerActState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleState % actNum, 0, dType) # Íæ¼ÒÉíÉϵĻState
|
playerMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleMailState % actNum, 0, dType) # Íæ¼ÒÉíÉϵĻÌáÐÑÓʼþ״̬
|
isReset = False
|
if actID != playerActID or (state != playerActState):
|
isReset = True
|
if cfgID:
|
flashSaleIpyData = IpyGameDataPY.GetIpyGameData("ActFlashSale", cfgID)
|
if not flashSaleIpyData:
|
return
|
startDate, _ = GameWorld.GetOperationActionDateStr(flashSaleIpyData)
|
startTimeNum = GameWorld.ChangeTimeStrToNum(startDate, timeFormat=ChConfig.TYPE_Time_Format_Day)
|
else:
|
startTimeNum = 0
|
if playerMailState != startTimeNum:
|
GameWorld.DebugLog(' ÏÞʱÇÀ¹º»î¶¯ÖØÖÃ! actNum=%s,dType=%s' % (actNum, dType), playerID)
|
curPlayer.ClearNomalDict(dType)
|
|
shopTypeList = GetShopTypeList(cfgID, dayIndex, state, woldLV)
|
if shopTypeList:
|
FunctionNPCCommon.ResetShopItemBuyCountByShopType(curPlayer, shopTypeList)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleID % actNum, actID, dType)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleState % actNum, state, dType)
|
#Sync_flashSaleActionInfo(curPlayer)
|
GameWorld.DebugLog("ÏÞʱÇÀ¹ºµ¥³¡ÖØÖÃ! actNum=%s,actID=%s,playerActID=%s,dayIndex=%s,state=%s,playerActState=%s,shopTypeList=%s,playerMailState=%s" % (actNum, actID, playerActID, dayIndex, state, playerActState, shopTypeList,playerMailState), playerID)
|
else:
|
GameWorld.DebugLog("ÏÞʱÇÀ¹º»î¶¯ID²»±ä£¬²»´¦Àí£¡actNum=%s,actID=%s,state=%s" % (actNum, actID, state), playerID)
|
|
if cfgID:
|
Sync_flashSaleActionInfo(curPlayer, actNum)
|
Sync_FlashSaleAppointmentInfo(curPlayer, actNum)
|
return isReset
|
|
def IsFlashSaleShopType(shopType):
|
## ÅжÏÊÇ·ñ»î¶¯ÖеÄÉ̵ê
|
for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {}).values():
|
actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
|
|
state = actInfo.get(ShareDefine.ActKey_State, 0)
|
if not state:
|
continue
|
shopTypeList = GetShopTypeList(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0), state, actInfo.get(ShareDefine.ActKey_WorldLV, 0))
|
if not shopTypeList:
|
continue
|
actShopType = shopTypeList[0]
|
if shopType == actShopType:
|
GameWorld.DebugLog("ÏÞʱÇÀ¹º»î¶¯ÖеÄÉ̵êÀàÐÍ: actNum=%s,shopType=%s" % (actNum, shopType))
|
return True
|
|
GameWorld.DebugLog("ÏÞʱÇÀ¹º·Ç»î¶¯Öлò·Ç»î¶¯ÖеÄÉ̵êÀàÐÍ£¡shopType=%s" % (shopType))
|
return False
|
|
def ProcessFlashSaleMail(curPlayer, tick):
|
if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_FlashSale, tick):
|
return
|
|
for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {}).values():
|
actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
|
if not actInfo:
|
continue
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
|
if not cfgID:
|
continue
|
dType = GetActNumDictType(actNum)
|
playerMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleMailState % actNum, 0, dType) # Íæ¼ÒÉíÉϵĻÌáÐÑÓʼþ״̬
|
if playerMailState:
|
continue
|
flashSaleIpyData = IpyGameDataPY.GetIpyGameData("ActFlashSale", cfgID)
|
if not flashSaleIpyData:
|
continue
|
mailKey = flashSaleIpyData.GetMailKey()
|
LVLimit = flashSaleIpyData.GetLVLimit()
|
if not mailKey or curPlayer.GetLV() < LVLimit:
|
continue
|
startDate, endDate = GameWorld.GetOperationActionDateStr(flashSaleIpyData)
|
startTimeList = flashSaleIpyData.GetStartTimeList()
|
endTimeList = flashSaleIpyData.GetEndTimeList()
|
if not startTimeList or not endTimeList:
|
continue
|
advanceMinutes = flashSaleIpyData.GetAdvanceMinutes()
|
startTime = datetime.datetime.strptime("%s %s:00" % (startDate, startTimeList[0]), ChConfig.TYPE_Time_Format) + datetime.timedelta(minutes=-advanceMinutes)
|
endTime = datetime.datetime.strptime("%s %s:00" % (endDate, endTimeList[-1]), ChConfig.TYPE_Time_Format)
|
curDateTime = GameWorld.GetCurrentTime()
|
if startTime <= curDateTime <= endTime:
|
paramList = [startDate.replace('-','/'), endDate.replace('-','/'), GameWorld.GbkToCode('¡¢').join(startTimeList)]
|
PlayerControl.SendMailByKey(mailKey, [curPlayer.GetID()], flashSaleIpyData.GetMailItemPrize(), paramList)
|
startTimeNum = GameWorld.ChangeTimeStrToNum(startDate, timeFormat=ChConfig.TYPE_Time_Format_Day)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleMailState % actNum, startTimeNum, dType)
|
GameWorld.DebugLog(" ·¢ËÍÐÂÏÞʱÇÀ¹ºÓʼþÌáÐÑ!", curPlayer.GetID())
|
# else:
|
# GameWorld.DebugLog(" ·¢ËÍÐÂÏÞʱÇÀ¹ºÓʼþÌáÐÑ Ê±¼äûµ½!startTime=%s,endTime=%s,curDateTime=%s"%(startTime,endTime,curDateTime), curPlayer.GetID())
|
return
|
|
|
def Sync_flashSaleActionInfo(curPlayer, actNum):
|
## ֪ͨÏÞʱÇÀ¹º»î¶¯ÐÅÏ¢
|
actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashSale, actNum)
|
if not actInfo:
|
return
|
|
#ÐèÒªÌáǰ֪ͨ£¬ËùÒÔÈ¥µô´ËÏÞÖÆ
|
#if not actInfo.get(ShareDefine.ActKey_State):
|
# return
|
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
|
if not cfgID:
|
return
|
|
flashSaleIpyData = IpyGameDataPY.GetIpyGameData("ActFlashSale", cfgID)
|
if not flashSaleIpyData:
|
return
|
woldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0)
|
shopTypeList = GameWorld.GetDictValueByRangeKey(flashSaleIpyData.GetShopTypeList(), woldLV, [])
|
startTimeList = flashSaleIpyData.GetStartTimeList()
|
endTimeList = flashSaleIpyData.GetEndTimeList()
|
if len(startTimeList) != len(endTimeList):
|
GameWorld.ErrLog("ÏÞʱÇÀ¹º¿ª¹ØÊ±¼äʱ·ÖÅäÖôíÎó!cfgID=%s" % cfgID)
|
return
|
job = curPlayer.GetJob()
|
startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(flashSaleIpyData)
|
packInfo = ChPyNetSendPack.tagMCFlashSaleInfo()
|
packInfo.ActNum = actNum
|
packInfo.StartDate = startDateStr
|
packInfo.EndtDate = endDateStr
|
packInfo.AdvanceMinutes = flashSaleIpyData.GetAdvanceMinutes()
|
packInfo.ActivityTime = []
|
for i, startTime in enumerate(startTimeList):
|
timeInfo = ChPyNetSendPack.tagMCFlashSaleTime()
|
timeInfo.StartTime = startTime
|
timeInfo.EndtTime = endTimeList[i]
|
packInfo.ActivityTime.append(timeInfo)
|
packInfo.ActivityTimeCount = len(packInfo.ActivityTime)
|
packInfo.IsDayReset = flashSaleIpyData.GetIsDayReset()
|
packInfo.LimitLV = flashSaleIpyData.GetLVLimit()
|
packInfo.ShopInfo = []
|
for dayIndex, shopList in enumerate(shopTypeList):
|
for timeIndex, shopType in enumerate(shopList):
|
shopItemIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ShopType":shopType}, True, True)
|
if not shopItemIpyDataList:
|
continue
|
|
shop = ChPyNetSendPack.tagMCFlashSaleShop()
|
shop.DayIndex = dayIndex
|
shop.TimeIndex = timeIndex
|
shop.GiftbagInfo = []
|
|
for itemIpyData in shopItemIpyDataList:
|
giftBag = ChPyNetSendPack.tagMCFlashSaleGiftbag()
|
giftBag.GiftID = itemIpyData.GetID()
|
giftBag.BuyCountLimit = 0 if not itemIpyData.GetLimitCnt() else itemIpyData.GetLimitCnt()[0]
|
giftBag.ServerBuyCountLimit = itemIpyData.GetServerLimitCnt()
|
giftBag.MoneyType = itemIpyData.GetMoneyType()
|
giftBag.MoneyNumber = itemIpyData.GetMoneyNum()
|
giftBag.MoneyOriginal = itemIpyData.GetMoneyOriginal()
|
itemID = itemIpyData.GetItemID()
|
jobItemList = itemIpyData.GetJobItem()
|
jobItemID = FunctionNPCCommon.GetShopJobItem(job, itemID, jobItemList)
|
giftBag.ItemID = jobItemID
|
giftBag.ItemCount = itemIpyData.GetItemCnt()
|
giftBag.IsBind = itemIpyData.GetIsBind()
|
shop.GiftbagInfo.append(giftBag)
|
|
shop.GiftbagCount = len(shop.GiftbagInfo)
|
packInfo.ShopInfo.append(shop)
|
|
packInfo.ShopCount = len(packInfo.ShopInfo)
|
NetPackCommon.SendFakePack(curPlayer, packInfo)
|
return
|
|
|
#// AA 05 ÏÞʱÇÀ¹ºÔ¤Ô¼ #tagCMFlashSaleAppointment
|
#
|
#struct tagCMFlashSaleAppointment
|
#{
|
# tagHead Head;
|
# BYTE ActNum; //»î¶¯±àºÅ
|
# DWORD GoodsID; // ÇÀ¹ºÉÌÆ·±êʶ
|
# BYTE State; // 1-Ô¤Ô¼ 0-È¡Ïû
|
#};
|
def OnFlashSaleAppointment(index, packData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
actNum = packData.ActNum
|
goodsID = packData.GoodsID
|
|
actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashSale, actNum)
|
if not actInfo:
|
return
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
|
if not cfgID:
|
return
|
dType = GetActNumDictType(actNum)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleYY % (actNum, goodsID), packData.State, dType)
|
Sync_FlashSaleAppointmentInfo(curPlayer, actNum, goodsID)
|
return
|
|
|
def Sync_FlashSaleAppointmentInfo(curPlayer, actNum, goodsID=0):
|
##֪ͨÏÞʱÇÀ¹ºÔ¤Ô¼Çé¿ö
|
actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashSale, actNum)
|
if not actInfo:
|
return
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
|
if not cfgID:
|
return
|
flashSaleIpyData = IpyGameDataPY.GetIpyGameData("ActFlashSale", cfgID)
|
if not flashSaleIpyData:
|
return
|
woldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0)
|
dType = GetActNumDictType(actNum)
|
|
packInfo = ChPyNetSendPack.tagMCFlashSaleAppointmentInfo()
|
packInfo.ActNum = actNum
|
packInfo.GoodsList = []
|
if goodsID == 0:
|
packInfo.IsAll = 1
|
shopTypeList = GameWorld.GetDictValueByRangeKey(flashSaleIpyData.GetShopTypeList(), woldLV, [])
|
for dayIndex, shopList in enumerate(shopTypeList):
|
for timeIndex, shopType in enumerate(shopList):
|
shopItemIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ShopType":shopType}, True, True)
|
if not shopItemIpyDataList:
|
continue
|
for i in xrange(len(shopItemIpyDataList)):
|
goodsMark = dayIndex * 10000 + timeIndex * 100 + i #ÉÌÆ·±êʶ
|
isAppointment = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleYY % (actNum, goodsMark), 0, dType)
|
if isAppointment:
|
appoinetmentPack = ChPyNetSendPack.tagMCFlashSaleAppointmentState()
|
appoinetmentPack.GoodsMark = goodsMark
|
appoinetmentPack.State = 1
|
packInfo.GoodsList.append(appoinetmentPack)
|
else:
|
packInfo.IsAll = 0
|
isAppointment = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleYY % (actNum, goodsID), 0, dType)
|
appoinetmentPack = ChPyNetSendPack.tagMCFlashSaleAppointmentState()
|
appoinetmentPack.GoodsMark = goodsID
|
appoinetmentPack.State = isAppointment
|
packInfo.GoodsList.append(appoinetmentPack)
|
packInfo.GoodsCount = len(packInfo.GoodsList)
|
NetPackCommon.SendFakePack(curPlayer, packInfo)
|
return
|