#!/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)  
 | 
      
 | 
    goodGridNumList = [] # ºÃÎïÆ·¸ñ×Ó±àºÅ (ÐÒÔËÎïÆ· + ±Ø³ö + ±£µ×)  
 | 
    goodGridNumList += luckyGridNumList  
 | 
    beSureCountDict = ipyData.GetGridItemRateList3() # µÚx´Î±Ø³ö²ú³ö¸ñ×Ó±àºÅ±ýͼ  
 | 
    #for gridRateList in beSureCountDict.values():  
 | 
    #    for gridRateInfo in gridRateList:  
 | 
    #        goodGridNumList.append(gridRateInfo[1])  
 | 
    ensureCount = setIpyData.GetEnsureCount() # Ã¿¶àÉٴδ¥·¢±£µ×²ú³ö¿â  
 | 
    ensureRateList = ipyData.GetGridItemRateList2()  
 | 
    #for gridRateInfo in ensureRateList:  
 | 
    #    goodGridNumList.append(gridRateInfo[1])  
 | 
    notifyGridNumList = setIpyData.GetNotifyGridNumList() # ¶îÍâÐèÒª¹ã²¥µÄ¸ñ×Ó£¬ÐÒÔ˱سö¡¢´ÎÊý±Ø³ö¿É²»ÅäÖà  
 | 
    goodGridNumList += notifyGridNumList  
 | 
    GameWorld.DebugLog("goodGridNumList=%s" % goodGridNumList, playerID)  
 | 
      
 | 
    # µ¥³é²ú³öÓÅÏȼ¶£º ÐÒÔËÎïÆ· > ±Ø³ö > ±£µ× > ÆÕͨ  
 | 
    # Á¬³éûÓÐÓÅÏȼ¶ÏÞÖÆ£¬Ö»ÒªÂú×ãÌõ¼þ¼´¿É²ú³ö  
 | 
    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 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,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  
 | 
  
 |