10054 【后端】任务系统(增加任务类型支持 6~16;优化修改任务值配置时上线进行修正进度值或任务状态;)
13个文件已修改
304 ■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCutTree.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMineArea.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py 200 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -6193,7 +6193,18 @@
TaskType_EquipDecompose, # 分解装备x次 3
TaskType_FBPass, # 副本过关到xxx 4
TaskType_Arena, # 挑战竞技场x次 5
) = range(1, 1 + 5)
TaskType_EquipColorItem, # 穿戴X品质装备x件 6
TaskType_TreeLV, # 仙树达到X级 7
TaskType_RealmLV, # 境界达到X级 8
TaskType_MineItemSelf, # 采集自己福地物品x次 9
TaskType_MineWorkerCnt, # 拥有x只福地老鼠 10
TaskType_MineItemRob, # 采集他人福地物品x次 11
TaskType_FBChallenge, # 副本xxx挑战x次 12
TaskType_CreateOrJoinFamily, # 创建或申请加入仙盟 13
TaskType_HorseUp, # 坐骑升级x次 14
TaskType_RefineItem, # 炼丹x次 15
TaskType_FairyDomain, # 缥缈仙域x次 16
) = range(1, 1 + 16)
# 任务分组
TaskGroupList = (
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py
@@ -26,14 +26,15 @@
#  @param playerList 参数列表 [ missionID]
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer, playerList):
def OnExec(curPlayer, paramList):
    
    if len(playerList) == 0:
    if len(paramList) == 0:
        GameWorld.DebugAnswer(curPlayer, "重置主线: Task 0")
        GameWorld.DebugAnswer(curPlayer, "输出任务: Task 1")
        GameWorld.DebugAnswer(curPlayer, "设置任务: Task 任务ID 进度")
        return
    
    taskID = playerList[0]
    taskID = paramList[0]
    if not taskID:
        taskGroup = ChConfig.TaskGroup_Main
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskIDLast % taskGroup, 0)
@@ -43,7 +44,11 @@
        PlayerTask.__giveNewTask(curPlayer, taskGroup)
        return
    
    taskValue = playerList[1] if len(playerList) > 1 else 0
    if len(paramList) == 1 and paramList[0] == 1:
        __ShowTask(curPlayer)
        return
    taskValue = paramList[1] if len(paramList) > 1 else 0
    ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID)
    if not ipyData:
        GameWorld.DebugAnswer(curPlayer, "该任务ID不存在:%s" % taskID)
@@ -59,3 +64,23 @@
    GameWorld.DebugAnswer(curPlayer, "设置任务ID:%s  进度:%s/%s" % (taskID, curValue, needValue))
    return
def __ShowTask(curPlayer):
    taskCount = 0
    for taskGroup in ChConfig.TaskGroupList:
        taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup)
        if not taskID:
            continue
        ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID)
        if not ipyData:
            continue
        curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup)
        curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup)
        needValue = ipyData.GetNeedValue()
        GameWorld.DebugAnswer(curPlayer, "任务ID:%s 进度:%s/%s 状态:%s" % (taskID, curValue, needValue, curState))
        taskCount += 1
    if not taskCount:
        GameWorld.DebugAnswer(curPlayer, "当前没有任务!")
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
@@ -333,6 +333,35 @@
        
    return
def GetPlayerEquipItemCount(curPlayer, classLV, itemColor, includeHigh=True):
    ## 获取玩家穿戴的装备数量
    haveCnt = 0
    classlVList = [classLV] if classLV else range(1, IpyGameDataPY.GetFuncCfg('EquipMaxClasslv')+1)
    equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
    for classLV in classlVList:
        ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'ClassLV':classLV}, True, False)
        if not ipyDataList:
            continue
        for ipyData in ipyDataList:
            gridIndex = ipyData.GetGridIndex()
            curEquip = equipPack.GetAt(gridIndex)
            if not ItemCommon.CheckItemCanUse(curEquip):
                continue
            if itemColor != None:
                if includeHigh:
                    if curEquip.GetItemColor() < itemColor:
                        continue
                else:
                    if curEquip.GetItemColor() != itemColor:
                        continue
            # 可扩展套装
            haveCnt += 1
    return haveCnt
