From 1f8acf4823f6d7c2e19f0db8bd11d3b07d168a5c Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 10 七月 2019 16:21:52 +0800
Subject: [PATCH] 7954 【主干】【后端】跨服PVP匹配机器人规则优化

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py |  168 +++++++++++++++++++++++++++++++------------------------
 1 files changed, 94 insertions(+), 74 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
index 91de900..6ea79b7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
@@ -37,7 +37,7 @@
 import copy
 import time
 
-DefStoveType1 = 1 #1灵丹 
+DefStoveType1 = 1 #1灵丹
 DefStoveType2 = 2 #2仙丹
 
 
@@ -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)
@@ -91,7 +91,7 @@
     curAlchemyItemID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyItemID % alchemType)  #正在炼的丹
     curLuckValue = curPlayer.GetLuckValue()
     curTime = int(time.time())
-    
+
     if doType == 0:
         if hasLearn:
             GameWorld.DebugLog('丹方已学习!,不可重复学')
@@ -100,9 +100,9 @@
         if alchemyLV < learnNeedAlchemLV:
             GameWorld.DebugLog('丹方学习需要炼丹等级 %s' % learnNeedAlchemLV)
             return
-        learnNeedLuck = alchemyIpyData.GetLearnNeedLuck()
-        if curLuckValue < learnNeedLuck:
-            GameWorld.DebugLog('丹方学习需要慧根 %s' % learnNeedLuck)
+        learnNeedLingGenPoint = alchemyIpyData.GetLearnNeedLingGenPoint()
+        if PlayerControl.GetTotalLingGenPoint(curPlayer) < learnNeedLingGenPoint:
+            GameWorld.DebugLog('丹方学习需要总灵根点 %s' % learnNeedLingGenPoint)
             return
         learnNeedItemID = alchemyIpyData.GetLearnNeedItemID()
         itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
@@ -119,25 +119,28 @@
         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" 
+            GameWorld.DebugLog("配方材料不足!alchemyID=%s,needMaterialDict=%s,lackItemDict=%s,hasItemDict=%s"
                                % (alchemyItemID, needMaterialDict, lackItemDict, delInfoDict), playerID)
             return
         #扣消耗
         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:
             GameWorld.DebugLog('停止丹药ID错误 curAlchemyItemID=%s' % curAlchemyItemID)
@@ -149,97 +152,113 @@
         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
-        alchemyCommonCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyCommonCnt)
         alchemyQuality = alchemyIpyData.GetAlchemyQuality()
-        #成功率
-        if alchemType == DefStoveType2:
-            successRate = ShareDefine.Def_MaxRateValue  #仙丹必定成功
-        elif alchemType == DefStoveType1:
-            #灵丹成功率公式 参数 curLuckValue:慧根  alchemyLV:炼丹等级 alchemyQuality:丹药等级  qualityNeedLuck:要求慧根
-            alchemyCustomizedDict = IpyGameDataPY.GetFuncEvalCfg('alchemyCustomized', 1, {})
-            if alchemyCommonCnt + 1 in alchemyCustomizedDict:
-                successRate = alchemyCustomizedDict[alchemyCommonCnt + 1][1]
-            else:
-                qualityNeedLuck = IpyGameDataPY.GetFuncEvalCfg('alchemySuccess', 2, {}).get(str(alchemyQuality), 0)
-                successRate = eval(IpyGameDataPY.GetFuncCompileCfg('alchemySuccess'))
-        else:
+
+        alchemyAppointCntDict = {} #定制配置 {次数:[数量,成功率]}
+        alchemyCustomizedDict = IpyGameDataPY.GetFuncEvalCfg('alchemyCustomized', 1, {})
+        if alchemyID in alchemyCustomizedDict:
+            alchemyCnt = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_AlchemyCnt, alchemyID, False)
+            alchemyAppointCntDict = alchemyCustomizedDict[alchemyID]
+
+        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 alchemyCommonCnt + 1 in alchemyCustomizedDict:
-                    resultCnt = alchemyCustomizedDict[alchemyCommonCnt + 1][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)
             notNotifyItemIDList = IpyGameDataPY.GetFuncEvalCfg("AlchemyNotify", 3)
             if alchemyItemID not in notNotifyItemIDList and (alchemyItemID in needNotifyItemIDList or makeItemData.GetItemColor() >= notifyColor):
                 PlayerControl.WorldNotify(0, "AchemyGreatSuccess", [curPlayer.GetPlayerName(), 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 alchemType == DefStoveType1:
-            maxCnt = max(alchemyCustomizedDict)
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyCommonCnt, min(alchemyCommonCnt + 1, maxCnt))
-        
-        GameWorld.DebugLog('炼丹结果 alchemyItemID=%s,successRate=%s,isSuccess=%s,resultCnt=%s' % (alchemyItemID, successRate, isSuccess, resultCnt), playerID)
+        if alchemyID in alchemyCustomizedDict:
+            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)
-    return 
+    
+    
+        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
 
 
 def AddRefineExp(curPlayer, addExp, alchemyLV):
     #增加炼丹炉经验
     if addExp <= 0:
         return
