| #!/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 curPlayer.GetID() == 0: | 
|             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 |