hxp
2019-12-24 56ae47514b78d6b4ae0019e4fccc8837df076be4
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
@@ -76,7 +76,7 @@
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_RefineStove):
        GameWorld.DebugLog("炼丹炉功能未开启!", playerID)
        return
    refineTimes = max(1, clientPack.AlchemyTimes)
    alchemyID = clientPack.AlchemyID
    doType = clientPack.DoType
    GameWorld.DebugLog("玩家炼丹: alchemyID=%s, doType=%s" % (alchemyID, doType), playerID)
@@ -86,6 +86,7 @@
        return
    alchemType = alchemyIpyData.GetAlchemType()
    alchemyItemID = alchemyIpyData.GetAlchemItemID()
    alchemyQuality = alchemyIpyData.GetAlchemyQuality()
    hasLearn = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_AlchemyLearnState, alchemyID)
    alchemyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)
    curAlchemyItemID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyItemID % alchemType)  #正在炼的丹
@@ -119,24 +120,31 @@
        if curAlchemyItemID:
            GameWorld.DebugLog('当前丹类型已在炼丹中! curAlchemyItemID=%s' % curAlchemyItemID)
            return
        if refineTimes < 1:
            return
        # 基础固定消耗
        needMaterialDict = alchemyIpyData.GetMaterial()
        needMaterialDict = {itemID:itemCnt*refineTimes for itemID, itemCnt in needMaterialDict.items()}
        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
        lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needMaterialDict, itemPack, False)
        if lackItemDict:
            GameWorld.DebugLog("配方材料不足!alchemyID=%s,needMaterialDict=%s,lackItemDict=%s,hasItemDict=%s"
                               % (alchemyItemID, needMaterialDict, lackItemDict, delInfoDict), playerID)
            return
        #任务
        for _ in xrange(refineTimes):
            EventShell.EventRespons_RefineItem(curPlayer, alchemyQuality, alchemyItemID)
        #扣消耗
        ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, ChConfig.ItemDel_Alchemy)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyItemID % alchemType, alchemyItemID)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyStartTime % alchemyID, curTime)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyTimes % alchemyID, refineTimes)
        Sycn_AlchemyMsg(curPlayer, alchemyID, False)
        #日常任务
        costItemCnt = sum(needMaterialDict.values())
        PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_RefineStove, costItemCnt)
        #PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_RefineStove, costItemCnt)
    elif doType == 2:
        if curAlchemyItemID != alchemyItemID:
@@ -149,59 +157,68 @@
        if curAlchemyItemID != alchemyItemID:
            GameWorld.DebugLog('开炉丹药ID错误 curAlchemyItemID=%s' % curAlchemyItemID)
            return
        refineTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyTimes % alchemyID)
        refineTimes = max(1, refineTimes)
        startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyStartTime % alchemyID)
        passTime = max(0, curTime - startTime)
        if passTime < alchemyIpyData.GetNeedTime():
        if passTime < alchemyIpyData.GetNeedTime() * refineTimes:
            GameWorld.DebugLog('开炉丹药,时间未到  passTime=%s' % passTime)
            return
        alchemyQuality = alchemyIpyData.GetAlchemyQuality()
        appointInfo = [] #定制配置 [数量,成功率]
        alchemyAppointCntDict = {} #定制配置 {次数:[数量,成功率]}
        alchemyCustomizedDict = IpyGameDataPY.GetFuncEvalCfg('alchemyCustomized', 1, {})
        if alchemyID in alchemyCustomizedDict:
            alchemyCnt = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_AlchemyCnt, alchemyID, False)
            alchemyCntDict = alchemyCustomizedDict[alchemyID]
            if alchemyCnt + 1 in alchemyCntDict:
                appointInfo = alchemyCntDict[alchemyCnt + 1]
            alchemyAppointCntDict = alchemyCustomizedDict[alchemyID]
        #成功率
        if appointInfo:
            successRate = appointInfo[1]
        elif alchemType == DefStoveType2:
            successRate = ShareDefine.Def_MaxRateValue  #仙丹必定成功
        elif alchemType == DefStoveType1:
            #灵丹成功率公式 参数 curLuckValue:慧根  alchemyLV:炼丹等级 alchemyQuality:丹药等级  qualityNeedLuck:要求慧根
            qualityNeedLuck = IpyGameDataPY.GetFuncEvalCfg('alchemySuccess', 2, {}).get(str(alchemyQuality), 0)
            successRate = eval(IpyGameDataPY.GetFuncCompileCfg('alchemySuccess'))
        else:
        resultIpyData = IpyGameDataPY.InterpolationSearch('AlchemyResult', 'LuckValue', curLuckValue, {'AlchemyQuality':alchemyIpyData.GetAlchemyQuality()})
        if not resultIpyData:
            GameWorld.ErrLog('AlchemyResult 配置错误 未找到该丹方数量 alchemyItemID=%s' % alchemyItemID, playerID)
            return
        isSuccess = GameWorld.CanHappen(successRate)
        makeItemData = GameWorld.GetGameData().GetItemByTypeID(alchemyItemID)
        if not makeItemData:
            return
        #灵丹成功率公式 参数 curLuckValue:慧根  alchemyLV:炼丹等级 alchemyQuality:丹药等级  qualityNeedLuck:要求慧根
        qualityNeedLuck = IpyGameDataPY.GetFuncEvalCfg('alchemySuccess', 2, {}).get(str(alchemyQuality), 0)
        nomalsuccessRate = eval(IpyGameDataPY.GetFuncCompileCfg('alchemySuccess'))
        resultCnt = 0  #丹药数量 0代表失败
        if isSuccess:
        for i in xrange(refineTimes):
            #成功率
            appointInfo = [] #[数量,成功率]
            if alchemyAppointCntDict and alchemyCnt+1+i in alchemyAppointCntDict:
                appointInfo = alchemyAppointCntDict[alchemyCnt+1+i]
            if appointInfo:
                successRate = appointInfo[1]
            elif alchemType == DefStoveType2:
                successRate = ShareDefine.Def_MaxRateValue  #仙丹必定成功
            elif alchemType == DefStoveType1:
                successRate = nomalsuccessRate
            else:
                return
            isSuccess = GameWorld.CanHappen(successRate)
            if isSuccess:
                if alchemType == DefStoveType2:
                    resultCnt += 1 #仙丹必定为1
                elif alchemType == DefStoveType1:
                    if appointInfo:
                        resultCnt += appointInfo[0]
                    else:
                        resultCnt += GameWorld.GetResultByRandomList(resultIpyData.GetCntRateList())
                if not resultCnt:
                    GameWorld.ErrLog('AlchemyResult 配置错误 未随机出该丹方数量alchemyItemID=%s' % alchemyItemID, playerID)
                    return
        if resultCnt:
            needSpace = 1
            packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
            if needSpace > packSpace:
                PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
                return
            if alchemType == DefStoveType2:
                resultCnt = 1 #仙丹必定为1
            elif alchemType == DefStoveType1:
                if appointInfo:
                    resultCnt = appointInfo[0]
                else:
                    ipyData = IpyGameDataPY.InterpolationSearch('AlchemyResult', 'LuckValue', curLuckValue, {'AlchemyQuality':alchemyIpyData.GetAlchemyQuality()})
                    if not ipyData:
                        GameWorld.ErrLog('AlchemyResult 配置错误 未找到该丹方数量 alchemyItemID=%s' % alchemyItemID, playerID)
                        return
                    resultCnt = GameWorld.GetResultByRandomList(ipyData.GetCntRateList())
            if not resultCnt:
                GameWorld.ErrLog('AlchemyResult 配置错误 未随机出该丹方数量alchemyItemID=%s' % alchemyItemID, playerID)
                return
            makeItemData = GameWorld.GetGameData().GetItemByTypeID(alchemyItemID)
            if not makeItemData:
                return
            ItemControler.GivePlayerItem(curPlayer, alchemyItemID, resultCnt, 0, [IPY_GameWorld.rptItem],
                                     event=[ChConfig.ItemGive_Refine, False, {}])
                                      event=[ChConfig.ItemGive_Refine, False, {}])
            #紫色及以上全服广播
            notifyColor = IpyGameDataPY.GetFuncCfg("AlchemyNotify", 1)
            needNotifyItemIDList = IpyGameDataPY.GetFuncEvalCfg("AlchemyNotify", 2)