## 刷新所有装备对人物属性的改变
#  @param self 类实例
#  @return 返回值无意义
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -37,6 +37,7 @@
import DataRecordPack
import PlayerGubao
import EventShell
import PlayerTask
import PlayerVip
import ChEquip
@@ -830,6 +831,7 @@
            dataDict = {'dotype':'EquipItem', 'desItemID':desItemID, 'desUserData':desUserData,'srcItemID':srcItemID,'srcUserData':srcUserData}
            DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_EquipChange, dataDict)
            self.__UpdEquipOrangeCount(befIsOrangeEquip, aftIsOrangeEquip)
            PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_EquipColorItem)
            
        self.RefreshStartEquipCount()
        return equipPlace if result else -1
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -4316,7 +4316,7 @@
            aftBaseCON = curPlayer.GetBaseCON()
            if aftLV > befLV:
                curPlayer.SetLV(aftLV, False) # 这里不再通知GameServer
                PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_LV, aftLV)
                PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_LV)
                PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_HeroLV, aftLV)
                PlayerActivity.DoAddActivityByLV(curPlayer, befLV, aftLV)
                
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCutTree.py
@@ -333,6 +333,8 @@
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRefreshTime, 0)
    GameWorld.DebugLog("执行仙树升级! updTreeLV=%s" % updTreeLV, playerID)
    SyncTreeInfo(curPlayer)
    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_TreeLV)
    return
def SyncTreeInfo(curPlayer):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py
@@ -32,6 +32,7 @@
import PlayerNewFairyCeremony
import ItemControler
import ItemCommon
import PlayerTask
import PyGameData
import EventShell
import FBCommon
@@ -360,6 +361,8 @@
#            GameWorld.Log('缥缈仙域事件状态设置错误,fdeventID=%s, state=%s, curState=%s' % (fdeventID, state, curState))
#            return
        EventShell.EventRespons_FairyDomain(curPlayer, ipyData.GetEventType())
        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FairyDomain, 1)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdeventID, state)
    NotifyVisitFairyDomainInfo(curPlayer, [fdeventID], 0)
    return True
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -42,6 +42,7 @@
import GameFuncComm
import PlayerTJG
import IpyGameDataPY
import PlayerTask
import cPickle
import time
@@ -140,7 +141,10 @@
        #刚进家族并为族长,触发建家族事件
        if curPlayer.GetFamilyMemberLV() == IPY_GameWorld.fmlLeader:
            EventShell.EventResponse_OnCreateFamily(curPlayer)
            PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_CreateOrJoinFamily)
        else:
            PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_CreateOrJoinFamily, 1)
        #进入家族触发事件
        __OnEnterFamily(curPlayer, tick)
        
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -36,6 +36,7 @@
import IpyGameDataPY
import CrossPlayerData
import PlayerSuccess
import PlayerTask
import PlayerPet
import time
@@ -634,6 +635,7 @@
    
    # 升阶
    EventShell.EventRespons_HorseUp(curPlayer) # 改为使用就算
    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HorseUp, 1)
    if updClassLV > horseLV:
        EventShell.EventRespons_HorseLV(curPlayer, updClassLV)
        # 玩家马匹进阶
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMineArea.py
@@ -24,6 +24,7 @@
import ItemControler
import ItemCommon
import GameWorld
import PlayerTask
# 聚宝盆默认最大进度
MineTreasureProgressMax = 100
@@ -159,6 +160,8 @@
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineWorkerCount, updEmployCount)
    SyncPlayerMineAreaInfo(curPlayer)
    GameWorld.DebugLog("福地雇佣工人! costItemID=%s,costItemCount=%s,updEmployCount=%s" % (costItemID, costItemCount, updEmployCount), playerID)
    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_MineWorkerCnt)
    return
