#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerFlashGiftbag # # @todo:ÏÞʱÀñ°ü # @author hxp # @date 2018-7-20 # @version 1.0 # # ÏêϸÃèÊö: ÏÞʱÀñ°ü # #------------------------------------------------------------------------------- #"""Version = 2018-7-20 17:30""" #------------------------------------------------------------------------------- import PyGameData import ShareDefine import PlayerControl import IpyGameDataPY import NetPackCommon import ChPyNetSendPack import DataRecordPack import ItemControler import PlayerWeekParty import GameWorld import ChConfig import CommFunc import PlayerCoin def GetGiftbagTypeList(cfgID, dayIndex, woldLV): if cfgID == None or dayIndex == None: return [] ipyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID) if not ipyData: return [] giftbagTypeList = GameWorld.GetDictValueByRangeKey(ipyData.GetGiftbagTypeList(), woldLV, []) todayGiftbag = giftbagTypeList[-1] if dayIndex >= len(giftbagTypeList) else giftbagTypeList[dayIndex] return todayGiftbag def OnPlayerLogin(curPlayer): for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {}).values(): actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) isReset = __CheckPlayerFlashGiftbagAction(curPlayer, actNum) if not isReset: pass return def RefreshFlashGiftbagActionInfo(actNum): ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢ playerManager = GameWorld.GetPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not GameWorld.IsNormalPlayer(curPlayer): continue __CheckPlayerFlashGiftbagAction(curPlayer, actNum) return def __CheckPlayerFlashGiftbagAction(curPlayer, actNum): ## ¼ì²éÍæ¼ÒÏÔʾÀñ°ü»î¶¯Êý¾ÝÐÅÏ¢ playerID = curPlayer.GetPlayerID() actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashGiftbag, actNum) actID = actInfo.get(ShareDefine.ActKey_ID, 0) state = actInfo.get(ShareDefine.ActKey_State, 0) cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0) playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagID % actNum) # Íæ¼ÒÉíÉϵĻID giftbagTypeList = [] if not cfgID else GetGiftbagTypeList(cfgID, actInfo.get(ShareDefine.ActKey_DayIndex, 0), actInfo.get(ShareDefine.ActKey_WorldLV, 0)) isReset = False if actID != playerActID: isReset = True Sync_FlashGiftbagActionInfo(curPlayer, actNum) __ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList, actNum) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagID % actNum, actID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagMailState % actNum, 0) GameWorld.DebugLog("ÏÞʱÀñ°üÖØÖÃ! actNum=%s,actID=%s,playerActID=%s,state=%s,giftbagTypeList=%s" % (actNum, actID, playerActID, state, giftbagTypeList), playerID) else: GameWorld.DebugLog("ÏÞʱÀñ°ü»î¶¯ID²»±ä£¬²»´¦Àí£¡actNum=%s,playerActID=%s" % (actNum, playerActID), curPlayer.GetPlayerID()) playerMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagMailState % actNum) # Íæ¼ÒÉíÉϵĻÌáÐÑÓʼþ״̬ if actID and state and state != playerMailState: flashGiftbagIpyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID) if flashGiftbagIpyData and flashGiftbagIpyData.GetMailKey() and curPlayer.GetLV() >= flashGiftbagIpyData.GetLVLimit(): PlayerControl.SendMailByKey(flashGiftbagIpyData.GetMailKey(), [playerID], flashGiftbagIpyData.GetMailItemPrize()) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagMailState % actNum, state) GameWorld.DebugLog(" ·¢ËÍÐÂÏÞʱÀñ°üÓʼþÌáÐÑ! state=%s,playerMailState=%s" % (state, playerMailState), playerID) if not isReset and cfgID: Sync_FlashGiftbagActionInfo(curPlayer, actNum) if giftbagTypeList: SyncFlashGiftbagBuyCount(curPlayer, actNum, giftbagTypeList=giftbagTypeList) return isReset def __ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList, actNum): ##ÖØÖÃÏÞʱÀñ°üÏÞ¹ºÎïÆ·´ÎÊý syncIDList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for i in xrange(ipyDataMgr.GetFlashGiftbagCount()): giftbag = ipyDataMgr.GetFlashGiftbagByIndex(i) if not giftbag.GetBuyCountLimit(): continue if giftbag.GetGiftbagType() not in giftbagTypeList: continue buyCntKey = ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftbag.GetGiftbagID()) if curPlayer.NomalDictGetProperty(buyCntKey) <= 0: continue PlayerControl.NomalDictSetProperty(curPlayer, buyCntKey, 0) syncIDList.append(giftbag.GetGiftbagID()) if syncIDList: SyncFlashGiftbagBuyCount(curPlayer, actNum, syncIDList) return def OnPlayerOrderGiftbag(curPlayer, giftbagIDList, addDRDict): ## Íæ¼Ò¶©¹ºÏÞʱÀñ°ü canBuy = False for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {}).values(): actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) state = actInfo.get(ShareDefine.ActKey_State, 0) if not state: continue cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0) giftbagTypeList = GetGiftbagTypeList(cfgID, actInfo.get(ShareDefine.ActKey_DayIndex, 0), actInfo.get(ShareDefine.ActKey_WorldLV, 0)) if not giftbagTypeList: continue actGiftbagType = giftbagTypeList[-1] if state > len(giftbagTypeList) else giftbagTypeList[state - 1] giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("FlashGiftbag", {"GiftbagType":actGiftbagType}, True, True) actGiftbagIDList = [] giftbagIpyData = None for ipyData in giftbagIpyDataList: actGiftbagIDList.append(ipyData.GetGiftbagID()) if ipyData.GetGiftbagID() in giftbagIDList: giftbagIpyData = ipyData break if not giftbagIpyData: continue flashGiftbagIpyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID) if not flashGiftbagIpyData: continue isJueban = flashGiftbagIpyData.GetIsJueban() if isJueban: for ipyData in giftbagIpyDataList: juebanGiftbagID = ipyData.GetGiftbagID() juebanBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, juebanGiftbagID)) if juebanGiftbagID not in giftbagIDList and juebanBuyCount > 0: DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag JueBan pay limit! have already bought other giftbagID=%s" % juebanGiftbagID, addDRDict) return giftbagID = giftbagIpyData.GetGiftbagID() giftItemList = __GetJobItemList(giftbagIpyData.GetGiftItemList(), curPlayer.GetJob()) addDRDict.update({"giftbagID":giftbagID, "giftItemList":giftItemList}) buyCountLimit = giftbagIpyData.GetBuyCountLimit() buyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftbagID)) if buyCountLimit: addDRDict.update({"buyCountLimit":buyCountLimit, "buyCount":buyCount}) if buyCount >= buyCountLimit: PlayerCoin.ExchangePayCoin(curPlayer, "FlashGiftbag Pay count limit !buyCount=%s,buyCountLimit=%s" % (buyCount, buyCountLimit), addDRDict) return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftbagID), buyCount + 1) if giftItemList: ItemControler.GivePlayerItemOrMail(curPlayer, giftItemList, "", event=[ChConfig.ItemGive_CTG, True, addDRDict]) # È¡Íæ¼ÒAPPID£¬»ì·þʹÓà appID = GameWorld.GetPlayerPlatform(curPlayer) notifyKey = giftbagIpyData.GetNotifyKey() if notifyKey: orderIpyData = GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID) rmb = "0" if not orderIpyData else str(orderIpyData.GetPayRMBNum()) # RMBÖ§³ÖСÊý£¬ÕâÀïÖ±½Óתstr¹ã²¥ PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), rmb, giftbagIpyData.GetMainItemID()]) SyncFlashGiftbagBuyCount(curPlayer, actNum, [giftbagID]) PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_GiftBag, actGiftbagType, False) canBuy = True GameWorld.DebugLog(" ¹ºÂòÏÞʱÀñ°ü: actNum=%s,actGiftbagType=%s,giftbagID=%s,buyCount=%s,isJueban=%s" % (actNum, actGiftbagType, giftbagID, buyCount + 1, isJueban)) break if not canBuy: DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag can not buy!", addDRDict) return return True def __GetJobItemList(itemList, job): jobItemList = [] for itemID, itemCnt, isBind in itemList: if type(itemID) == int: jobItemList.append([itemID, itemCnt, isBind]) elif job in itemID: jobItemList.append([itemID[job], itemCnt, isBind]) return jobItemList def SyncFlashGiftbagBuyCount(curPlayer, actNum, syncIDList=[], giftbagTypeList=[]): ## ֪ͨÏÞʱÀñ°üÍæ¼Ò»î¶¯ÐÅÏ¢ giftbagBuyInfo = ChPyNetSendPack.tagMCFlashGiftbagPlayerInfo() giftbagBuyInfo.ActNum = actNum giftbagBuyInfo.BuyCountList = [] if syncIDList: for giftID in syncIDList: buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftID)) buyCountInfo = ChPyNetSendPack.tagMCFlashGiftbagBuyCount() buyCountInfo.GiftbagID = giftID buyCountInfo.BuyCount = buyCnt giftbagBuyInfo.BuyCountList.append(buyCountInfo) else: ipyDataMgr = IpyGameDataPY.IPY_Data() for i in xrange(ipyDataMgr.GetFlashGiftbagCount()): giftbag = ipyDataMgr.GetFlashGiftbagByIndex(i) if not giftbag.GetBuyCountLimit(): continue if giftbagTypeList and giftbag.GetGiftbagType() not in giftbagTypeList: continue giftID = giftbag.GetGiftbagID() buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftID)) if buyCnt <= 0: continue buyCountInfo = ChPyNetSendPack.tagMCFlashGiftbagBuyCount() buyCountInfo.GiftbagID = giftID buyCountInfo.BuyCount = buyCnt giftbagBuyInfo.BuyCountList.append(buyCountInfo) giftbagBuyInfo.Count = len(giftbagBuyInfo.BuyCountList) NetPackCommon.SendFakePack(curPlayer, giftbagBuyInfo) return def Sync_FlashGiftbagActionInfo(curPlayer, actNum): ## ֪ͨÏÞʱÀñ°ü»î¶¯ÐÅÏ¢ actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashGiftbag, actNum) if not actInfo: return #ÐèÒªÌáǰ֪ͨ£¬ËùÒÔÈ¥µô´ËÏÞÖÆ #if not actInfo.get(ShareDefine.ActKey_State): # return cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0) if not cfgID: return giftbagTypeList = GetGiftbagTypeList(cfgID, actInfo.get(ShareDefine.ActKey_DayIndex, 0), actInfo.get(ShareDefine.ActKey_WorldLV, 0)) if not giftbagTypeList: return flashGiftbagIpyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID) if not flashGiftbagIpyData: return startTimeList = flashGiftbagIpyData.GetStartTimeList() endTimeList = flashGiftbagIpyData.GetEndTimeList() if len(startTimeList) != len(endTimeList): GameWorld.ErrLog("ÏÞʱÀñ°ü¿ª¹ØÊ±¼äʱ·ÖÅäÖôíÎó!cfgID=%s" % cfgID) return # È¡Íæ¼ÒAPPID£¬»ì·þʹÓà appID = GameWorld.GetPlayerPlatform(curPlayer) startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(flashGiftbagIpyData) packInfo = ChPyNetSendPack.tagMCFlashGiftbagInfo() packInfo.ActNum = actNum packInfo.StartDate = startDateStr packInfo.EndtDate = endDateStr packInfo.AdvanceMinutes = flashGiftbagIpyData.GetAdvanceMinutes() packInfo.ActivityTime = [] for i, startTime in enumerate(startTimeList): timeInfo = ChPyNetSendPack.tagMCFlashGiftbagTime() timeInfo.StartTime = startTime timeInfo.EndtTime = endTimeList[i] packInfo.ActivityTime.append(timeInfo) packInfo.ActivityTimeCount = len(packInfo.ActivityTime) packInfo.IsDayReset = flashGiftbagIpyData.GetIsDayReset() packInfo.LimitLV = flashGiftbagIpyData.GetLVLimit() packInfo.GiftbagTypeInfo = [] for giftbagType in giftbagTypeList: giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("FlashGiftbag", {"GiftbagType":giftbagType}, True, True) if not giftbagIpyDataList: continue giftType = ChPyNetSendPack.tagMCFlashGiftbagType() giftType.GiftbagInfo = [] for giftIpyData in giftbagIpyDataList: giftbagID = giftIpyData.GetGiftbagID() orderIpyData = GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID) giftBag = ChPyNetSendPack.tagMCFlashGiftbag() giftBag.GiftID = giftbagID giftBag.OrderInfo = "" if not orderIpyData else orderIpyData.GetOrderInfo() giftBag.OrderInfoLen = len(giftBag.OrderInfo) giftBag.BuyCountLimit = giftIpyData.GetBuyCountLimit() giftBag.RMB = 0 if not orderIpyData else CommFunc.RMBToCoin(orderIpyData.GetPayRMBNum()) giftBag.RMBOriginal = CommFunc.RMBToCoin(giftIpyData.GetOriginalRMB()) giftBag.ItemInfo = [] for itemID, itemCount, isBind in __GetJobItemList(giftIpyData.GetGiftItemList(), curPlayer.GetJob()): item = ChPyNetSendPack.tagMCFlashGiftbagItem() item.ItemID = itemID item.ItemCount = itemCount item.IsBind = isBind item.IsMainItem = int(itemID == giftIpyData.GetMainItemID()) giftBag.ItemInfo.append(item) giftBag.GiftItemCount = len(giftBag.ItemInfo) giftType.GiftbagInfo.append(giftBag) giftType.GiftbagCount = len(giftType.GiftbagInfo) packInfo.GiftbagTypeInfo.append(giftType) packInfo.GiftbagTypeCount = len(packInfo.GiftbagTypeInfo) NetPackCommon.SendFakePack(curPlayer, packInfo) return def GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID): ## »ñÈ¡Àñ°üID¶ÔӦʵ¼ÊÊÛ¼Û key = "FlashGiftbagIDRMB" FlashGiftbagIDRMBDict = IpyGameDataPY.GetConfigEx(key) if not FlashGiftbagIDRMBDict: FlashGiftbagIDRMBDict = {} ipyDataMgr = IpyGameDataPY.IPY_Data() for i in xrange(ipyDataMgr.GetOrderInfoCount()): ipyData = ipyDataMgr.GetOrderInfoByIndex(i) #if ipyData.GetAppID() != appID: # continue if not ipyData.GetGiftbagID(): continue FlashGiftbagIDRMBDict[(ipyData.GetGiftbagID(), ipyData.GetAppID())] = ipyData IpyGameDataPY.SetConfigEx(key, FlashGiftbagIDRMBDict) return FlashGiftbagIDRMBDict.get((giftbagID, appID))