| #!/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 PlayerFeastTravel  | 
| import PlayerFairyCeremony  | 
| import PlayerNewFairyCeremony  | 
| import PlayerActTask  | 
| import ItemCommon  | 
| import ChConfig  | 
|   | 
| import random  | 
| import time  | 
|   | 
| TreasureTypeList = (  | 
| TreasureType_Jipin, # ¼«Æ·Ñ°±¦ 1  | 
| TreasureType_Rune, # ·ûӡѰ±¦ 2  | 
| TreasureType_Jueshi, # ¾øÊÀ¾ý±¦ 3  | 
| TreasureType_GatherTheSoul, # ¾Û»êÁÔħ 4  | 
| TreasureType_Gubao, # ¹Å±¦Ñ°±¦ 5  | 
| ) = range(1, 1 + 5)  | 
|   | 
| def DoTreasureOpen(curPlayer):  | 
|     ## Ñ°±¦¿ªÆô  | 
|     Sync_TreasureInfo(curPlayer)  | 
|     return  | 
|   | 
| def OnTreasureLogin(curPlayer):  | 
|     #if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Treasure):  | 
|     #    return  | 
|     Sync_TreasureInfo(curPlayer)  | 
|     return  | 
|   | 
| def OnDay(curPlayer):  | 
|     syncTypeList = []  | 
|     ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|     for i in xrange(ipyDataMgr.GetTreasureSetCount()):  | 
|         ipyData = ipyDataMgr.GetTreasureSetByIndex(i)  | 
|         treasureType = ipyData.GetTreasureType()  | 
|         if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeCount % (treasureType)):  | 
|             continue  | 
|         syncTypeList.append(treasureType)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeCount % (treasureType), 0)  | 
|     if syncTypeList:  | 
|         Sync_TreasureInfo(curPlayer, syncTypeList)  | 
|     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  | 
|       | 
|     GameWorld.DebugLog("Íæ¼ÒѰ±¦: treasureType=%s,treasureIndex=%s,costType=%s,playerLV=%s"   | 
|                        % (treasureType, treasureIndex, costType, playerLV), playerID)  | 
|       | 
|     setIpyData = IpyGameDataPY.GetIpyGameData("TreasureSet", treasureType)  | 
|     if not setIpyData:  | 
|         return  | 
|     treasureCountList = setIpyData.GetTreasureCountList() # Ñ°±¦»ñµÃ¸öÊýÁÐ±í  | 
|     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 = setIpyData.GetPackType()  | 
|     if not ItemCommon.CheckPackHasSpace(curPlayer, packType, True):  | 
|         GameWorld.DebugLog("¶ÔӦѰ±¦±³°üûÓпոñ×Ó!packType=%s" % packType, playerID)  | 
|         return  | 
|       | 
|     # Ãâ·Ñ´ÎÊý  | 
|     if costType == 1:  | 
|         dailyFreeCount = setIpyData.GetDailyFreeCount()  | 
|         if not dailyFreeCount:  | 
|             GameWorld.ErrLog("¸ÃѰ±¦ÀàÐÍË÷Òý²»Ö§³ÖÃâ·Ñ´ÎÊýѰ±¦!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID)  | 
|             return  | 
|         freeCountToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeCount % (treasureType))  | 
|         updFreeCountToday = freeCountToday + treasureCount  | 
|         if updFreeCountToday > dailyFreeCount:  | 
|             GameWorld.DebugLog("½ñÈÕÃâ·Ñ´ÎÊý²»×㣬ÎÞ·¨Ê¹ÓÃÃâ·ÑѰ±¦! freeCountToday=%s + %s > %s" % (freeCountToday, treasureCount, dailyFreeCount), playerID)  | 
|             return  | 
|           | 
|     # Ñ°±¦µÀ¾ß, Ä¿Ç°Ä¬ÈÏÏûºÄ1¸ö  | 
|     elif costType == 2:  | 
|         costItemID = setIpyData.GetCostItemID()  | 
|         costItemList = setIpyData.GetCostItemCountList() # ÏûºÄµÀ¾ßÎïÆ·IDÁÐ±í  | 
|         if not costItemID or not costItemList or treasureIndex >= len(costItemList):  | 
|             GameWorld.ErrLog("¸ÃѰ±¦ÀàÐÍË÷Òý²»Ö§³ÖÏûºÄµÀ¾ßѰ±¦!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID)  | 
|             return  | 
|         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_Paper  | 
|                 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 = setIpyData.GetCostMoneyList() # ÏûºÄ»õ±ÒÁÐ±í  | 
|         costGoldType = setIpyData.GetCostMoneyType() # ÏûºÄ»õ±ÒÀàÐÍ  | 
|         if not costGoldType or not costGoldList or treasureIndex >= len(costGoldList):  | 
|             GameWorld.ErrLog("¸ÃѰ±¦ÀàÐÍË÷Òý²»Ö§³ÖÏûºÄ»õ±ÒѰ±¦!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID)  | 
|             return  | 
|         costGold = costGoldList[treasureIndex]  | 
|         if not costGold:  | 
|             return  | 
|           | 
|         if not PlayerControl.HaveMoney(curPlayer, costGoldType, costGold):  | 
|             return  | 
|           | 
|     ipyData = IpyGameDataPY.InterpolationSearch("TreasureHouse", "MinLV", playerLV, {"TreasureType":treasureType})  | 
|     if not ipyData:  | 
|         GameWorld.ErrLog("ÕÒ²»µ½¸ÃµÈ¼¶¶ÔӦѰ±¦¿âÅäÖÃ!treasureType=%s,curLV=%s" % (treasureType, curPlayer.GetLV()), playerID)  | 
|         return  | 
|       | 
|     luckyItemRateList = ipyData.GetLuckyItemRateList()  | 
|     luckyGridNumList = []  | 
|     if luckyItemRateList:  | 
|         for _, gridNum in luckyItemRateList:  | 
|             luckyGridNumList.append(gridNum)  | 
|     elif setIpyData.GetLuckyGridNum():  | 
|         luckyGridNumList = [setIpyData.GetLuckyGridNum()]  | 
|     GameWorld.DebugLog("luckyGridNumList=%s, %s" % (luckyGridNumList, luckyItemRateList), playerID)  | 
|     luckFormula = setIpyData.GetLuckyRateFormat() # ÐÒÔËÎïÆ·¸ÅÂʹ«Ê½  | 
|     addLuck = setIpyData.GetOnceLucky() * treasureCount # Ôö¼ÓÐÒÔËÖµ  | 
|     maxLuck = setIpyData.GetFullLucky() # ÂúÐÒÔËÖµ  | 
|     curLuck = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (treasureType)) # µ±Ç°ÐÒÔËÖµ  | 
|     updLuck = curLuck + addLuck  | 
|       | 
|     commItemRateList = GetUpdLuckyItemRateList(ipyData, luckyGridNumList, curLuck, luckFormula, costType) # ³£¹æ²ú³öÎïÆ·¸ñ×Ó±ýͼ£¬ÐÒÔËÎïÆ·¸ÅÂÊÒѱä¸ü  | 
|       | 
|     curTreasureCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureCount % (treasureType)) # µ±Ç°ÒÑѰ±¦´ÎÊý  | 
|     updTreasureCount = curTreasureCount + treasureCount  | 
|     GameWorld.DebugLog("ÒѾѰ±¦´ÎÊý=%s,µ±Ç°ÐÒÔË=%s,commItemRateList=%s" % (curTreasureCount, curLuck, commItemRateList), playerID)  | 
|       | 
|     beSureCountDict = ipyData.GetGridItemRateList3() # µÚx´Î±Ø³ö²ú³ö¸ñ×Ó±àºÅ±ýͼ  | 
|     ensureCount = setIpyData.GetEnsureCount() # Ã¿¶àÉٴδ¥·¢±£µ×²ú³ö¿â  | 
|     ensureRateList = ipyData.GetGridItemRateList2()  | 
|     notifyGridNumList = setIpyData.GetNotifyGridNumList() # ¶îÍâÐèÒª¹ã²¥µÄ¸ñ×Ó£¬ÐÒÔ˱سö¡¢´ÎÊý±Ø³ö¿É²»ÅäÖà  | 
|       | 
|     # µ¥³é²ú³öÓÅÏȼ¶£º ÐÒÔËÎïÆ· > ±Ø³ö > ±£µ× > ÆÕͨ  | 
|     # Á¬³éûÓÐÓÅÏȼ¶ÏÞÖÆ£¬Ö»ÒªÂú×ãÌõ¼þ¼´¿É²ú³ö  | 
|     getGridResult = []  | 
|       | 
|     # 1.ÂúÐÒÔ˱سö  | 
|     if updLuck >= maxLuck and luckyGridNumList:  | 
|         if luckyItemRateList:  | 
|             luckyGridNum = GameWorld.GetResultByRandomList(luckyItemRateList)  | 
|         else:  | 
|             luckyGridNum = luckyGridNumList[0]  | 
|         getGridResult.append(luckyGridNum)  | 
|         GameWorld.DebugLog("ÂúÐÒÔ˱سöÐÒÔËÎïÆ·: luckyGridNum=%s" % luckyGridNum, 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 ensureCount and updTreasureCount % ensureCount == 0 and ensureRateList:  | 
|                 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 ensureCount and updTreasureCount / ensureCount > curTreasureCount / ensureCount and ensureRateList:  | 
|             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 in luckyGridNumList 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, ÊýÁ¿], ...}  | 
|     gridLibInfoDict = ipyData.GetGridLibInfo() # ¸ñ×Ó±àºÅ¶ÔÓ¦¿âID {"±àºÅ":ÎïÆ·¿âID, ...}  | 
|     jobItemList = ipyData.GetJobItemList()  | 
|     treasureResult = []  | 
|     randItemIDDict = IpyGameDataPY.GetFuncEvalCfg("TreasureSet", 2)  | 
|       | 
|     for gridNum in getGridResult:  | 
|         gridNum = str(gridNum)  | 
|         if gridNum in gridItemInfoDict:  | 
|             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)  | 
|         # ¸ù¾ÝÎïÆ·¿âÀ´Ëæ»ú  | 
|         elif gridNum in gridLibInfoDict:  | 
|             libID = gridLibInfoDict[gridNum]  | 
|             libItemList = IpyGameDataPY.GetIpyGameDataList("TreasureItemLib", libID)  | 
|             if not libItemList:  | 
|                 return  | 
|             itemWeightList = []  | 
|             for libItem in libItemList:  | 
|                 itemWeight, itemID, itemCount = libItem.GetItemWeight(), libItem.GetItemID(), libItem.GetItemCount()  | 
|                 itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)  | 
|                 if not itemData:  | 
|                     continue  | 
|                 itemWeightList.append([itemWeight, [itemID, itemCount]])  | 
|             if not itemWeightList:  | 
|                 GameWorld.ErrLog("Ѱ±¦Ëæ»ú¸ñ×ÓûÓпÉËæ»úµÄÎïÆ·!treasureType=%s,treasureIndex=%s,gridNum=%s,libID=%s"   | 
|                                  % (treasureType, treasureIndex, gridNum, libID), playerID)  | 
|                 return  | 
|             itemID, itemCount = GameWorld.GetResultByWeightList(itemWeightList)  | 
|         else:  | 
|             GameWorld.ErrLog("Ѱ±¦¸ñ×Ó²»´æÔÚ!treasureType=%s,gridNum=%s" % (treasureType, gridNum), playerID)  | 
|             return  | 
|           | 
|         treasureResult.append([gridNum, itemID, itemCount, isBind])  | 
|           | 
|     # ¿ÛÏûºÄ  | 
|     if costType == 1:  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeCount % (treasureType), updFreeCountToday)  | 
|         GameWorld.DebugLog("ÏûºÄÃâ·Ñ´ÎÊý£¬¸üнñÈÕÒÑʹÓÃÃâ·Ñ´ÎÊý: %s" % updFreeCountToday, 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, costGoldType, costGold, ChConfig.Def_Cost_Treasure, infoDict)  | 
|         GameWorld.DebugLog("¿Û³ý»õ±Ò,costGoldType=%s,costGold=%s" % (costGoldType, costGold), playerID)  | 
|           | 
|     # ¼ÓÊý¾Ý  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType), updTreasureCount)  | 
|     for luckyGridNum in luckyGridNumList:  | 
|         if luckyGridNum in getGridResult:  | 
|             updLuck = 0  | 
|             break  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureLuck % (treasureType), updLuck)  | 
|       | 
|     addScoreType = setIpyData.GetAwardMoneyType() # ¶îÍâ½±Àø»õ±ÒÀàÐÍ  | 
|     addScore = setIpyData.GetAwardMoneyValue() # µ¥´Î½±Àø»õ±ÒÊý  | 
|     if addScoreType and addScore:  | 
|         PlayerControl.GiveMoney(curPlayer, addScoreType, addScore)  | 
|           | 
|     if treasureType == TreasureType_Rune:  | 
|         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RuneTreasure, treasureCount)  | 
|         PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_RuneTreasure, treasureCount)  | 
|         PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_RuneTreasure, treasureCount)  | 
|     elif treasureType == TreasureType_Jipin:  | 
|         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Treasure, treasureCount)  | 
|         PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_Treasure, treasureCount)  | 
|         PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_Treasure, treasureCount)  | 
|     elif treasureType == TreasureType_Jueshi:  | 
|         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_JSTreasure, treasureCount)  | 
|         PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_JSTreasure, treasureCount)  | 
|         PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_JSTreasure, treasureCount)  | 
|     elif treasureType == TreasureType_GatherTheSoul:  | 
|         pass  | 
|     elif treasureType == TreasureType_Gubao:  | 
|         PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_TreasureGubao, treasureCount)  | 
|           | 
|     # ¸øÎïÆ·  | 
|     mailItemList = []  | 
|     itemControl = ItemControler.PlayerItemControler(curPlayer)  | 
|     for gridNum, itemID, itemCount, isBind in treasureResult:  | 
|         itemObj = ItemControler.GetOutPutItemObj(itemID, itemCount, False, curPlayer=curPlayer)  | 
|         mailItemDict = ItemCommon.GetMailItemDict(itemObj)  | 
|           | 
|         if int(gridNum) in notifyGridNumList:  | 
|             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,addScoreType=%s,addScore=%s"   | 
|                        % (treasureType, updTreasureCount, updLuck, addLuck, addScoreType, addScore), playerID)  | 
|     GameWorld.DebugLog("    treasureResult=%s" % (treasureResult), playerID)  | 
|     GameWorld.DebugLog("    mailItemList=%s" % (mailItemList), playerID)  | 
|       | 
|     # Í¨ÖªÇ°¶Ë  | 
|     sendPack = ChPyNetSendPack.tagMCTreasureResult()  | 
|     sendPack.Clear()  | 
|     sendPack.AddMoneyType = addScoreType  | 
|     sendPack.AddMoneyValue = 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, luckyGridNumList, curLuck, luckFormula, costType):  | 
|     # »ñÈ¡ÐÒÔËÎïÆ·ÌáÉý¸ÅÂʺóµÄ±ýͼ  | 
|     treasureType = ipyData.GetTreasureType()  | 
|     srcPieList = ipyData.GetGridItemRateListFree() if costType == 1 else ipyData.GetGridItemRateList1()  | 
|     if not srcPieList:  | 
|         srcPieList = ipyData.GetGridItemRateList1()  | 
|           | 
|     updRateList = []  | 
|     for i, rateInfo in enumerate(srcPieList):  | 
|         rate, gridNum = rateInfo  | 
|         baseRate = rate if i == 0 else (rate - srcPieList[i - 1][0]) # Ô¸ÅÂÊ  | 
|           | 
|         if gridNum in luckyGridNumList:  | 
|             newRate = eval(FormulaControl.GetCompileFormula("TreasureLuckyRate%s" % treasureType, 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 Sync_TreasureInfo(curPlayer, syncTypeList=None):  | 
|     if syncTypeList == None:  | 
|         syncTypeList = []  | 
|         ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|         for i in xrange(ipyDataMgr.GetTreasureSetCount()):  | 
|             ipyData = ipyDataMgr.GetTreasureSetByIndex(i)  | 
|             syncTypeList.append(ipyData.GetTreasureType())  | 
|               | 
|     treasureInfoPack = ChPyNetSendPack.tagMCTreasureInfo()  | 
|     treasureInfoPack.Clear()  | 
|     treasureInfoPack.TreasuerInfoList = []  | 
|     for tType in syncTypeList:  | 
|         tTypeInfo = ChPyNetSendPack.tagMCTreasureTypeInfo()  | 
|         tTypeInfo.Clear()  | 
|         tTypeInfo.TreasureType = tType  | 
|         tTypeInfo.LuckValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (tType))  | 
|         tTypeInfo.TreasureCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureCount % (tType))  | 
|         tTypeInfo.FreeCountToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeCount % (tType))  | 
|         treasureInfoPack.TreasuerInfoList.append(tTypeInfo)  | 
|     treasureInfoPack.InfoCount = len(treasureInfoPack.TreasuerInfoList)  | 
|     NetPackCommon.SendFakePack(curPlayer, treasureInfoPack)  | 
|     return  | 
|   |