def SendToGameServer_MineArea(curPlayer, msgType, dataMsg=""):
@@ -206,6 +209,9 @@
        
    if robCount:
        OnAddMineTreasureProgress(curPlayer, robCount, False)
        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_MineItemRob, 1)
    else:
        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_MineItemSelf, 1)
        
    SyncPlayerMineAreaInfo(curPlayer)
    
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
@@ -33,6 +33,7 @@
import EventShell
import DataRecordPack
import SkillCommon
import PlayerTask
import time
#------------------------------------------------------------------------------
@@ -385,6 +386,7 @@
    # 记录开服活动
    #OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_RealmLV, nextRealmLv)
    EventShell.EventRespons_RealmUp(curPlayer, nextRealmLv)
    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_RealmLV)
    #流向
    DataRecordPack.DR_RealmLVUp(curPlayer, nextRealmLv)
    return True
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
@@ -33,6 +33,7 @@
import PlayerNewFairyCeremony
import PlayerActGarbageSorting
import PlayerActLogin
import PlayerTask
import PlayerVip
import copy
@@ -146,7 +147,8 @@
        #日常任务
        costItemCnt = sum(needMaterialDict.values())
        #PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_RefineStove, costItemCnt)
        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_RefineItem, refineTimes)
    elif doType == 2:
        if curAlchemyItemID != alchemyItemID:
            GameWorld.DebugLog('停止丹药ID错误 curAlchemyItemID=%s' % curAlchemyItemID)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py
@@ -25,10 +25,77 @@
import GameFuncComm
import ShareDefine
import ChConfig
import ChEquip
def GetTaskIDList(taskGroup):
    ## 获取某个任务分组所有任务ID列表
    key = "TaskIDListDict"
    taskIDListDict = IpyGameDataPY.GetConfigEx(key)
    if not taskIDListDict:
        taskIDListDict = {}
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in xrange(ipyDataMgr.GetTaskCount()):
            ipyData = ipyDataMgr.GetTaskByIndex(index)
            taskGroup = ipyData.GetTaskGroup()
            taskID = ipyData.GetTaskID()
            if taskGroup not in taskIDListDict:
                taskIDListDict[taskGroup] = []
            taskIDList = taskIDListDict[taskGroup]
            if taskID not in taskIDList:
                taskIDList.append(taskID)
        IpyGameDataPY.SetConfigEx(key, taskIDListDict)
        GameWorld.Log("任务ID列表: %s" % taskIDListDict)
    return taskIDListDict.get(taskGroup, [])
def OnPlayerLogin(curPlayer):
    __fixRefreshTask(curPlayer)
    if not __giveNewTask(curPlayer, ChConfig.TaskGroup_Main):
        SyncTaskInfo(curPlayer)
    return
def __fixRefreshTask(curPlayer):
    ## 纠正刷新任务值状态等,一般用于修改任务配置等,玩家登录检查
    playerID = curPlayer.GetPlayerID()
    fixGroupList = []
    for taskGroup in ChConfig.TaskGroupList:
        taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup)
        if not taskID:
            continue
        ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID)
        if not ipyData:
            continue
        curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup)
        curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup)
        if curState == ChConfig.TaskState_Finish:
            continue
        needFix = False
        needValue = ipyData.GetNeedValue()
        taskValue = __GetTaskValue(curPlayer, ipyData)
        # 可能修改条件配置后,导致任务值不一致,需要修正
        if taskValue and taskValue != curValue:
            GameWorld.Log("需要修正任务进度: taskID=%s,curValue=%s,taskValue=%s" % (taskID, curValue, taskValue), playerID)
            curValue = taskValue
            needFix = True
        # 可能修改降低了所需任务值,需要修正下完成状态
        if curValue >= needValue and curState != ChConfig.TaskState_Finish:
            GameWorld.Log("需要修正任务状态: taskID=%s,curValue=%s,needValue=%s,curState=%s" % (taskID, curValue, needValue, curState), playerID)
            needFix = True
        if not needFix:
            continue
        SetTaskValue(curPlayer, ipyData, taskValue, False)
        fixGroupList.append(taskGroup)
    if fixGroupList:
        SyncTaskInfo(curPlayer, fixGroupList)
    return
