#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerActBuyCountGift # # @todo:¹ºÂò´ÎÊýÀñ°ü»î¶¯ # @author hxp # @date 2024-06-05 # @version 1.0 # # ÏêϸÃèÊö: ¹ºÂò´ÎÊýÀñ°ü»î¶¯ # #------------------------------------------------------------------------------- #"""Version = 2024-06-05 12:00""" #------------------------------------------------------------------------------- import PyGameData import ShareDefine import PlayerControl import IpyGameDataPY import ChPyNetSendPack import DataRecordPack import NetPackCommon import ItemControler import IPY_GameWorld import PlayerCoin import GameWorld import ChConfig def OnPlayerLogin(curPlayer): for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_BuyCountGift, {}).values(): actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) isReset = __CheckPlayerBuyCountGiftAction(curPlayer, actNum) # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢ if not isReset and actInfo.get(ShareDefine.ActKey_State): Sync_BuyCountGiftActionInfo(curPlayer, actNum) Sync_BuyCountGiftPlayerInfo(curPlayer, actNum) return def RefreshBuyCountGiftActionInfo(actNum): ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢ playerManager = GameWorld.GetPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if curPlayer.GetID() == 0: continue __CheckPlayerBuyCountGiftAction(curPlayer, actNum) return def __CheckPlayerBuyCountGiftAction(curPlayer, actNum): ## ¼ì²éÍæ»î¶¯Êý¾ÝÐÅÏ¢ playerID = curPlayer.GetPlayerID() actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyCountGift, 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_BuyCountGiftID % actNum) # Íæ¼ÒÉíÉϵĻID # »î¶¯ID ÏàͬµÄ»°²»´¦Àí if actID == playerActID: GameWorld.DebugLog("¹ºÂò´ÎÊýÀñ°ü»î¶¯ID²»±ä£¬²»´¦Àí£¡ actNum=%s,cfgID=%s,actID=%s" % (actNum, cfgID, actID), curPlayer.GetPlayerID()) return GameWorld.DebugLog("¹ºÂò´ÎÊýÀñ°ü»î¶¯ÖØÖÃ! actNum=%s,cfgID=%s,actID=%s,playerActID=%s,state=%s" % (actNum, cfgID, actID, playerActID, state), playerID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyCountGiftID % actNum, actID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyCountGiftAward % actNum, 0) if state: # ÖØÖóäÖµID³äÖµ¼Ç¼ __ResetCTGIDCount(curPlayer, actInfo) Sync_BuyCountGiftActionInfo(curPlayer, actNum) Sync_BuyCountGiftPlayerInfo(curPlayer, actNum) return True def __ResetCTGIDCount(curPlayer, actInfo): cfgID = actInfo.get(ShareDefine.ActKey_CfgID) ipyData = IpyGameDataPY.GetIpyGameData("ActBuyCountGift", cfgID) if not ipyData: return resetCTGIDList = ipyData.GetCTGIDList() PlayerCoin.DoResetCTGCountByIDList(curPlayer, "ActBuyCountGift", resetCTGIDList) return def OnGetBuyCountGiftAward(curPlayer, buyCount, actNum): playerID = curPlayer.GetPlayerID() actNum = GameWorld.ToIntDef(actNum, 0) if actNum <= 0: GameWorld.DebugLog("ûÓÐÖ¸¶¨ÁìÈ¡µÄ»î¶¯±àºÅ! actNum=%s" % actNum, playerID) return actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyCountGift, actNum) if not actInfo.get(ShareDefine.ActKey_State): GameWorld.DebugLog("¹ºÂò´ÎÊýÀñ°ü·Ç»î¶¯ÖÐÎÞ·¨ÁìÈ¡½±Àø! actNum=%s" % actNum, playerID) return cfgID = actInfo.get(ShareDefine.ActKey_CfgID) ipyData = IpyGameDataPY.GetIpyGameData("ActBuyCountGift", cfgID) if not ipyData: return CTGIDList = ipyData.GetCTGIDList() CTGCountAwardInfo = ipyData.GetCTGCountAwardInfo() if buyCount not in CTGCountAwardInfo: GameWorld.DebugLog("¹ºÂò´ÎÊýÀñ°üûÓиôÎÊýÀñ°ü½±Àø! actNum=%s,cfgID=%s,buyCount=%s" % (actNum, cfgID, buyCount), playerID) return awardItemList = CTGCountAwardInfo[buyCount] totalBuyCount = 0 for ctgID in CTGIDList: totalBuyCount += curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CTGGoodsBuyCount % ctgID) if totalBuyCount < buyCount: GameWorld.Log("¹ºÂò´ÎÊýÀñ°ü»î¶¯ÀۼƹºÂò´ÎÊý²»×㣬ÎÞ·¨Ãâ·ÑÁìÈ¡! actNum=%s,cfgID=%s,CTGIDList=%s,totalBuyCount=%s < %s" % (actNum, cfgID, CTGIDList, totalBuyCount, buyCount), playerID) return awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyCountGiftAward % actNum) if awardRecord & pow(2, buyCount): GameWorld.Log("¹ºÂò´ÎÊýÀñ°ü»î¶¯ÒѾ­ÁìÈ¡¹ý¸Ã½±Àø! actNum=%s,cfgID=%s,buyCount=%s,awardRecord=%s" % (actNum, cfgID, buyCount, awardRecord), playerID) return # ¼ì²é±³°ü if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList): return awardRecord |= pow(2, buyCount) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyCountGiftAward % actNum, awardRecord) Sync_BuyCountGiftPlayerInfo(curPlayer, actNum) for itemID, itemCount, isAuctionItem in awardItemList: ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem], event=["ActBuyCountGift", False, {}]) addDataDict = {"actNum":actNum, "cfgID":cfgID, "buyCount":buyCount, "awardItemList":str(awardItemList)} DataRecordPack.DR_FuncGiveItem(curPlayer, "ActBuyCountGift", addDataDict) GameWorld.Log("¹ºÂò´ÎÊýÀñ°ü»î¶¯ÁìÈ¡½±Àø! actNum=%s,cfgID=%s,buyCount=%s,awardItemList=%s" % (actNum, cfgID, buyCount, awardItemList), playerID) return def Sync_BuyCountGiftPlayerInfo(curPlayer, actNum): ## Í¨ÖªÍæ¼ÒÊý¾ÝÐÅÏ¢ clientPack = ChPyNetSendPack.tagMCActBuyCountGiftPlayerInfo() clientPack.ActNum = actNum clientPack.GiftAwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyCountGiftAward % actNum) NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_BuyCountGiftActionInfo(curPlayer, actNum): ## ֪ͨ»î¶¯ÐÅÏ¢ actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyCountGift, actNum) if not actInfo.get(ShareDefine.ActKey_State): return cfgID = actInfo.get(ShareDefine.ActKey_CfgID) ipyData = IpyGameDataPY.GetIpyGameData("ActBuyCountGift", cfgID) if not ipyData: return CTGCountAwardInfo = ipyData.GetCTGCountAwardInfo() startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData) startDateSync = actInfo.get(ShareDefine.ActKey_StartDateSync, startDateStr) actInfo = ChPyNetSendPack.tagMCActBuyCountGiftInfo() actInfo.ActNum = actNum actInfo.StartDate = startDateSync actInfo.EndtDate = endDateStr actInfo.LimitLV = ipyData.GetLVLimit() actInfo.IsDayReset = ipyData.GetIsDayReset() actInfo.ResetType = ipyData.GetResetType() actInfo.CTGIDList = ipyData.GetCTGIDList() actInfo.CTGIDCount = len(actInfo.CTGIDList) actInfo.BuyCountGiftList = [] for buyCount, awardItemList in CTGCountAwardInfo.items(): giftbag = ChPyNetSendPack.tagMCActBuyCountGift() giftbag.NeedBuyCount = buyCount giftbag.AwardItemList = [] for itemID, itemCount, isAuctionItem in awardItemList: giftItem = ChPyNetSendPack.tagMCActBuyCountGiftItem() giftItem.ItemID = itemID giftItem.ItemCount = itemCount giftItem.IsBind = isAuctionItem giftbag.AwardItemList.append(giftItem) giftbag.Count = len(giftbag.AwardItemList) actInfo.BuyCountGiftList.append(giftbag) actInfo.GiftCount = len(actInfo.BuyCountGiftList) NetPackCommon.SendFakePack(curPlayer, actInfo) return