xdh
2019-06-03 5c27c43c293460a98a1374504c07533ddf17d24f
7067 【2.0】【后端】丹炉新增批量炼丹
6个文件已修改
96 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py 71 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -10304,6 +10304,7 @@
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("AlchemyID", c_int),    # 丹药ID
                  ("AlchemyTimes", c_ushort),    # 丹药次数
                  ("DoType", c_ubyte),    # 0-学习 1-开始炼丹 2-停止炼丹 3-开炉取丹
                  ]
@@ -10322,6 +10323,7 @@
        self.Cmd = 0xA5
        self.SubCmd = 0x76
        self.AlchemyID = 0
        self.AlchemyTimes = 0
        self.DoType = 0
        return
@@ -10336,12 +10338,14 @@
                                Cmd:%s,
                                SubCmd:%s,
                                AlchemyID:%d,
                                AlchemyTimes:%d,
                                DoType:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.AlchemyID,
                                self.AlchemyTimes,
                                self.DoType
                                )
        return DumpString
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -16465,6 +16465,7 @@
    _fields_ = [
                  ("AlchemyID", c_int),    # 丹 ID
                  ("StartTime", c_int),    # 开始炼的时间
                  ("AlchemyTimes", c_ushort),    # 炼的次数
                  ]
    def __init__(self):
@@ -16479,6 +16480,7 @@
    def Clear(self):
        self.AlchemyID = 0
        self.StartTime = 0
        self.AlchemyTimes = 0
        return
    def GetLength(self):
@@ -16490,11 +16492,13 @@
    def OutputString(self):
        DumpString = '''// A3 BF 通知客户端炼丹炉信息 //tagMCPlayerStoveMsg:
                                AlchemyID:%d,
                                StartTime:%d
                                StartTime:%d,
                                AlchemyTimes:%d
                                '''\
                                %(
                                self.AlchemyID,
                                self.StartTime
                                self.StartTime,
                                self.AlchemyTimes
                                )
        return DumpString
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3891,6 +3891,7 @@
Def_PDict_AlchemyLearnState = "AlchemyLearnState%s" #丹方是否已学习 
Def_PDict_AlchemyItemID = "AlchemyItemID_%s" #炼丹中的丹药ID  参数丹药类型
Def_PDict_AlchemyStartTime = "AlchemyStartTime_%s" #炼丹开始时间    参数丹药ID
Def_PDict_AlchemyTimes = "AlchemyTimes_%s" #本次炼丹几次    参数丹药ID
Def_PDict_AlchemyCnt = "AlchemyCnt%s" #丹药炼丹次数
Def_PDict_AlchemyPrayCnt = "AlchemyPrayCnt" #炼丹祈福次数
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -10304,6 +10304,7 @@
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("AlchemyID", c_int),    # 丹药ID
                  ("AlchemyTimes", c_ushort),    # 丹药次数
                  ("DoType", c_ubyte),    # 0-学习 1-开始炼丹 2-停止炼丹 3-开炉取丹
                  ]
@@ -10322,6 +10323,7 @@
        self.Cmd = 0xA5
        self.SubCmd = 0x76
        self.AlchemyID = 0
        self.AlchemyTimes = 0
        self.DoType = 0
        return
@@ -10336,12 +10338,14 @@
                                Cmd:%s,
                                SubCmd:%s,
                                AlchemyID:%d,
                                AlchemyTimes:%d,
                                DoType:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.AlchemyID,
                                self.AlchemyTimes,
                                self.DoType
                                )
        return DumpString
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -16465,6 +16465,7 @@
    _fields_ = [
                  ("AlchemyID", c_int),    # 丹 ID
                  ("StartTime", c_int),    # 开始炼的时间 
                  ("AlchemyTimes", c_ushort),    # 炼的次数
                  ]
    def __init__(self):
@@ -16479,6 +16480,7 @@
    def Clear(self):
        self.AlchemyID = 0
        self.StartTime = 0
        self.AlchemyTimes = 0
        return
    def GetLength(self):
@@ -16490,11 +16492,13 @@
    def OutputString(self):
        DumpString = '''// A3 BF 通知客户端炼丹炉信息 //tagMCPlayerStoveMsg:
                                AlchemyID:%d,
                                StartTime:%d
                                StartTime:%d,
                                AlchemyTimes:%d
                                '''\
                                %(
                                self.AlchemyID,
                                self.StartTime
                                self.StartTime,
                                self.AlchemyTimes
                                )
        return DumpString
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)
@@ -119,9 +119,11 @@
        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:
@@ -132,6 +134,7 @@
        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)
        #日常任务
@@ -149,33 +152,36 @@
        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 = [] #定制配置 [数量,成功率]
        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]
        # appointInfo = [] #定制配置 [数量,成功率]
        # 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]
        
        #成功率
        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:
            return
        isSuccess = GameWorld.CanHappen(successRate)
        # 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:
        #     return
        isSuccess = 1 #GameWorld.CanHappen(successRate)
        resultCnt = 0  #丹药数量 0代表失败
        if isSuccess:
            needSpace = 1
@@ -186,9 +192,6 @@
            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)
@@ -200,6 +203,7 @@
            makeItemData = GameWorld.GetGameData().GetItemByTypeID(alchemyItemID)
            if not makeItemData:
                return
            resultCnt *=refineTimes
            ItemControler.GivePlayerItem(curPlayer, alchemyItemID, resultCnt, 0, [IPY_GameWorld.rptItem],
                                     event=[ChConfig.ItemGive_Refine, False, {}])
            #紫色及以上全服广播
@@ -210,30 +214,32 @@
                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 alchemyID in alchemyCustomizedDict:
            GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_AlchemyCnt, alchemyID, min(alchemyCnt + 1, 9), False)
        # if alchemyID in alchemyCustomizedDict:
        #     GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_AlchemyCnt, alchemyID, min(alchemyCnt + refineTimes, 9), False)
        GameWorld.DebugLog('炼丹结果 alchemyItemID=%s,successRate=%s,isSuccess=%s,resultCnt=%s,appointInfo=%s' % (alchemyItemID, successRate, isSuccess, resultCnt, appointInfo), playerID)
        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 +301,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)