| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.PlayerTreasure  | 
| #  | 
| # @todo:Ѱ±¦  | 
| # @author hxp  | 
| # @date 2018-04-28  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ÊÖÓÎѰ±¦, Ö§³Öµ¥³é¡¢Á¬³é  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2018-04-28 16:00"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import GameWorld  | 
| import PlayerRune  | 
| import ShareDefine  | 
| import GameFuncComm  | 
| import IpyGameDataPY  | 
| import IPY_GameWorld  | 
| import FormulaControl  | 
| import ChPyNetSendPack  | 
| import PlayerControl  | 
| import ItemControler  | 
| import NetPackCommon  | 
| import PlayerBossReborn  | 
| import PlayerFairyCeremony  | 
| import PlayerNewFairyCeremony  | 
| import ItemCommon  | 
| import ChConfig  | 
|   | 
| import random  | 
| import time  | 
|   | 
| def DoTreasureOpen(curPlayer):  | 
|     ## Ñ°±¦¿ªÆô  | 
|       | 
|     # ÉèÖÃÃâ·ÑѰ±¦  | 
|     treasureTypeList = GetTreasureTypeList()  | 
|     for treasureType in treasureTypeList:  | 
|         freeTimeCDList = IpyGameDataPY.GetFuncEvalCfg("TreasureSet1%s" % treasureType, 4)  | 
|         for i, minute in enumerate(freeTimeCDList):  | 
|             if not minute:  | 
|                 continue  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeTime % (treasureType, i), int(time.time()) - minute * 60)  | 
|     Sync_TreasureInfo(curPlayer)  | 
|     return  | 
|   | 
| def OnTreasureLogin(curPlayer):  | 
|     if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Treasure):  | 
|         return  | 
|     Sync_TreasureInfo(curPlayer)  | 
|     return  | 
|   | 
| #// A5 68 ÇëÇóѰ±¦ #tagCMRequestTreasure  | 
| #  | 
| #struct tagCMRequestTreasure  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        TreasureType;    //Ѱ±¦ÀàÐÍ  | 
| #    BYTE        TreasureIndex;       //Ѱ±¦Ë÷Òý  | 
| #    BYTE        CostType;    //ÏûºÄÀàÐÍ£º0-ĬÈÏÏÉÓñ£»1-Ãâ·Ñ´ÎÊý£»2-Ѱ±¦µÀ¾ß  | 
| #};  | 
| def OnRequestTreasure(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     playerLV = curPlayer.GetLV()  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     treasureType = clientData.TreasureType  | 
|     treasureIndex = clientData.TreasureIndex  | 
|     costType = clientData.CostType  | 
|     isFreeType = 1 if costType == 1 else 0  | 
|     GameWorld.DebugLog("Íæ¼ÒѰ±¦: treasureType=%s,treasureIndex=%s,costType=%s,playerLV=%s"   | 
|                        % (treasureType, treasureIndex, costType, playerLV), playerID)  | 
|       | 
|     TreasureSet1 = "TreasureSet1%s" % treasureType  | 
|     TreasureSet2 = "TreasureSet2%s" % treasureType  | 
|     treasureCountList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 1) # Ñ°±¦»ñµÃ¸öÊýÁÐ±í  | 
|     if not treasureCountList:  | 
|         GameWorld.DebugLog("ûÓÐѰ±¦´ÎÊýÁбíÅäÖÃ!", playerID)  | 
|         return  | 
|     if treasureIndex < 0 or treasureIndex >= len(treasureCountList):  | 
|         GameWorld.ErrLog("Ѱ±¦´ÎÊýË÷Òý²»´æÔÚ!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID)  | 
|         return  | 
|     treasureCount = treasureCountList[treasureIndex]  | 
|     if not treasureCount:  | 
|         GameWorld.DebugLog("ûÓÐѰ±¦´ÎÊýÅäÖÃ!", playerID)  | 
|         return  | 
|       | 
|     packType = ShareDefine.rptTreasure  | 
|     #if treasureType == 2:  | 
|     #    packType = ShareDefine.rptRune  | 
|           | 
|     if not ItemCommon.CheckPackHasSpace(curPlayer, packType, True):  | 
|         GameWorld.DebugLog("¶ÔӦѰ±¦±³°üûÓпոñ×Ó!packType=%s" % packType, playerID)  | 
|         return  | 
|       | 
|     # Ãâ·Ñ´ÎÊý  | 
|     if costType == 1:  | 
|         freeCountCDList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 4) # Ãâ·Ñ´ÎÊýCDʱ¼äÁбí, ·Ö  | 
|         freeCountCD = freeCountCDList[treasureIndex] * 60  | 
|         if not freeCountCD:  | 
|             GameWorld.ErrLog("¸ÃѰ±¦ÀàÐÍË÷Òý²»Ö§³ÖÃâ·Ñ´ÎÊýѰ±¦!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID)  | 
|             return  | 
|         curTime = int(time.time())  | 
|         freeTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeTime % (treasureType, treasureIndex))  | 
|         if curTime - freeTime < freeCountCD:  | 
|             GameWorld.DebugLog("Ãâ·ÑѰ±¦CDʱ¼äδµ½£¬ÎÞ·¨Ê¹ÓÃÃâ·ÑѰ±¦!curTime=%s,freeTime=%s, %s < freeCountCD(%s)"   | 
|                                % (curTime, freeTime, curTime - freeTime, freeCountCD), playerID)  | 
|             return  | 
|           | 
|     # Ñ°±¦µÀ¾ß, Ä¿Ç°Ä¬ÈÏÏûºÄ1¸ö  | 
|     elif costType == 2:  | 
|         costItemList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 3) # ÏûºÄµÀ¾ßÎïÆ·IDÁÐ±í  | 
|         if not costItemList:  | 
|             GameWorld.ErrLog("¸ÃѰ±¦ÀàÐÍË÷Òý²»Ö§³ÖÏûºÄµÀ¾ßѰ±¦!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID)  | 
|             return  | 
|         costItemID, costItemNeedCount = costItemList[treasureIndex]  | 
|         if not costItemID or not costItemNeedCount:  | 
|             return  | 
|         costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID)  | 
|         lackCount = max(0, costItemNeedCount - bindCnt - unBindCnt)  | 
|         delCostItemCount = costItemNeedCount - lackCount  | 
|         lackCountCostMoney = 0  | 
|         if lackCount > 0:  | 
|             lackCountCostMoney = ItemCommon.GetAutoBuyItemNeedGold({costItemID:lackCount})  | 
|             if lackCountCostMoney:  | 
|                 moneyType = IPY_GameWorld.TYPE_Price_Gold_Money  | 
|                 infoDict = {ChConfig.Def_Cost_Reason_SonKey:costItemID}  | 
|                 if not PlayerControl.HaveMoney(curPlayer, moneyType, lackCountCostMoney):  | 
|                     return  | 
|             else:  | 
|                 GameWorld.DebugLog("Ѱ±¦ÏûºÄµÀ¾ß²»×ã!costItemID=%s,costItemNeedCount=%s,bindCnt=%s,unBindCnt=%s"   | 
|                                    % (costItemID, costItemNeedCount, bindCnt, unBindCnt), playerID)  | 
|                 return  | 
|           | 
|     # ÏÉÓñѰ±¦  | 
|     else:  | 
|         costGoldList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 2) # ÏûºÄÏÉÓñÁÐ±í  | 
|         costGold = costGoldList[treasureIndex]  | 
|         if not costGold:  | 
|             GameWorld.ErrLog("¸ÃѰ±¦ÀàÐÍË÷Òý²»Ö§³ÖÏûºÄÏÉÓñѰ±¦!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID)  | 
|             return  | 
|           | 
|         if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold):  | 
|             return  | 
|           | 
|     ipyData = IpyGameDataPY.InterpolationSearch("TreasureHouse", "MinLV", playerLV, {"TreasureType":treasureType})  | 
|     if not ipyData:  | 
|         GameWorld.ErrLog("ÕÒ²»µ½¸ÃµÈ¼¶¶ÔӦѰ±¦¿âÅäÖÃ!treasureType=%s,curLV=%s" % (treasureType, curPlayer.GetLV()), playerID)  | 
|         return  | 
|       | 
|     luckFormula = IpyGameDataPY.GetFuncCfg(TreasureSet2, 1) # ÐÒÔËÎïÆ·¸ÅÂʹ«Ê½  | 
|     addLuck = IpyGameDataPY.GetFuncEvalCfg(TreasureSet2, 2)[treasureIndex] # Ôö¼ÓÐÒÔËÖµ  | 
|     maxLuck = IpyGameDataPY.GetFuncCfg(TreasureSet2, 3) # ÂúÐÒÔËÖµ  | 
|     curLuck = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (treasureType)) # µ±Ç°ÐÒÔËÖµ  | 
|     updLuck = curLuck + addLuck  | 
|       | 
|     commItemRateList = GetUpdLuckyItemRateList(ipyData, curLuck, luckFormula, costType) # ³£¹æ²ú³öÎïÆ·¸ñ×Ó±ýͼ£¬ÐÒÔËÎïÆ·¸ÅÂÊÒѱä¸ü  | 
|       | 
|     curTreasureCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureCount % (treasureType, isFreeType)) # µ±Ç°ÒÑѰ±¦´ÎÊý  | 
|     updTreasureCount = curTreasureCount + treasureCount  | 
|     beSureCountDict = ipyData.GetFreeGridItemRateList3() if isFreeType else ipyData.GetGridItemRateList3() # µÚx´Î±Ø³ö²ú³ö¸ñ×Ó±àºÅ±ýͼ  | 
|     GameWorld.DebugLog("ÒѾѰ±¦´ÎÊý=%s,µ±Ç°ÐÒÔË=%s,commItemRateList=%s" % (curTreasureCount, curLuck, commItemRateList), playerID)  | 
|     addScore = 0 if isFreeType else IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 5)[treasureIndex] # Ôö¼Ó»ý·Ö  | 
|     ensureCount = IpyGameDataPY.GetFuncEvalCfg("TreasureSet", 1, {})[isFreeType] # Ã¿¶àÉٴδ¥·¢±£µ×²ú³ö¿â  | 
|     ensureRateList = ipyData.GetFreeGridItemRateList2() if isFreeType else ipyData.GetGridItemRateList2()  | 
|     goodGridNumList = [ipyData.GetLuckyGridNum()] # ºÃÎïÆ·¸ñ×Ó±àºÅ (ÐÒÔËÎïÆ· + ±Ø³ö + ±£µ×)  | 
|     for gridRateList in beSureCountDict.values():  | 
|         for gridRateInfo in gridRateList:  | 
|             goodGridNumList.append(gridRateInfo[1])  | 
|     for gridRateInfo in ensureRateList:  | 
|         goodGridNumList.append(gridRateInfo[1])  | 
|     GameWorld.DebugLog("goodGridNumList=%s" % goodGridNumList, playerID)  | 
|           | 
|     # µ¥³é²ú³öÓÅÏȼ¶£º ÐÒÔËÎïÆ· > ±Ø³ö > ±£µ× > ÆÕͨ  | 
|     # Á¬³éûÓÐÓÅÏȼ¶ÏÞÖÆ£¬Ö»ÒªÂú×ãÌõ¼þ¼´¿É²ú³ö  | 
|     getGridResult = []  | 
|       | 
|     # 1.ÂúÐÒÔ˱سö  | 
|     if updLuck >= maxLuck:  | 
|         getGridResult.append(ipyData.GetLuckyGridNum())  | 
|         GameWorld.DebugLog("ÂúÐÒÔ˱سöÐÒÔËÎïÆ·: gridNum=%s" % ipyData.GetLuckyGridNum(), playerID)  | 
|           | 
|     # µ¥³é  | 
|     if treasureCount == 1:  | 
|         if not getGridResult:  | 
|             if updTreasureCount in beSureCountDict:  | 
|                 gridNumRateList = beSureCountDict[updTreasureCount]  | 
|                 gridNum = GameWorld.GetResultByRandomList(gridNumRateList)  | 
|                 GameWorld.DebugLog("µ½´ï´ÎÊý±Ø³ö,updTreasureCount=%s,gridNumRateList=%s,gridNum=%s" % (updTreasureCount, gridNumRateList, gridNum), playerID)  | 
|             elif updTreasureCount % ensureCount == 0:  | 
|                 gridNumRateList = ensureRateList  | 
|                 gridNum = GameWorld.GetResultByRandomList(gridNumRateList)  | 
|                 GameWorld.DebugLog("Âú´ÎÊý±£µ×³ö,updTreasureCount=%s,gridNumRateList=%s,gridNum=%s" % (updTreasureCount, gridNumRateList, gridNum), playerID)  | 
|             else:  | 
|                 gridNumRateList = commItemRateList  | 
|                 gridNum = GameWorld.GetResultByRandomList(gridNumRateList)  | 
|                 GameWorld.DebugLog("³£¹æ²ú³ö,updTreasureCount=%s,gridNum=%s" % (updTreasureCount, gridNum), playerID)  | 
|             getGridResult.append(gridNum)  | 
|               | 
|     # Á¬³é  | 
|     elif treasureCount > 1:  | 
|         # 2. ´ÎÊý±Ø³ö  | 
|         besureGridNumList = []  | 
|         for count, gridNumRateList in beSureCountDict.items():  | 
|             if curTreasureCount < count and updTreasureCount >= count:  | 
|                 for gridInfo in gridNumRateList:  | 
|                     besureGridNumList.append(gridInfo[1])  | 
|                 gridNum = GameWorld.GetResultByRandomList(gridNumRateList)  | 
|                 getGridResult.append(gridNum)  | 
|                 GameWorld.DebugLog("µ½´ï´ÎÊý±Ø³ö,count=%s,updTreasureCount=%s,gridNumRateList=%s,gridNum=%s" % (count, updTreasureCount, gridNumRateList, gridNum), playerID)  | 
|                   | 
|         # 3. ´ÎÊý±£µ×  | 
|         ensureGridNumList = []  | 
|         if updTreasureCount / ensureCount > curTreasureCount / ensureCount:  | 
|             for gridInfo in ensureRateList:  | 
|                 ensureGridNumList.append(gridInfo[1])  | 
|             gridNum = GameWorld.GetResultByRandomList(ensureRateList)  | 
|             getGridResult.append(gridNum)  | 
|             GameWorld.DebugLog("Âú´ÎÊý±£µ×³ö,updTreasureCount=%s,gridNumRateList=%s,gridNum=%s" % (updTreasureCount, ensureRateList, gridNum), playerID)  | 
|               | 
|         # 4. ³£¹æ²ú³ö  | 
|         doCount = 200  | 
|         needCount = max(0, treasureCount - len(getGridResult))  | 
|         while needCount and doCount:  | 
|             doCount -= 1  | 
|             gridNum = GameWorld.GetResultByRandomList(commItemRateList)  | 
|               | 
|             if gridNum == ipyData.GetLuckyGridNum() and gridNum in getGridResult:  | 
|                 GameWorld.DebugLog("ÐÒÔËÎïÆ·ÒѾ³ö¹ý£¬²»ÔÙÖØ¸´²ú³ö£¡")  | 
|                 continue  | 
|               | 
|             if gridNum in besureGridNumList:  | 
|                 canGive = True  | 
|                 for besureGridNum in besureGridNumList:  | 
|                     if besureGridNum in getGridResult:  | 
|                         canGive = False  | 
|                         GameWorld.DebugLog("´ÎÊý±Ø³öÎïÆ·ÒѾ³ö¹ý£¬²»ÔÙÖØ¸´²ú³ö£¡gridNum=%s,besureGridNum=%s,besureGridNumList=%s"   | 
|                                            % (gridNum, besureGridNum, besureGridNumList), playerID)  | 
|                         break  | 
|                 if not canGive:  | 
|                     continue  | 
|                       | 
|             if gridNum in ensureGridNumList:  | 
|                 canGive = True  | 
|                 for ensureGridNum in ensureGridNumList:  | 
|                     if ensureGridNum in getGridResult:  | 
|                         canGive = False  | 
|                         GameWorld.DebugLog("Âú´ÎÊý±£µ×ÎïÆ·ÒѾ³ö¹ý£¬²»ÔÙÖØ¸´²ú³ö£¡gridNum=%s,ensureGridNum=%s,ensureGridNumList=%s"   | 
|                                            % (gridNum, ensureGridNum, ensureGridNumList), playerID)  | 
|                         break  | 
|                 if not canGive:  | 
|                     continue  | 
|                   | 
|             needCount -= 1  | 
|             getGridResult.append(gridNum)  | 
|             GameWorld.DebugLog("³£¹æ²ú³ö: gridNum=%s" % (gridNum), playerID)  | 
|               | 
|     else:  | 
|         return  | 
|       | 
|     GameWorld.DebugLog("Ѱ±¦¸ñ×Ó½á¹û: getGridResult=%s" % getGridResult, playerID)  | 
|     if len(getGridResult) != treasureCount:  | 
|         GameWorld.ErrLog("Ѱ±¦Òì³££¬Êµ¼Ê»ñµÃÊýÁ¿ÓëѰ±¦ÇëÇóÊý²»Í¬£¡treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID)  | 
|         return  | 
|       | 
|     isBind = 0 # ÔÝʱĬÈϲ»°ó¶¨  | 
|     job = curPlayer.GetJob()  | 
|     gridItemInfoDict = ipyData.GetGridItemInfo() # ¸ñ×Ó¶ÔÓ¦ÎïÆ·ÐÅÏ¢ {"¸ñ×Ó±àºÅ":[ÎïÆ·ID, ÊýÁ¿], ...}  | 
|     jobItemList = ipyData.GetJobItemList()  | 
|     treasureResult = []  | 
|     randItemIDDict = IpyGameDataPY.GetFuncEvalCfg("TreasureSet", 2)  | 
|       | 
|     for gridNum in getGridResult:  | 
|         gridNum = str(gridNum)  | 
|         if gridNum not in gridItemInfoDict:  | 
|             GameWorld.ErrLog("Ѱ±¦¸ñ×Ó²»´æÔÚ!treasureType=%s,gridNum=%s" % (treasureType, gridNum), playerID)  | 
|             return  | 
|         itemID, itemCount = gridItemInfoDict[gridNum]  | 
|         itemID = GetJobItem(job, itemID, jobItemList)  | 
|         if not itemID:  | 
|             GameWorld.ErrLog("Ѱ±¦¸ñ×ÓÎïÆ·IDÒì³£!treasureType=%s,gridNum=%s" % (treasureType, gridNum), playerID)  | 
|             return  | 
|           | 
|         # Ëæ»ú²ú³öÎïÆ·  | 
|         if itemID in randItemIDDict:  | 
|             canRandItemList = []  | 
|             randItemIDList = randItemIDDict[itemID]  | 
|             for randItemID in randItemIDList:  | 
|                 itemData = GameWorld.GetGameData().GetItemByTypeID(randItemID)  | 
|                 if itemData.GetType() == ChConfig.Def_ItemType_Rune and not PlayerRune.GetIsOpenByRuneID(curPlayer, randItemID):  | 
|                     GameWorld.DebugLog("δ½âËøµÄ·ûÓ¡²»²ú³ö£¡itemID=%s,randItemID=%s" % (itemID, randItemID), playerID)  | 
|                     continue  | 
|                 canRandItemList.append(randItemID)  | 
|             if not canRandItemList:  | 
|                 GameWorld.ErrLog("Ѱ±¦Ëæ»ú¸ñ×ÓûÓпÉËæ»úµÄÎïÆ·!treasureType=%s,treasureIndex=%s,gridNum=%s,itemID=%s"   | 
|                                  % (treasureType, treasureIndex, gridNum, itemID), playerID)  | 
|                 return  | 
|             itemID = random.choice(canRandItemList)  | 
|               | 
|         treasureResult.append([gridNum, itemID, itemCount, isBind])  | 
|           | 
|     # ¿ÛÏûºÄ  | 
|     if costType == 1:  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeTime % (treasureType, treasureIndex), curTime)  | 
|         GameWorld.DebugLog("ÏûºÄÃâ·Ñ´ÎÊý£¬¸üÐÂÃâ·ÑCD¼ÆËãʱ¼ä: %s" % curTime, playerID)  | 
|     elif costType == 2:  | 
|         ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCostItemCount, ChConfig.ItemDel_Treasure)  | 
|         GameWorld.DebugLog("¿Û³ýѰ±¦µÀ¾ß,costItemID=%s,delCostItemCount=%s" % (costItemID, delCostItemCount), playerID)  | 
|         if lackCountCostMoney:  | 
|             infoDict = {"TreasureType":treasureType, "TreasureIndex":treasureIndex, "CostItemID":costItemID, "LackCount":lackCount}  | 
|             PlayerControl.PayMoney(curPlayer, moneyType, lackCountCostMoney, ChConfig.Def_Cost_Treasure, infoDict, lackCount)  | 
|     else:  | 
|         infoDict = {"TreasureType":treasureType, "TreasureIndex":treasureIndex}  | 
|         PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold, ChConfig.Def_Cost_Treasure, infoDict)  | 
|         GameWorld.DebugLog("¿Û³ýÏÉÓñ,costGold=%s" % costGold, playerID)  | 
|           | 
|     # ¼ÓÊý¾Ý  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType, isFreeType), updTreasureCount)  | 
|     if ipyData.GetLuckyGridNum() in getGridResult:  | 
|         updLuck = 0  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureLuck % (treasureType), updLuck)  | 
|     PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_TreasureScore, addScore)  | 
|       | 
|     if treasureType == 2:  | 
|         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RuneTreasure, treasureCount)  | 
|         PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RuneTreasure, treasureCount)  | 
|         PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_RuneTreasure, treasureCount)  | 
|     else:  | 
|         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Treasure, treasureCount)  | 
|         PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Treasure, treasureCount)  | 
|         PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_Treasure, treasureCount)  | 
|     # ¸øÎïÆ·  | 
|     mailItemList = []  | 
|     itemControl = ItemControler.PlayerItemControler(curPlayer)  | 
|     for gridNum, itemID, itemCount, isBind in treasureResult:  | 
|         itemObj = ItemControler.GetOutPutItemObj(itemID, itemCount, False)  | 
|         mailItemDict = ItemCommon.GetMailItemDict(itemObj)  | 
|           | 
|         if int(gridNum) in goodGridNumList:  | 
|             PlayerControl.WorldNotify(0, "HappyXB", [curPlayer.GetPlayerName(), itemID, itemObj.GetUserData(), itemCount])  | 
|               | 
|         if mailItemList or not itemControl.PutInItem(packType, itemObj, event=[ChConfig.ItemGive_Treasure, False, {}]):  | 
|             mailItemList.append(mailItemDict)  | 
|             itemObj.Clear()  | 
|               | 
|     if mailItemList:  | 
|         PlayerControl.SendMailByKey("HappyXBUnEnough", [playerID], mailItemList)  | 
|           | 
|     GameWorld.DebugLog("Ѱ±¦³É¹¦: treasureType=%s,updTreasureCount=%s,updLuck=%s,addLuck=%s,addScore=%s"   | 
|                        % (treasureType, updTreasureCount, updLuck, addLuck, addScore), playerID)  | 
|     GameWorld.DebugLog("    treasureResult=%s" % (treasureResult), playerID)  | 
|     GameWorld.DebugLog("    mailItemList=%s" % (mailItemList), playerID)  | 
|       | 
|     # Í¨ÖªÇ°¶Ë  | 
|     sendPack = ChPyNetSendPack.tagMCTreasureResult()  | 
|     sendPack.Clear()  | 
|     sendPack.AddTreasureScore = addScore  | 
|     sendPack.AddTreasureLuck = addLuck  | 
|     sendPack.TreasureResult = str(treasureResult)  | 
|     sendPack.TreasureResultLen = len(sendPack.TreasureResult)  | 
|     NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
|       | 
|     Sync_TreasureInfo(curPlayer, treasureType)  | 
|     return  | 
|   | 
| def GetUpdLuckyItemRateList(ipyData, curLuck, luckFormula, costType):  | 
|     # »ñÈ¡ÐÒÔËÎïÆ·ÌáÉý¸ÅÂʺóµÄ±ýͼ  | 
|     srcPieList = ipyData.GetGridItemRateListFree() if costType == 1 else ipyData.GetGridItemRateList1()  | 
|     luckyGridNum = ipyData.GetLuckyGridNum()  | 
|       | 
|     updRateList = []  | 
|     for i, rateInfo in enumerate(srcPieList):  | 
|         rate, gridNum = rateInfo  | 
|         baseRate = rate if i == 0 else (rate - srcPieList[i - 1][0]) # Ô¸ÅÂÊ  | 
|           | 
|         if gridNum == luckyGridNum:  | 
|             newRate = eval(FormulaControl.GetCompileFormula("TreasureLuckyRate", luckFormula))  | 
|         else:  | 
|             newRate = baseRate  | 
|               | 
|         specRate = newRate if not updRateList else (updRateList[-1][0] + newRate) # ÌáÉýºó¶ÔÓ¦±ýͼ¸ÅÂÊ  | 
|         updRateList.append((specRate, gridNum))  | 
|           | 
|     return updRateList  | 
|   | 
| def GetJobItem(job, itemID, jobItemList):  | 
|     ## »ñÈ¡±¦ÏäÎïÆ·½±Àø¶ÔÓ¦µÄÖ°ÒµÎïÆ·£¬ Ö°Òµ´Ó1¿ªÊ¼  | 
|     for jobItemIDList in jobItemList:  | 
|         if type(jobItemIDList) not in [list, tuple]:  | 
|             GameWorld.ErrLog("Ö°ÒµÎïÆ·×é¸ñʽ´íÎó!jobItemList=%s" % (jobItemList))  | 
|             return 0  | 
|         if itemID in jobItemIDList:  | 
|             if job <= 0 or job > len(jobItemIDList):  | 
|                 GameWorld.ErrLog("Ö°ÒµÎïÆ·ÅäÖôíÎó,ûÓиÃÖ°Òµ¶ÔÓ¦ÎïÆ·ID!job=%s,itemID=%s" % (job, itemID))  | 
|                 return 0  | 
|             return jobItemIDList[job - 1]  | 
|     return itemID  | 
|   | 
| def GetTreasureTypeList():  | 
|     ## Ñ°±¦ÀàÐÍÁÐ±í  | 
|     TreasureTypeList = IpyGameDataPY.GetConfigEx("TreasureType")  | 
|     if not TreasureTypeList:  | 
|         TreasureTypeList = []  | 
|         ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|         for i in xrange(ipyDataMgr.GetTreasureHouseCount()):  | 
|             ipyData = ipyDataMgr.GetTreasureHouseByIndex(i)  | 
|             treasureType = ipyData.GetTreasureType()  | 
|             if treasureType not in TreasureTypeList:  | 
|                 TreasureTypeList.append(treasureType)  | 
|         IpyGameDataPY.SetConfigEx("TreasureType", TreasureTypeList)  | 
|     return TreasureTypeList  | 
|   | 
| def Sync_TreasureInfo(curPlayer, treasureType=None):  | 
|     if treasureType == None:  | 
|         syncTypeList = GetTreasureTypeList()  | 
|     else:  | 
|         syncTypeList = [treasureType]  | 
|           | 
|     treasureInfoPack = ChPyNetSendPack.tagMCTreasureInfo()  | 
|     treasureInfoPack.Clear()  | 
|     treasureInfoPack.TreasuerInfoList = []  | 
|     for tType in syncTypeList:  | 
|         treasureCountList = IpyGameDataPY.GetFuncEvalCfg("TreasureSet1%s" % tType, 1)  | 
|         tTypeInfo = ChPyNetSendPack.tagMCTreasureTypeInfo()  | 
|         tTypeInfo.Clear()  | 
|         tTypeInfo.TreasureType = tType  | 
|         tTypeInfo.LuckValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (tType))  | 
|         tTypeInfo.FreeCountTime = []  | 
|         for i in xrange(len(treasureCountList)):  | 
|             tTypeInfo.FreeCountTime.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeTime % (tType, i)))  | 
|         tTypeInfo.IndexCount = len(tTypeInfo.FreeCountTime)  | 
|         treasureInfoPack.TreasuerInfoList.append(tTypeInfo)  | 
|     treasureInfoPack.InfoCount = len(treasureInfoPack.TreasuerInfoList)  | 
|     NetPackCommon.SendFakePack(curPlayer, treasureInfoPack)  | 
|     return  | 
|   | 
|   |