@@ -209,31 +226,33 @@
            if alchemyItemID not in notNotifyItemIDList and (alchemyItemID in needNotifyItemIDList or makeItemData.GetItemColor() >= notifyColor):
                PlayerControl.WorldNotify(0, "AchemyGreatSuccess", [curPlayer.GetPlayerName(), alchemyItemID])
            #任务
            EventShell.EventRespons_RefineItem(curPlayer, alchemyQuality, alchemyItemID)
#        #任务,改为开始炼丹触发
#        for _ in xrange(refineTimes):
#            EventShell.EventRespons_RefineItem(curPlayer, alchemyQuality, alchemyItemID)
        #重置
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyItemID % alchemType, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyStartTime % alchemyID, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyTimes % alchemyID, 0)
        #加经验
        addExp = alchemyIpyData.GetAlchemyExp()
        addExp = alchemyIpyData.GetAlchemyExp() * refineTimes
        AddRefineExp(curPlayer, addExp, alchemyLV)
        #加次数
        if alchemyID in alchemyCustomizedDict:
            GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_AlchemyCnt, alchemyID, min(alchemyCnt + 1, 9), False)
        GameWorld.DebugLog('炼丹结果 alchemyItemID=%s,successRate=%s,isSuccess=%s,resultCnt=%s,appointInfo=%s' % (alchemyItemID, successRate, isSuccess, resultCnt, appointInfo), playerID)
            GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_AlchemyCnt, alchemyID, min(alchemyCnt + refineTimes, 9), False)
        GameWorld.DebugLog('炼丹结果 alchemyItemID=%s,refineTimes=%s,isSuccess=%s,resultCnt=%s' % (alchemyItemID, refineTimes, isSuccess, resultCnt), playerID)
        Sycn_AlchemyMsg(curPlayer, alchemyID, False, alchemyItemID, resultCnt)
        #完成1次炼丹成就
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_RefineItem, 1)
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_RefineItem, refineTimes)
        #完成1次X品质物品炼丹成就
        #PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_RefineStoveColor, 1, [makeItemData.GetItemColor()])
        PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RefineStove, 1)
        PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RefineStove, 1)
        PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_Alchemy, 1)
        PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RefineStove, refineTimes)
        PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RefineStove, refineTimes)
        PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_Alchemy, refineTimes)
    return
@@ -295,6 +314,7 @@
        StoveInfo = ChPyNetSendPack.tagMCPlayerStoveInfo()
        StoveInfo.AlchemyID = alchemyID
        StoveInfo.StartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyStartTime % alchemyID)
        StoveInfo.AlchemyTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyTimes % alchemyID)
        pack.InfoList.append(StoveInfo)
    pack.StoveCnt = len(pack.InfoList)
    NetPackCommon.SendFakePack(curPlayer, pack)