def __giveNewTask(curPlayer, taskGroup=ChConfig.TaskGroup_Main):
@@ -51,81 +118,79 @@
            return
        lastIndex = taskIDList.index(lastTaskID)
        if lastIndex >= len(taskIDList) - 1:
            GameWorld.DebugLog("已经完成了所有任务: lastTaskID=%s,lastTaskID=%s" % (lastTaskID, lastTaskID), playerID)
            GameWorld.DebugLog("已经完成了所有任务: taskGroup=%s,lastTaskID=%s" % (taskGroup, lastTaskID), playerID)
            return
        newTaskID = taskIDList[lastIndex + 1]
        GameWorld.DebugLog("给下一个任务: lastTaskID=%s,newTaskID=%s,lastTaskID=%s" % (lastTaskID, newTaskID, lastTaskID), playerID)
        GameWorld.DebugLog("给下一个任务: taskGroup=%s,newTaskID=%s,lastTaskID=%s" % (taskGroup, newTaskID, lastTaskID), playerID)
        
    if not newTaskID:
        return
    ipyData = IpyGameDataPY.GetIpyGameData("Task", newTaskID)
    if not ipyData:
        return
    taskType = ipyData.GetTaskType()
    conds = ipyData.GetTaskConds()
    taskValue = 0
    taskValue = __GetTaskValue(curPlayer, ipyData)
    
    if taskType == ChConfig.TaskType_LV:
        taskValue = curPlayer.GetLV()
    elif taskType == ChConfig.TaskType_FBPass:
        if len(conds) != 2:
            return
        mapID, lineID = conds
        grade = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID])
        taskValue = 1 if grade > 0 else 0
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskID % taskGroup, newTaskID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue % taskGroup, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskState % taskGroup, ChConfig.TaskState_Doing)
    GameWorld.DebugLog("接到新任务: taskGroup=%s,newTaskID=%s" % (taskGroup, newTaskID), playerID)
    return SetTaskValue(curPlayer, ipyData, taskValue)
def GetTaskIDList(taskGroup):
    ## 获取某个任务分组所有任务ID列表
    key = "TaskIDListDict"
    taskIDListDict = IpyGameDataPY.GetConfigEx(key)
    if not taskIDListDict:
        taskIDListDict = {}
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in xrange(ipyDataMgr.GetTaskCount()):
            ipyData = ipyDataMgr.GetTaskByIndex(index)
            taskGroup = ipyData.GetTaskGroup()
            taskID = ipyData.GetTaskID()
            if taskGroup not in taskIDListDict:
                taskIDListDict[taskGroup] = []
            taskIDList = taskIDListDict[taskGroup]
            if taskID not in taskIDList:
                taskIDList.append(taskID)
        IpyGameDataPY.SetConfigEx(key, taskIDListDict)
        GameWorld.Log("任务ID列表: %s" % taskIDListDict)
    return taskIDListDict.get(taskGroup, [])
def __GetTaskValue(curPlayer, ipyData):
    ## 获取任务类型当前进度值,一般直接 UpdTaskValue 的类型会用到
    taskValue = 0 # 默认0
    taskType = ipyData.GetTaskType()
    conds = ipyData.GetTaskConds()
    if taskType == ChConfig.TaskType_LV:
        taskValue = curPlayer.GetLV()
    elif taskType == ChConfig.TaskType_FBPass:
        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
    elif taskType == ChConfig.TaskType_EquipColorItem:
        if not conds:
            return 0
        itemColor = conds[0]
        taskValue = ChEquip.GetPlayerEquipItemCount(curPlayer, None, itemColor)
    elif taskType == ChConfig.TaskType_TreeLV:
        taskValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV)
    elif taskType == ChConfig.TaskType_RealmLV:
        taskValue = curPlayer.GetOfficialRank()
    elif taskType == ChConfig.TaskType_MineWorkerCnt:
        taskValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerCount)
    elif taskType == ChConfig.TaskType_CreateOrJoinFamily:
        taskValue = 1 if curPlayer.GetFamilyID() else 0
    return taskValue