-    
+
     alchemyExp = min(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyExp) + addExp, ShareDefine.Def_UpperLimit_DWord)
     GameWorld.DebugLog("增加炼丹经验: alchemyLV=%s,addExp=%s,alchemyExp=%s" % (alchemyLV, addExp, alchemyExp), curPlayer.GetPlayerID())
-    
+
     isLVUp = False
     stoveIpyData = IpyGameDataPY.GetIpyGameDataNotLog("RefineStove", alchemyLV)
     while stoveIpyData and stoveIpyData.GetUpNeedExp() and alchemyExp >= stoveIpyData.GetUpNeedExp():
@@ -249,7 +268,7 @@
         if not stoveIpyData:
             GameWorld.DebugLog("没有下一级数据了,已满级!不可升级!", curPlayer.GetPlayerID())
             break
-        
+
         alchemyExp -= needExp
         alchemyLV += 1
         GameWorld.DebugLog("    炼丹升级: alchemyLV=%s,alchemyExp=%s" % (alchemyLV, alchemyExp), curPlayer.GetPlayerID())
@@ -258,7 +277,7 @@
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyExp, alchemyExp)
     if not isLVUp:
         return False
-    
+
     GameWorld.DebugLog("升级后剩余经验: %s" % alchemyExp, curPlayer.GetPlayerID())
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyLV, alchemyLV)
     PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_AlchemyLV, alchemyLV)
@@ -285,11 +304,12 @@
                 syncItemIDList.append(alchemyID)
     elif alchemyID and GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_AlchemyLearnState, alchemyID):
         syncItemIDList = [alchemyID]
-    
+
     for alchemyID in syncItemIDList:
         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)
@@ -325,13 +345,13 @@
     if prayCnt >= limitCnt:
         GameWorld.DebugLog('今日祈福丹药次数已满!prayCnt=%s' % prayCnt)
         return
-    packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, 1) 
+    packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, 1)
     if not packSpace:
         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
         return
-    
+
     alchemyItemList = IpyGameDataPY.GetFuncEvalCfg('GodAlchemy')
-    
+
     newItemInfoList = []
     for itemInfo in alchemyItemList:
         itemID = itemInfo[1]
@@ -345,17 +365,17 @@
     if not newItemInfoList:
         GameWorld.DebugLog('祈福丹药,没有丹药可产出!!')
         return
-    
+
     makeItemInfo = GameWorld.GetResultByWeightList(newItemInfoList)
     if not makeItemInfo:
         GameWorld.DebugLog("祈福丹药, 结果错误!")
         return
-    
+
     makeItemID, itemCount = makeItemInfo
     makeItemData = GameWorld.GetGameData().GetItemByTypeID(makeItemID)
     if not makeItemData:
         return
-    
+
     costMoney = IpyGameDataPY.GetFuncCfg('GodAlchemy', 2)
     if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costMoney, ChConfig.Def_Cost_AlchemyPray):
         return
@@ -363,14 +383,14 @@
     ItemControler.GivePlayerItem(curPlayer, makeItemID, itemCount, 0, [IPY_GameWorld.rptItem],
                                  event=[ChConfig.ItemGive_Refine, False, {}])
     #GameWorld.DebugLog('makeItemID=%s,newItemInfoList=%s'%(makeItemID, newItemInfoList))
-    
+
     #紫色及以上全服广播
     notifyColor = IpyGameDataPY.GetFuncCfg("AlchemyNotify", 1)
     needNotifyItemIDList = IpyGameDataPY.GetFuncEvalCfg("AlchemyNotify", 2)
     notNotifyItemIDList = IpyGameDataPY.GetFuncEvalCfg("AlchemyNotify", 3)
     if makeItemID not in notNotifyItemIDList and (makeItemID in needNotifyItemIDList or makeItemData.GetItemColor() >= notifyColor):
         PlayerControl.WorldNotify(0, "BlastfurnaceBlessing", [curPlayer.GetPlayerName(), makeItemID])
-        
+
     #更新次数
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyPrayCnt, prayCnt + 1)
     Sycn_AlchemyPrayMsg(curPlayer, makeItemID)

--
Gitblit v1.8.0