10033 【后端】砍树(回合战斗副本支持任务类型4副本过关、类型12挑战副本;回合副本可重复挑战奖励及首通奖励支持;修复回合战斗NPC不存在时报错bug;)
7个文件已修改
87 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -23873,8 +23873,9 @@
    RecoverCnt = 0    #(WORD RecoverCnt)//找回次数
    ItemAddCnt = 0    #(WORD ItemAddCnt)//物品增加次数
    PassGradeCnt = 0    #(BYTE PassGradeCnt)//星级值对应个数, 每个key存9个lineID
    PassGrade = list()    #(vector<DWORD> PassGrade)//副本线路对应星级值列表
    PassGrade = list()    #(vector<DWORD> PassGrade)//副本线路对应星级值列表,一般仅线路有星级设定的才有
    EnterCntTotal = 0    #(DWORD EnterCntTotal)//累计进入次数
    PassLineID = 0    #(DWORD PassLineID)//已过关到的lineID
    data = None
    def __init__(self):
@@ -23892,6 +23893,7 @@
            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
            self.PassGrade.append(value)
        self.EnterCntTotal,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.PassLineID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        return _pos
    def Clear(self):
@@ -23902,6 +23904,7 @@
        self.PassGradeCnt = 0
        self.PassGrade = list()
        self.EnterCntTotal = 0
        self.PassLineID = 0
        return
    def GetLength(self):
@@ -23912,6 +23915,7 @@
        length += 2
        length += 1
        length += 4 * self.PassGradeCnt
        length += 4
        length += 4
        return length
@@ -23926,6 +23930,7 @@
        for i in range(self.PassGradeCnt):
            data = CommFunc.WriteDWORD(data, self.PassGrade[i])
        data = CommFunc.WriteDWORD(data, self.EnterCntTotal)
        data = CommFunc.WriteDWORD(data, self.PassLineID)
        return data
    def OutputString(self):
