#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerDailyGiftbag # # @todo:ÿÈÕÀñ°ü # @author hxp # @date 2020Äê3ÔÂ12ÈÕ # @version 1.0 # # ÏêϸÃèÊö: ÿÈÕÀñ°ü # #------------------------------------------------------------------------------- #"""Version = 2020Äê3ÔÂ12ÈÕ 12:00""" #------------------------------------------------------------------------------- import PyGameData import ShareDefine import PlayerControl import IpyGameDataPY import NetPackCommon import ChPyNetSendPack import DataRecordPack import ItemControler import IPY_GameWorld import ItemCommon import GameWorld import ChConfig import CommFunc import PlayerCoin def OnPlayerLogin(curPlayer): __CheckPlayerDailyGiftbagAction(curPlayer) return def RefreshDailyGiftbagActionInfo(): ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢ playerManager = GameWorld.GetPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not GameWorld.IsNormalPlayer(curPlayer): continue __CheckPlayerDailyGiftbagAction(curPlayer) return def __CheckPlayerDailyGiftbagAction(curPlayer): ## ¼ì²éÍæ¼ÒÿÈÕÀñ°ü»î¶¯Êý¾ÝÐÅÏ¢ playerID = curPlayer.GetPlayerID() actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_DailyGiftbag, {}) actID = actInfo.get(ShareDefine.ActKey_ID, 0) state = actInfo.get(ShareDefine.ActKey_State, 0) cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0) if not state or not cfgID: return playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyGiftbagID) # Íæ¼ÒÉíÉϵĻID cfgIpyData = IpyGameDataPY.GetIpyGameData("ActDailyGiftbag", cfgID) if not cfgIpyData: return giftbagType = cfgIpyData.GetGiftbagType() isReset = False if actID != playerActID: isReset = True __ResetGiftbagItemBuyCount(curPlayer, giftbagType) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyGiftbagID, actID) GameWorld.DebugLog("ÿÈÕÀñ°üÖØÖÃ! actID=%s,playerActID=%s,state=%s,giftbagType=%s" % (actID, playerActID, state, giftbagType), playerID) else: GameWorld.DebugLog("ÿÈÕÀñ°ü»î¶¯ID²»±ä£¬²»´¦Àí£¡", curPlayer.GetPlayerID()) SyncDailyGiftbagBuyCount(curPlayer, giftbagType) Sync_DailyGiftbagActionInfo(curPlayer) return isReset def __ResetGiftbagItemBuyCount(curPlayer, giftbagType): ##ÖØÖÃÿÈÕÀñ°üÏÞ¹ºÎïÆ·´ÎÊý giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("DailyGiftbag", {"GiftbagType":giftbagType}, True, True) if not giftbagIpyDataList: return for giftIpyData in giftbagIpyDataList: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyGiftbagBuyCount % giftIpyData.GetGiftbagID(), 0) SyncDailyGiftbagBuyCount(curPlayer, giftbagType) return def OnPlayerOrderDailyGiftbag(curPlayer, giftbagID, addDRDict, isCTG=True): ## Íæ¼Ò¶©¹ºÃ¿ÈÕÀñ°ü actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_DailyGiftbag, {}) if not actInfo: if isCTG: DataRecordPack.DR_CTGError(curPlayer, "DailyGiftbag action info is null!", addDRDict) return state = actInfo.get(ShareDefine.ActKey_State, 0) if not state: if isCTG: DataRecordPack.DR_CTGError(curPlayer, "DailyGiftbag state is 0!", addDRDict) return cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0) cfgIpyData = IpyGameDataPY.GetIpyGameData("ActDailyGiftbag", cfgID) if not cfgIpyData: if isCTG: DataRecordPack.DR_CTGError(curPlayer, "DailyGiftbag GiftbagType is null!", addDRDict) return giftbagType = cfgIpyData.GetGiftbagType() giftbagIpyData = IpyGameDataPY.GetIpyGameData("DailyGiftbag", giftbagType, giftbagID) if not giftbagIpyData: if isCTG: DataRecordPack.DR_CTGError(curPlayer, "DailyGiftbag giftbagType=%s giftbagID=%s can not found!" % (giftbagType, giftbagID), addDRDict) return actWorldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0) giftItemList = __GetJobItemList(giftbagIpyData.GetGiftItemList(), curPlayer.GetJob(), actWorldLV) addDRDict.update({"giftbagType":giftbagType, "giftbagID":giftbagID, "giftItemList":giftItemList}) buyCountLimit = giftbagIpyData.GetBuyCountLimit() buyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyGiftbagBuyCount % giftbagID) if buyCountLimit: addDRDict.update({"buyCountLimit":buyCountLimit, "buyCount":buyCount}) if buyCount >= buyCountLimit: if isCTG: PlayerCoin.ExchangePayCoin(curPlayer, "DailyGiftbag Pay count limit !buyCount=%s,buyCountLimit=%s" % (buyCount, buyCountLimit), addDRDict) return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyGiftbagBuyCount % giftbagID, buyCount + 1) if giftItemList: eventName = "DailyGiftbag" if not isCTG else ChConfig.ItemGive_CTG ItemControler.GivePlayerItemOrMail(curPlayer, giftItemList, "", event=[eventName, True, addDRDict]) SyncDailyGiftbagBuyCount(curPlayer, giftbagType) return True def OnGetDailyFreeGiftbag(curPlayer): ## ÁìȡÿÈÕÃâ·ÑÖ±¹ºÀñ°ü giftbagID = 0 # Ãâ·ÑÀñ°üID¹Ì¶¨Îª0 addDRDict = {} OnPlayerOrderDailyGiftbag(curPlayer, giftbagID, addDRDict, False) return def __GetJobItemList(giftItemInfo, job, worldLV): jobItemList = [] if isinstance(giftItemInfo, dict): itemList = GameWorld.GetDictValueByRangeKey(giftItemInfo, worldLV, []) else: itemList = giftItemInfo 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 SyncDailyGiftbagBuyCount(curPlayer, giftbagType): ## ֪ͨÿÈÕÀñ°üÍæ¼Ò»î¶¯ÐÅÏ¢ giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("DailyGiftbag", {"GiftbagType":giftbagType}, True, True) if not giftbagIpyDataList: return giftbagBuyInfo = ChPyNetSendPack.tagMCDailyGiftbagPlayerInfo() giftbagBuyInfo.BuyCountList = [] for giftIpyData in giftbagIpyDataList: giftbagID = giftIpyData.GetGiftbagID() buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyGiftbagBuyCount % giftbagID) if buyCnt <= 0: continue buyCountInfo = ChPyNetSendPack.tagMCDailyGiftbagBuyCount() buyCountInfo.GiftbagID = giftbagID buyCountInfo.BuyCount = buyCnt giftbagBuyInfo.BuyCountList.append(buyCountInfo) giftbagBuyInfo.Count = len(giftbagBuyInfo.BuyCountList) NetPackCommon.SendFakePack(curPlayer, giftbagBuyInfo) return def Sync_DailyGiftbagActionInfo(curPlayer): ## ֪ͨÿÈÕÀñ°ü»î¶¯ÐÅÏ¢ actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_DailyGiftbag, {}) if not actInfo: return if not actInfo.get(ShareDefine.ActKey_State): return cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0) if not cfgID: return cfgIpyData = IpyGameDataPY.GetIpyGameData("ActDailyGiftbag", cfgID) if not cfgIpyData: return giftbagType = cfgIpyData.GetGiftbagType() giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("DailyGiftbag", {"GiftbagType":giftbagType}, True, True) if not giftbagIpyDataList: return actWorldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0) # È¡Íæ¼ÒAPPID£¬»ì·þʹÓà appID = GameWorld.GetPlayerPlatform(curPlayer) packInfo = ChPyNetSendPack.tagMCDailyGiftbagInfo() packInfo.GiftbagInfo = [] packInfo.LimitLV = cfgIpyData.GetLVLimit() for giftIpyData in giftbagIpyDataList: giftbagID = giftIpyData.GetGiftbagID() orderIpyData = GetGiftbagIDOrderInfoIpyData(giftbagID, appID) giftBag = ChPyNetSendPack.tagMCDailyGiftbag() 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.ItemInfo = [] for itemID, itemCount, isBind in __GetJobItemList(giftIpyData.GetGiftItemList(), curPlayer.GetJob(), actWorldLV): item = ChPyNetSendPack.tagMCDailyGiftbagItem() item.ItemID = itemID item.ItemCount = itemCount giftBag.ItemInfo.append(item) giftBag.GiftItemCount = len(giftBag.ItemInfo) giftBag.Discount = giftIpyData.GetDiscount() packInfo.GiftbagInfo.append(giftBag) packInfo.GiftbagCount = len(packInfo.GiftbagInfo) NetPackCommon.SendFakePack(curPlayer, packInfo) return def GetGiftbagIDOrderInfoIpyData(giftbagID, appID): ## »ñÈ¡Àñ°üID¶ÔÓ¦Êý¾ÝÅäÖà key = "GiftbagIpyDataDict" GiftbagIpyDataDict = IpyGameDataPY.GetConfigEx(key) if not GiftbagIpyDataDict: GiftbagIpyDataDict = {} ipyDataMgr = IpyGameDataPY.IPY_Data() for i in xrange(ipyDataMgr.GetOrderInfoCount()): ipyData = ipyDataMgr.GetOrderInfoByIndex(i) if not ipyData.GetGiftbagID(): continue GiftbagIpyDataDict[(ipyData.GetGiftbagID(), ipyData.GetAppID())] = ipyData IpyGameDataPY.SetConfigEx(key, GiftbagIpyDataDict) return GiftbagIpyDataDict.get((giftbagID, appID))