#!/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 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_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 = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 2) # ÏûºÄ»õ±ÒÁÐ±í  
 | 
        costGoldType = IpyGameDataPY.GetFuncCfg(TreasureSet2, 4) # ÏûºÄ»õ±ÒÀàÐÍ  
 | 
        costGold = costGoldList[treasureIndex]  
 | 
        if not costGold:  
 | 
            GameWorld.ErrLog("¸ÃѰ±¦ÀàÐÍË÷Òý²»Ö§³ÖÏûºÄÏÉÓñѰ±¦!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID)  
 | 
            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  
 | 
      
 | 
    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])  
 | 
    notifyGridNumList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet2, 5) # ¶îÍâÐèÒª¹ã²¥µÄ¸ñ×Ó£¬ÐÒÔ˱سö¡¢´ÎÊý±Ø³ö¿É²»ÅäÖà  
 | 
    goodGridNumList += notifyGridNumList  
 | 
    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 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 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 == 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, costGoldType, costGold, ChConfig.Def_Cost_Treasure, infoDict)  
 | 
        GameWorld.DebugLog("¿Û³ý»õ±Ò,costGoldType=%s,costGold=%s" % (costGoldType, 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)  
 | 
        PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_RuneTreasure, treasureCount)  
 | 
        PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_RuneTreasure, treasureCount)  
 | 
    elif treasureType == 1:  
 | 
        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 == 3:  
 | 
        PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_JSTreasure, treasureCount)  
 | 
        PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_JSTreasure, treasureCount)  
 | 
        PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_JSTreasure, 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 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  
 | 
  
 | 
  
 |