@@ -23936,7 +23941,8 @@
                                ItemAddCnt:%d,
                                PassGradeCnt:%d,
                                PassGrade:%s,
                                EnterCntTotal:%d
                                EnterCntTotal:%d,
                                PassLineID:%d
                                '''\
                                %(
                                self.FBID,
@@ -23945,7 +23951,8 @@
                                self.ItemAddCnt,
                                self.PassGradeCnt,
                                "...",
                                self.EnterCntTotal
                                self.EnterCntTotal,
                                self.PassLineID
                                )
        return DumpString
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -36,6 +36,8 @@
import ItemControler
import PassiveBuffEffMng
import FBLogic
import ShareDefine
import PlayerTask
# 回合战斗流程状态
(
@@ -85,6 +87,12 @@
    if tagPlayerID:
        if playerID == tagPlayerID:
            GameWorld.DebugLog("不能打自己!", playerID)
            return
    fbIpyData = FBCommon.GetFBIpyData(mapID)
    fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, funcLineID)
    if fbIpyData or fbLineIpyData:
        if FBCommon.CheckCanEnterFBComm(curPlayer, mapID, funcLineID, fbIpyData, fbLineIpyData) != ShareDefine.EntFBAskRet_OK:
            return
        
    if not FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList):
@@ -180,15 +188,24 @@
    if overRet != None:
        needSendGameServer, awardItemList, awardWay = overRet
        
    if isWin and ipyData:
    isFirstPass = None
    if isWin and ipyData:
        passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
        if funcLineID == passLineID + 1:
            isFirstPass = True
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID)
            FBCommon.Sync_FBPlayerFBInfoData(curPlayer, mapID)
        else:
            isFirstPass = False
        if awardWay == 1 and not awardItemList:
            # 山寨测试先默认都是首次奖励,正式后需删除
            awardItemList = ipyData.GetAwardItemListFirst()
            awardItemList = ipyData.GetAwardItemListFirst() if isFirstPass else ipyData.GetAwardItemList()
            
    if awardItemList == None:
        awardItemList = []
        
    GameWorld.DebugLog("奖励物品: %s" % awardItemList)
    GameWorld.DebugLog("奖励物品: %s, isFirstPass=%s" % (awardItemList, isFirstPass))
    if awardWay == 1 and awardItemList:
        ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TurnFight", False, {"mapID":mapID, "funcLineID":funcLineID}])
        
@@ -198,6 +215,11 @@
    overMsg = {"isWin":isWin, "itemInfo":FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(1, 0)}
    playbackID and overMsg.update({"playbackID":playbackID})
    SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Award, turnNum, turnMax, overMsg)
    # 其他...
    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBChallenge, 1, [mapID])
    if isWin:
        PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBPass)
    return
def GetPlayerFactionInfoByCache(playerID):
@@ -238,9 +260,12 @@
    factionA, factionB, mainRolePlace = 1, 2, 1
    objRetA = __SummonFactionObjs(factionA, mainRolePlace, factionInfoA, sightLevel, posX, posY)
    objRetB = __SummonFactionObjs(factionB, mainRolePlace, factionInfoB, sightLevel, posX, posY)
    objA, petObjListA, factionSyncInfoA = objRetA if objRetA else (None, [])
    objB, petObjListB, factionSyncInfoB = objRetB if objRetB else (None, [])
    objA, petObjListA, factionSyncInfoA = objRetA if objRetA else (None, [], {})
    objB, petObjListB, factionSyncInfoB = objRetB if objRetB else (None, [], {})
    if not objA or not objB:
        fightObjList = petObjListA + [objA] + petObjListB + [objB]
        for gameObj in fightObjList:
            TurnFightObjOverReset(gameObj, tick)
        return
    playerIDA = objA.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) # 可能为0,非玩家镜像时为0
    playerIDB = objB.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) # 可能为0,非玩家镜像时为0
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3584,6 +3584,7 @@
Def_Player_Dict_ReqFBMissionType = "ReqFBMissionType" # 请求进入副本的任务类型
Def_Player_Dict_PlayerFBStar_MapId = "FBStar_%s_%s"  # 副本星级星级信息, 参数为[mapID, key编号], 按位存储每个lineID对应的星级
Def_Player_Dict_CustomMapStep = "CustomMapStep_%s_%s"  # 前端自定义场景阶段, 参数(mapID, lineID),对应 CustomMapStep_Fight ...
Def_Player_Dict_FBPassLineID = "FBPassLineID_%s"  # 副本已过关到的lineID, 参数为副本ID
Def_Player_Dict_EnterFbCntTotal = "EnterFbCntTotal_%s"  # 进入副本总累计次数, 参数为副本ID
Def_Player_Dict_EnterFbCntDay = "EnterFbCntDay_%s"  # 今日进入副本次数, 参数为副本ID
Def_Player_Dict_BuyFbCntDay = "BuyFbCntDay_%s" # 今日购买副本进入次数, 参数为副本ID
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -23873,8 +23873,9 @@
    RecoverCnt = 0    #(WORD RecoverCnt)//找回次数
    ItemAddCnt = 0    #(WORD ItemAddCnt)//物品增加次数
    PassGradeCnt = 0    #(BYTE PassGradeCnt)//星级值对应个数, 每个key存9个lineID
    PassGrade = list()    #(vector<DWORD> PassGrade)//副本线路对应星级值列表
    PassGrade = list()    #(vector<DWORD> PassGrade)//副本线路对应星级值列表,一般仅线路有星级设定的才有
    EnterCntTotal = 0    #(DWORD EnterCntTotal)//累计进入次数
    PassLineID = 0    #(DWORD PassLineID)//已过关到的lineID
    data = None
    def __init__(self):
@@ -23892,6 +23893,7 @@
            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
            self.PassGrade.append(value)
        self.EnterCntTotal,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.PassLineID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        return _pos
    def Clear(self):
@@ -23902,6 +23904,7 @@
        self.PassGradeCnt = 0
        self.PassGrade = list()
        self.EnterCntTotal = 0
        self.PassLineID = 0
        return
    def GetLength(self):
@@ -23912,6 +23915,7 @@
        length += 2
        length += 1
        length += 4 * self.PassGradeCnt
        length += 4
        length += 4
        return length
@@ -23926,6 +23930,7 @@
        for i in range(self.PassGradeCnt):
            data = CommFunc.WriteDWORD(data, self.PassGrade[i])
        data = CommFunc.WriteDWORD(data, self.EnterCntTotal)
        data = CommFunc.WriteDWORD(data, self.PassLineID)
        return data
    def OutputString(self):
@@ -23936,7 +23941,8 @@
                                ItemAddCnt:%d,
                                PassGradeCnt:%d,
                                PassGrade:%s,
                                EnterCntTotal:%d
                                EnterCntTotal:%d,
                                PassLineID:%d
                                '''\
                                %(
                                self.FBID,
@@ -23945,7 +23951,8 @@
                                self.ItemAddCnt,
                                self.PassGradeCnt,
                                "...",
                                self.EnterCntTotal
                                self.EnterCntTotal,
                                self.PassLineID
                                )
        return DumpString
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py
@@ -30,8 +30,8 @@
    
    if len(paramList) == 0:
        GameWorld.DebugAnswer(curPlayer, "重置主线: Task 0")
        GameWorld.DebugAnswer(curPlayer, "输出任务: Task 1")
        GameWorld.DebugAnswer(curPlayer, "设置任务: Task 任务ID 进度")
        __ShowTask(curPlayer)
        return
    
    taskID = paramList[0]
