#!/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