def UpdTaskValue(curPlayer, taskType, setValue, conds=None):
def UpdTaskValue(curPlayer, taskType):
    ## 更新任务进度
    for taskGroup in ChConfig.TaskGroupList:
        taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup)
        if not taskID:
            continue
        ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID)
        ipyData = __GetDoingTaskIpyData(curPlayer, taskGroup, taskType)
        if not ipyData:
            continue
        if ipyData.GetTaskType() != taskType:
        curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup)
        taskValue = __GetTaskValue(curPlayer, ipyData)
        if taskValue <= curValue:
            # 有增长才更新
            continue
        if not __CheckTaskCondition(ipyData, conds):
            continue
        SetTaskValue(curPlayer, ipyData, setValue)
        SetTaskValue(curPlayer, ipyData, taskValue)
    return
def AddTaskValue(curPlayer, taskType, addValue=1, conds=None):
    ## 增加任务进度
    for taskGroup in ChConfig.TaskGroupList:
        taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup)
        if not taskID:
            continue
        ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID)
        ipyData = __GetDoingTaskIpyData(curPlayer, taskGroup, taskType)
        if not ipyData:
            continue
        if ipyData.GetTaskType() != taskType:
            continue
        if not __CheckTaskCondition(ipyData, conds):
            continue
@@ -133,21 +198,46 @@
        SetTaskValue(curPlayer, ipyData, curValue)
    return
def __GetDoingTaskIpyData(curPlayer, taskGroup, taskType):
    ## 获取正在进行中的任务ipyData
    taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup)
    if not taskID:
        return
    curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup)
    if curState == ChConfig.TaskState_Finish:
        return
    ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID)
    if not ipyData:
        return
    if ipyData.GetTaskType() != taskType:
        return
    return ipyData
def __CheckTaskCondition(ipyData, conds=None):
    ## 检查任务条件是否满足
    taskType = ipyData.GetTaskType()
    # 副本xxx过关
    if taskType == ChConfig.TaskType_FBPass:
        taskConds = ipyData.GetTaskConds()
        if not conds or len(conds) != 2 or len(taskConds) != 2:
        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:
        taskConds = ipyData.GetTaskConds()
        if not conds or len(conds) != len(taskConds) or len(conds) < 1:
            return
        if conds[0] != taskConds[0]:
            return
    return True
def SetTaskValue(curPlayer, taskIpyData, value=0):
def SetTaskValue(curPlayer, taskIpyData, value=0, isNotify=True):
    ## 设置当前任务进度值,统一处理任务状态、触发额外逻辑等
    if not taskIpyData:
        return
@@ -168,7 +258,9 @@
    if value >= finishNeedValue:
        __OnTaskFinish(curPlayer, taskGroup, taskID, taskIpyData)
        
    SyncTaskInfo(curPlayer, taskGroup)
    if isNotify:
        SyncTaskInfo(curPlayer, [taskGroup])
    return True
def __OnTaskFinish(curPlayer, taskGroup, taskID, taskIpyData):
@@ -227,11 +319,11 @@
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
        
    if not __giveNewTask(curPlayer, taskGroup):
        SyncTaskInfo(curPlayer, taskGroup)
        SyncTaskInfo(curPlayer, [taskGroup])
    return
def SyncTaskInfo(curPlayer, taskGroup=None):
    syncGroupList = [taskGroup] if taskGroup != None else ChConfig.TaskGroupList
def SyncTaskInfo(curPlayer, taskGroupList=None):
    syncGroupList = taskGroupList if taskGroupList != None else ChConfig.TaskGroupList
    if not syncGroupList:
        return