@@ -42,10 +42,6 @@
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue % taskGroup, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskState % taskGroup, 0)
        PlayerTask.__giveNewTask(curPlayer, taskGroup)
        return
    if len(paramList) == 1 and paramList[0] == 1:
        __ShowTask(curPlayer)
        return
    
    taskValue = paramList[1] if len(paramList) > 1 else 0
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -122,6 +122,8 @@
    if not fbLineIpyData and isDefaultLine:
        #GameWorld.DebugLog("没有指定功能线路的则默认取0,再没有的话就是不需要的mapID=%s, lineID=%s" % (mapID, lineID))
        fbLineIpyData = IpyGameDataPY.GetIpyGameDataNotLog("FBLine", mapID, 0)
        if not fbLineIpyData:
            fbLineIpyData = IpyGameDataPY.GetIpyGameDataNotLog("FBLine", mapID, 1) # 有些从1开始,如爬塔类
    return fbLineIpyData
def GetFBLineEnterPosInfo(mapID, lineID, fbLineIpyData=None):
@@ -2425,6 +2427,7 @@
        mapInfo.EnterCntTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntTotal % mID)
        mapInfo.RecoverCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RecoverFbCnt % mID)
        mapInfo.ItemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ItemAddFbCnt % mID)
        mapInfo.PassLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mID)
        
        for keyNum in range(ChConfig.Def_FBStar_MaxKeyCnt):
            gradeValue = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PlayerFBStar_MapId % (mID, keyNum))
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py
@@ -149,8 +149,8 @@
        if len(conds) != 2:
            return 0
        mapID, lineID = conds
        grade = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID])
        taskValue = 1 if grade > 0 else 0
        passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
        taskValue = 1 if passLineID >= lineID else 0
        
    elif taskType == ChConfig.TaskType_EquipColorItem:
        if not conds:
@@ -217,18 +217,8 @@
    ## 检查任务条件是否满足
    taskType = ipyData.GetTaskType()
    
    # 副本xxx过关
    if taskType == ChConfig.TaskType_FBPass:
        taskConds = ipyData.GetTaskConds()
        if not conds or len(conds) != len(taskConds) or len(conds) < 2:
            return
        if conds[0] != taskConds[0]:
            return
        if conds[1] < taskConds[1]:
            return
    # 副本xxx挑战
    elif taskType == ChConfig.TaskType_FBChallenge:
    if taskType == ChConfig.TaskType_FBChallenge:
        taskConds = ipyData.GetTaskConds()
        if not conds or len(conds) != len(taskConds) or len(conds) < 1:
            return