ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
@@ -45,15 +45,6 @@
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
@@ -61,6 +52,20 @@
    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
@@ -79,13 +84,14 @@
    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) # 寻宝获得个数列表
    setIpyData = IpyGameDataPY.GetIpyGameData("TreasureSet", treasureType)
    if not setIpyData:
        return
    treasureCountList = setIpyData.GetTreasureCountList() # 寻宝获得个数列表
    if not treasureCountList:
        GameWorld.DebugLog("没有寻宝次数列表配置!", playerID)
        return
@@ -97,37 +103,31 @@
        GameWorld.DebugLog("没有寻宝次数配置!", playerID)
        return
    
    packType = ShareDefine.rptTreasure
    #if treasureType == 2:
    #    packType = ShareDefine.rptRune
    if treasureType in [TreasureType_GatherTheSoul]:
        packType = IPY_GameWorld.rptItem
    packType = setIpyData.GetPackType()
    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:
        dailyFreeCount = setIpyData.GetDailyFreeCount()
        if not dailyFreeCount:
            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)
        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:
        costItemList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 3) # 消耗道具物品ID列表
        if not costItemList:
        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
        costItemID, costItemNeedCount = costItemList[treasureIndex]
        costItemNeedCount = costItemList[treasureIndex]
        if not costItemID or not costItemNeedCount:
            return
        costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID)
@@ -148,11 +148,13 @@
        
    # 仙玉寻宝
    else:
        costGoldList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 2) # 消耗货币列表
        costGoldType = IpyGameDataPY.GetFuncCfg(TreasureSet2, 4) # 消耗货币类型
        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:
            GameWorld.ErrLog("该寻宝类型索引不支持消耗仙玉寻宝!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID)
            return
        
        if not PlayerControl.HaveMoney(curPlayer, costGoldType, costGold):
@@ -163,39 +165,40 @@
        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) # 满幸运值
    luckyGridNum = setIpyData.GetLuckyGridNum() # 幸运物品概率公式
    luckFormula = setIpyData.GetLuckyRateFormat() # 幸运物品概率公式
    addLuck = setIpyData.GetOnceLucky() * treasureCount # 增加幸运值
    maxLuck = setIpyData.GetFullLucky() # 满幸运值
    curLuck = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (treasureType)) # 当前幸运值
    updLuck = curLuck + addLuck
    
    commItemRateList = GetUpdLuckyItemRateList(ipyData, curLuck, luckFormula, costType) # 常规产出物品格子饼图,幸运物品概率已变更
    commItemRateList = GetUpdLuckyItemRateList(ipyData, luckyGridNum, curLuck, luckFormula, costType) # 常规产出物品格子饼图,幸运物品概率已变更
    
    curTreasureCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureCount % (treasureType, isFreeType)) # 当前已寻宝次数
    curTreasureCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureCount % (treasureType)) # 当前已寻宝次数
    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()] # 好物品格子编号 (幸运物品 + 必出 + 保底)
    goodGridNumList = [luckyGridNum] # 好物品格子编号 (幸运物品 + 必出 + 保底)
    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 = IpyGameDataPY.GetFuncEvalCfg(TreasureSet2, 5) # 额外需要广播的格子,幸运必出、次数必出可不配置
    notifyGridNumList = setIpyData.GetNotifyGridNumList() # 额外需要广播的格子,幸运必出、次数必出可不配置
    goodGridNumList += notifyGridNumList
    GameWorld.DebugLog("goodGridNumList=%s" % goodGridNumList, playerID)
    # 单抽产出优先级: 幸运物品 > 必出 > 保底 > 普通
    # 连抽没有优先级限制,只要满足条件即可产出
    getGridResult = []
    
    # 1.满幸运必出
    if updLuck >= maxLuck:
        getGridResult.append(ipyData.GetLuckyGridNum())
        GameWorld.DebugLog("满幸运必出幸运物品: gridNum=%s" % ipyData.GetLuckyGridNum(), playerID)
        getGridResult.append(luckyGridNum)
        GameWorld.DebugLog("满幸运必出幸运物品: luckyGridNum=%s" % luckyGridNum, playerID)
        
    # 单抽
    if treasureCount == 1:
@@ -242,7 +245,7 @@
            doCount -= 1
            gridNum = GameWorld.GetResultByRandomList(commItemRateList)
            
            if gridNum == ipyData.GetLuckyGridNum() and gridNum in getGridResult:
            if gridNum == luckyGridNum and gridNum in getGridResult:
                GameWorld.DebugLog("幸运物品已经出过,不再重复产出!")
                continue
            
@@ -283,7 +286,7 @@
    isBind = 0 # 暂时默认不绑定
    job = curPlayer.GetJob()
    gridItemInfoDict = ipyData.GetGridItemInfo() # 格子对应物品信息 {"格子编号":[物品ID, 数量], ...}
    gridLibInfoDict = ipyData.GetGridLibInfo() # 格子对应物品信息 {"格子编号":[物品ID, 数量], ...}
    gridLibInfoDict = ipyData.GetGridLibInfo() # 格子编号对应库ID {"编号":物品库ID, ...}
    jobItemList = ipyData.GetJobItemList()
    treasureResult = []
    randItemIDDict = IpyGameDataPY.GetFuncEvalCfg("TreasureSet", 2)
@@ -338,8 +341,8 @@
        
    # 扣消耗
    if costType == 1:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeTime % (treasureType, treasureIndex), curTime)
        GameWorld.DebugLog("消耗免费次数,更新免费CD计算时间: %s" % curTime, playerID)
        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)
@@ -352,12 +355,16 @@
        GameWorld.DebugLog("扣除货币,costGoldType=%s,costGold=%s" % (costGoldType, costGold), playerID)
        
    # 加数据
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType, isFreeType), updTreasureCount)
    if ipyData.GetLuckyGridNum() in getGridResult:
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType), updTreasureCount)
    if luckyGridNum in getGridResult:
        updLuck = 0
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureLuck % (treasureType), updLuck)
    PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_TreasureScore, addScore)
    
    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)
@@ -390,28 +397,30 @@
    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("寻宝成功: 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.AddTreasureScore = addScore
    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)
    Sync_TreasureInfo(curPlayer, [treasureType])
    return
def GetUpdLuckyItemRateList(ipyData, curLuck, luckFormula, costType):
def GetUpdLuckyItemRateList(ipyData, luckyGridNum, curLuck, luckFormula, costType):
    # 获取幸运物品提升概率后的饼图
    srcPieList = ipyData.GetGridItemRateListFree() if costType == 1 else ipyData.GetGridItemRateList1()
    luckyGridNum = ipyData.GetLuckyGridNum()
    if not srcPieList:
        srcPieList = ipyData.GetGridItemRateList1()
    updRateList = []
    for i, rateInfo in enumerate(srcPieList):
        rate, gridNum = rateInfo
@@ -440,42 +449,26 @@
            return jobItemIDList[job - 1]
    return itemID
def GetTreasureTypeList():
    ## 寻宝类型列表
    TreasureTypeList = IpyGameDataPY.GetConfigEx("TreasureType")
    if not TreasureTypeList:
        TreasureTypeList = []
def Sync_TreasureInfo(curPlayer, syncTypeList=None):
    if syncTypeList == None:
        syncTypeList = []
        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]
        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:
        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)
        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