#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerActBuyOne # # @todo:ÂòÒ»ËͶà»î¶¯ # @author hxp # @date 2023-08-01 # @version 1.0 # # ÏêϸÃèÊö: ÂòÒ»ËͶà»î¶¯ # #------------------------------------------------------------------------------- #"""Version = 2023-08-01 16: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 RecordIndexMax = 10 # ÿ¸öÄ£°å×î´óÖ§³Ö³äÖµIDÊý def OnPlayerLogin(curPlayer): for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_BuyOne, {}).values(): actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) isReset = __CheckPlayerBuyOneAction(curPlayer, actNum) # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢ if not isReset and actInfo.get(ShareDefine.ActKey_State): Sync_BuyOneActionInfo(curPlayer, actNum) Sync_BuyOnePlayerInfo(curPlayer, actNum) return def RefreshBuyOneActionInfo(actNum): ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢ playerManager = GameWorld.GetPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not GameWorld.IsNormalPlayer(curPlayer): continue __CheckPlayerBuyOneAction(curPlayer, actNum) return def __CheckPlayerBuyOneAction(curPlayer, actNum): ## ¼ì²éÍæ»î¶¯Êý¾ÝÐÅÏ¢ playerID = curPlayer.GetPlayerID() actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyOne, 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) playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyOneID % actNum) # Íæ¼ÒÉíÉϵĻID # »î¶¯ID ÏàͬµÄ»°²»´¦Àí if actID == playerActID: GameWorld.DebugLog("ÂòÒ»ËͶà»î¶¯ID²»±ä£¬²»´¦Àí£¡ actID=%s" % actID, curPlayer.GetPlayerID()) return GameWorld.DebugLog("ÂòÒ»ËͶà»î¶¯ÖØÖÃ! actID=%s,playerActID=%s,state=%s" % (actID, playerActID, state), playerID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyOneID % actNum, actID) for i in range(RecordIndexMax): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, i), 0) if state: # ÖØÖóäÖµID³äÖµ¼Ç¼ __ResetCTGIDCount(curPlayer, actInfo) Sync_BuyOneActionInfo(curPlayer, actNum) Sync_BuyOnePlayerInfo(curPlayer, actNum) return True def __ResetCTGIDCount(curPlayer, actInfo): cfgID = actInfo.get(ShareDefine.ActKey_CfgID) dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0) ipyData = IpyGameDataPY.GetIpyGameData("ActBuyOne", cfgID) if not ipyData: return templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex) if not templateID: return tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBuyOneTemplate", templateID) if not tempIpyDataList: return resetCTGIDList = [] for tempIpyData in tempIpyDataList: resetCTGIDList.append(tempIpyData.GetNeedCTGID()) PlayerCoin.DoResetCTGCountByIDList(curPlayer, "ActBuyOne", resetCTGIDList) return def GetBuyOneFreeAward(curPlayer, awardIndex, actNum): '''»î¶¯Ãâ·Ñ½±Àø @param awardIndex: ½±ÀøË÷Òý = recordIndex*100 + freeIndex @param actNum: »î¶¯±àºÅ£¬Èç11 »ò 12 ´ú±í²»Í¬µÄ»î¶¯ ''' playerID = curPlayer.GetPlayerID() actNum = GameWorld.ToIntDef(actNum, 0) if actNum <= 0: GameWorld.Log("ûÓÐÖ¸¶¨ÁìÈ¡µÄ»î¶¯±àºÅ! actNum=%s" % actNum, playerID) return recordIndex = awardIndex / 100 freeIndex = awardIndex % 100 actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyOne, actNum) if not actInfo.get(ShareDefine.ActKey_State): GameWorld.Log("ÂòÒ»ËÍÒ»·Ç»î¶¯ÖÐÎÞ·¨ÁìÈ¡½±Àø! actNum=%s" % actNum, playerID) return cfgID = actInfo.get(ShareDefine.ActKey_CfgID) dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0) ipyData = IpyGameDataPY.GetIpyGameData("ActBuyOne", cfgID) if not ipyData: return templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex) if not templateID: return tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBuyOneTemplate", templateID) if not tempIpyDataList: return needCTGID = 0 freeItemList = [] for tempIpyData in tempIpyDataList: if recordIndex != tempIpyData.GetRecordIndex(): continue needCTGID = tempIpyData.GetNeedCTGID() freeItemInfo = tempIpyData.GetFreeItemInfo() freeItemList = freeItemInfo.get(freeIndex, []) break if not needCTGID or not freeItemList: GameWorld.ErrLog("ÂòÒ»ËÍÒ»»î¶¯Ã»Óиý±ÀøÐÅÏ¢! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,freeIndex=%s" % (actNum, cfgID, templateID, recordIndex, freeIndex), playerID) return totalBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CTGGoodsBuyCount % needCTGID) if not totalBuyCount: GameWorld.Log("ÂòÒ»ËÍÒ»»î¶¯¸Ã½±ÀøÎ´³äÖµ£¬ÎÞ·¨Ãâ·ÑÁìÈ¡! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,needCTGID=%s" % (actNum, cfgID, templateID, recordIndex, needCTGID), playerID) return awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, recordIndex)) if awardRecord & pow(2, freeIndex): GameWorld.Log("ÂòÒ»ËÍÒ»»î¶¯ÒѾ­ÁìÈ¡¹ý¸ÃÃâ·Ñ½±Àø! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,freeIndex=%s" % (actNum, cfgID, templateID, recordIndex, freeIndex), playerID) return # ¼ì²é±³°ü if not ItemControler.CheckPackSpaceEnough(curPlayer, freeItemList): return awardRecord |= pow(2, freeIndex) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, recordIndex), awardRecord) Sync_BuyOnePlayerInfo(curPlayer, actNum) for itemID, itemCount, isAuctionItem in freeItemList: ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem]) addDataDict = {"templateID":templateID, "cfgID":cfgID, "recordIndex":recordIndex, "freeIndex":freeIndex, "freeItemList":str(freeItemList), "actNum":actNum} DataRecordPack.DR_FuncGiveItem(curPlayer, "ActBuyOne", addDataDict) GameWorld.Log("ÂòÒ»ËÍÒ»»î¶¯ÁìÈ¡Ãâ·Ñ½±Àø! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,freeIndex=%s,freeItemList=%s" % (actNum, cfgID, templateID, recordIndex, freeIndex, freeItemList), playerID) return def Sync_BuyOnePlayerInfo(curPlayer, actNum): ## Í¨ÖªÍæ¼ÒÊý¾ÝÐÅÏ¢ clientPack = ChPyNetSendPack.tagMCActBuyOnePlayerInfo() clientPack.ActNum = actNum clientPack.FreeRecordList = [] for i in range(RecordIndexMax): awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, i)) clientPack.FreeRecordList.append(awardRecord) clientPack.FreeRecordCount = len(clientPack.FreeRecordList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_BuyOneActionInfo(curPlayer, actNum): ## ֪ͨ»î¶¯ÐÅÏ¢ actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyOne, actNum) if not actInfo.get(ShareDefine.ActKey_State): return cfgID = actInfo.get(ShareDefine.ActKey_CfgID) dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0) ipyData = IpyGameDataPY.GetIpyGameData("ActBuyOne", cfgID) if not ipyData: return templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex) if not templateID: return tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBuyOneTemplate", templateID) if not tempIpyDataList: return startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData) startDateSync = actInfo.get(ShareDefine.ActKey_StartDateSync, startDateStr) actInfo = ChPyNetSendPack.tagMCActBuyOneInfo() actInfo.ActNum = actNum actInfo.StartDate = startDateSync actInfo.EndtDate = endDateStr actInfo.LimitLV = ipyData.GetLVLimit() actInfo.IsDayReset = ipyData.GetIsDayReset() actInfo.GiftbagList = [] for tempIpyData in tempIpyDataList: giftbag = ChPyNetSendPack.tagMCActBuyOneInfoGiftbag() giftbag.CTGID = tempIpyData.GetNeedCTGID() giftbag.RecordIndex = tempIpyData.GetRecordIndex() giftbag.FreeGiftList = [] freeItemInfo = tempIpyData.GetFreeItemInfo() freeIndexList = freeItemInfo.keys() freeIndexList.sort() for freeIndex in freeIndexList: freeGift = ChPyNetSendPack.tagMCActBuyOneInfoFreeGift() freeGift.FreeIndex = freeIndex freeGift.FreeItemList = [] freeItemList = freeItemInfo[freeIndex] for itemID, itemCount, isAuctionItem in freeItemList: freeItem = ChPyNetSendPack.tagMCActBuyOneInfoFreeItem() freeItem.ItemID = itemID freeItem.ItemCount = itemCount freeItem.IsBind = isAuctionItem freeGift.FreeItemList.append(freeItem) freeGift.FreeItemCount = len(freeGift.FreeItemList) giftbag.FreeGiftList.append(freeGift) giftbag.FreeGiftCount = len(giftbag.FreeGiftList) actInfo.GiftbagList.append(giftbag) actInfo.GiftbagCount = len(actInfo.GiftbagList) NetPackCommon.SendFakePack(curPlayer, actInfo) return