10054 【后端】任务系统(支持功能开启任务条件;支持任务分组如主线、支线等;)
8个文件已修改
479 ■■■■ 已修改文件
PySysDB/PySysDBPY.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 92 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 92 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -75,6 +75,7 @@
struct    tagTask
{
    WORD        _TaskID;    //任务ID
    BYTE        TaskGroup;    //任务组别 0-主线
    BYTE        TaskType;    //任务类型
    list        TaskConds;    //任务条件[...]
    DWORD        NeedValue;    //所需任务值
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -44660,19 +44660,17 @@
#------------------------------------------------------
# B1 10 当前任务信息 #tagMCTaskInfo
class  tagMCTaskInfo(Structure):
class  tagMCTask(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("TaskID", c_int),    # 任务ID
                  ("TaskGroup", c_ubyte),    # 任务组,0-主线
                  ("TaskID", c_int),    # 当前任务ID,可能为0,表示该分组暂时没有任务
                  ("CurValue", c_int),    # 当前进度值
                  ("State", c_ubyte),    # 任务状态 1-进行中 2-已完成
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xB1
        self.SubCmd = 0x10
        return
    def ReadData(self, stringData, _pos=0, _len=0):
@@ -44681,36 +44679,98 @@
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xB1
        self.SubCmd = 0x10
        self.TaskGroup = 0
        self.TaskID = 0
        self.CurValue = 0
        self.State = 0
        return
    def GetLength(self):
        return sizeof(tagMCTaskInfo)
        return sizeof(tagMCTask)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B1 10 当前任务信息 //tagMCTaskInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                TaskGroup:%d,
                                TaskID:%d,
                                CurValue:%d
                                CurValue:%d,
                                State:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.TaskGroup,
                                self.TaskID,
                                self.CurValue
                                self.CurValue,
                                self.State
                                )
        return DumpString
class  tagMCTaskInfo(Structure):
    Head = tagHead()
    TaskCount = 0    #(BYTE TaskCount)
    TaskList = list()    #(vector<tagMCTask> TaskList)
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xB1
        self.Head.SubCmd = 0x10
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.TaskCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.TaskCount):
            temTaskList = tagMCTask()
            _pos = temTaskList.ReadData(_lpData, _pos)
            self.TaskList.append(temTaskList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xB1
        self.Head.SubCmd = 0x10
        self.TaskCount = 0
        self.TaskList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.TaskCount):
            length += self.TaskList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.TaskCount)
        for i in range(self.TaskCount):
            data = CommFunc.WriteString(data, self.TaskList[i].GetLength(), self.TaskList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                TaskCount:%d,
                                TaskList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.TaskCount,
                                "..."
                                )
        return DumpString
m_NAtagMCTaskInfo=tagMCTaskInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTaskInfo.Cmd,m_NAtagMCTaskInfo.SubCmd))] = m_NAtagMCTaskInfo
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTaskInfo.Head.Cmd,m_NAtagMCTaskInfo.Head.SubCmd))] = m_NAtagMCTaskInfo
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4432,10 +4432,11 @@
Def_PDict_TreeLVUPRemainTime = "TreeLVUPRemainTime" # 仙树升级剩余时间,秒
Def_PDict_TreeLVUPRefreshTime = "TreeLVUPRefreshTime" # 仙树升级上次刷新时间戳
#任务-简化版任务,有且仅有一个进行中的任务
Def_PDict_TaskIDLast = "TaskIDLast" # 上一次完成的任务ID
Def_PDict_TaskID = "TaskID" # 当前进行中的任务ID
Def_PDict_TaskValue = "TaskValue" # 当前进行中的任务进度
#任务,每个任务组有且仅有一个进行中的任务
Def_PDict_TaskIDLast = "TaskIDLast_%s" # 上一次完成的任务ID,参数(任务组)
Def_PDict_TaskID = "TaskID_%s" # 当前进行中的任务ID,参数(任务组)
Def_PDict_TaskValue = "TaskValue_%s" # 当前进行中的任务进度,参数(任务组)
Def_PDict_TaskState = "TaskState_%s" # 当前进行中的任务状态 0-无;1-进行中;2-已完成,参数(任务组)
#福地
Def_PDict_MineWorkerCount = "MineWorkerCount" # 已雇佣工人数
@@ -6194,6 +6195,18 @@
TaskType_Arena, # 挑战竞技场x次 5
) = range(1, 1 + 5)
# 任务分组
TaskGroupList = (
TaskGroup_Main, # 主线 0
) = range(1)
# 任务状态
TaskStateList = (
TaskState_None, # 无 0
TaskState_Doing, # 进行中 1
TaskState_Finish, # 已完成 2
) = range(3)
# 充值点券处理类型
(
CoinType_Gold, # 直接充仙玉 0
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -44660,19 +44660,17 @@
#------------------------------------------------------
# B1 10 当前任务信息 #tagMCTaskInfo
class  tagMCTaskInfo(Structure):
class  tagMCTask(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("TaskID", c_int),    # 任务ID
                  ("TaskGroup", c_ubyte),    # 任务组,0-主线
                  ("TaskID", c_int),    # 当前任务ID,可能为0,表示该分组暂时没有任务
                  ("CurValue", c_int),    # 当前进度值
                  ("State", c_ubyte),    # 任务状态 1-进行中 2-已完成
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xB1
        self.SubCmd = 0x10
        return
    def ReadData(self, stringData, _pos=0, _len=0):
@@ -44681,36 +44679,98 @@
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xB1
        self.SubCmd = 0x10
        self.TaskGroup = 0
        self.TaskID = 0
        self.CurValue = 0
        self.State = 0
        return
    def GetLength(self):
        return sizeof(tagMCTaskInfo)
        return sizeof(tagMCTask)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B1 10 当前任务信息 //tagMCTaskInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                TaskGroup:%d,
                                TaskID:%d,
                                CurValue:%d
                                CurValue:%d,
                                State:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.TaskGroup,
                                self.TaskID,
                                self.CurValue
                                self.CurValue,
                                self.State
                                )
        return DumpString
class  tagMCTaskInfo(Structure):
    Head = tagHead()
    TaskCount = 0    #(BYTE TaskCount)
    TaskList = list()    #(vector<tagMCTask> TaskList)
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xB1
        self.Head.SubCmd = 0x10
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.TaskCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.TaskCount):
            temTaskList = tagMCTask()
            _pos = temTaskList.ReadData(_lpData, _pos)
            self.TaskList.append(temTaskList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xB1
        self.Head.SubCmd = 0x10
        self.TaskCount = 0
        self.TaskList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.TaskCount):
            length += self.TaskList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.TaskCount)
        for i in range(self.TaskCount):
            data = CommFunc.WriteString(data, self.TaskList[i].GetLength(), self.TaskList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                TaskCount:%d,
                                TaskList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.TaskCount,
                                "..."
                                )
        return DumpString
m_NAtagMCTaskInfo=tagMCTaskInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTaskInfo.Cmd,m_NAtagMCTaskInfo.SubCmd))] = m_NAtagMCTaskInfo
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTaskInfo.Head.Cmd,m_NAtagMCTaskInfo.Head.SubCmd))] = m_NAtagMCTaskInfo
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py
@@ -29,20 +29,33 @@
def OnExec(curPlayer, playerList):
    
    if len(playerList) == 0:
        GameWorld.DebugAnswer(curPlayer, "重置主线: Task 0")
        GameWorld.DebugAnswer(curPlayer, "设置任务: Task 任务ID 进度")
        return
    
    taskID = playerList[0]
    if not taskID:
        taskGroup = ChConfig.TaskGroup_Main
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskIDLast % taskGroup, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskID % taskGroup, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue % taskGroup, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskState % taskGroup, 0)
        PlayerTask.__giveNewTask(curPlayer, taskGroup)
        return
    taskValue = playerList[1] if len(playerList) > 1 else 0
    if taskID:
        ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID)
        if not ipyData:
            GameWorld.DebugAnswer(curPlayer, "该任务ID不存在:%s" % taskID)
            return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskID, taskID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue, taskValue)
    PlayerTask.SyncTaskInfo(curPlayer)
    GameWorld.DebugAnswer(curPlayer, "设置任务ID:%s  进度:%s" % (taskID, taskValue))
    ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID)
    if not ipyData:
        GameWorld.DebugAnswer(curPlayer, "该任务ID不存在:%s" % taskID)
        return
    taskGroup = ipyData.GetTaskGroup()
    needValue = ipyData.GetNeedValue()
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskID % taskGroup, taskID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue % taskGroup, taskValue)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskState % taskGroup, ChConfig.TaskState_Doing)
    PlayerTask.SetTaskValue(curPlayer, ipyData, taskValue)
    curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup)
    GameWorld.DebugAnswer(curPlayer, "设置任务ID:%s  进度:%s/%s" % (taskID, curValue, needValue))
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -89,6 +89,7 @@
                "Task":(
                        ("WORD", "TaskID", 1),
                        ("BYTE", "TaskGroup", 0),
                        ("BYTE", "TaskType", 0),
                        ("list", "TaskConds", 0),
                        ("DWORD", "NeedValue", 0),
@@ -2378,10 +2379,11 @@
        return
        
    def GetTaskID(self): return self.attrTuple[0] # 任务ID WORD
    def GetTaskType(self): return self.attrTuple[1] # 任务类型 BYTE
    def GetTaskConds(self): return self.attrTuple[2] # 任务条件[...] list
    def GetNeedValue(self): return self.attrTuple[3] # 所需任务值 DWORD
    def GetAwardItemList(self): return self.attrTuple[4] # 奖励物品列表 [[物品ID,个数,是否拍品], ...] list
    def GetTaskGroup(self): return self.attrTuple[1] # 任务组别 0-主线 BYTE
    def GetTaskType(self): return self.attrTuple[2] # 任务类型 BYTE
    def GetTaskConds(self): return self.attrTuple[3] # 任务条件[...] list
    def GetNeedValue(self): return self.attrTuple[4] # 所需任务值 DWORD
    def GetAwardItemList(self): return self.attrTuple[5] # 奖励物品列表 [[物品ID,个数,是否拍品], ...] list
# 境界修仙之路
class IPY_RealmXXZL():
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py
@@ -49,6 +49,7 @@
import PlayerArena
import PlayerFaQi
import PlayerTJG
import PlayerTask
# 功能开启需执行的函数{功能ID:执行函数, ...} 函数需返回是否激活成功, 功能开启有需要处理功能逻辑的这里增加函数调用配置即可
@@ -133,9 +134,11 @@
            continue
        
        limitMissionID = ipyData.GetLimitMissionID()
        if limitMissionID and not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_MissionFinish % limitMissionID):
            continue
        if limitMissionID:
            if not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_MissionFinish % limitMissionID) \
                and not PlayerTask.IsTaskFinish(curPlayer, limitMissionID):
                continue
        limitVIPLV = ipyData.GetLimitVIPLV()
        if limitVIPLV and curPlayer.GetVIPLv() < limitVIPLV:
            continue
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py
@@ -9,7 +9,7 @@
# @date 2023-12-20
# @version 1.0
#
# 详细描述: 玩家任务,简化版任务,有且仅有一个进行中的任务
# 详细描述: 玩家任务
#
#-------------------------------------------------------------------------------
#"""Version = 2023-12-20 12:30"""
@@ -22,38 +22,39 @@
import ChPyNetSendPack
import ItemControler
import IPY_GameWorld
import GameFuncComm
import ShareDefine
import ChConfig
def OnPlayerLogin(curPlayer):
    __giveNewTask(curPlayer)
    SyncTaskInfo(curPlayer)
    if not __giveNewTask(curPlayer, ChConfig.TaskGroup_Main):
        SyncTaskInfo(curPlayer)
    return
def __giveNewTask(curPlayer):
def __giveNewTask(curPlayer, taskGroup=ChConfig.TaskGroup_Main):
    ## 给新任务
    taskIDList = GetTaskIDList()
    taskIDList = GetTaskIDList(taskGroup)
    if not taskIDList:
        return
    playerID = curPlayer.GetPlayerID()
    taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID)
    lastTaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskIDLast)
    taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup)
    lastTaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskIDLast % taskGroup)
    newTaskID = 0
    if not taskID and not lastTaskID:
        newTaskID = taskIDList[0]
        GameWorld.DebugLog("给第一个任务: newTaskID=%s" % (newTaskID), playerID)
        GameWorld.DebugLog("给第一个任务: taskGroup=%s,newTaskID=%s" % (taskGroup, newTaskID), playerID)
        
    elif not taskID and lastTaskID:
        # 没有当前任务,给下一个任务
        if lastTaskID not in taskIDList:
            GameWorld.ErrLog("找不到上一次完成的任务ID! lastTaskID=%s" % lastTaskID, playerID)
            GameWorld.ErrLog("找不到上一次完成的任务ID! taskGroup=%s,lastTaskID=%s" % (taskGroup, lastTaskID), playerID)
            return
        lastIndex = taskIDList.index(lastTaskID)
        if lastIndex >= len(taskIDList) - 1:
            GameWorld.DebugLog("已经完成了所有任务: lastTaskID=%s" % (lastTaskID), playerID)
            GameWorld.DebugLog("已经完成了所有任务: lastTaskID=%s,lastTaskID=%s" % (lastTaskID, lastTaskID), playerID)
            return
        newTaskID = taskIDList[lastIndex + 1]
        GameWorld.DebugLog("给下一个任务: newTaskID=%s,lastTaskID=%s" % (newTaskID, lastTaskID), playerID)
        GameWorld.DebugLog("给下一个任务: lastTaskID=%s,newTaskID=%s,lastTaskID=%s" % (lastTaskID, newTaskID, lastTaskID), playerID)
        
    if not newTaskID:
        return
@@ -62,7 +63,6 @@
        return
    taskType = ipyData.GetTaskType()
    conds = ipyData.GetTaskConds()
    needValue = ipyData.GetNeedValue()
    taskValue = 0
    
    if taskType == ChConfig.TaskType_LV:
@@ -74,102 +74,181 @@
        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_TaskIDLast, taskID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskID, newTaskID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue, taskValue)
    GameWorld.DebugLog("接到新任务: newTaskID=%s,taskValue=%s/%s" % (newTaskID, taskValue, needValue), playerID)
    return
    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():
    ## 获取所有的任务ID列表
    key = "TaskIDList"
    taskIDList = IpyGameDataPY.GetConfigEx(key)
    if not taskIDList:
        taskIDList = []
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)
            taskIDList.append(ipyData.GetTaskID())
        IpyGameDataPY.SetConfigEx(key, taskIDList)
        GameWorld.Log("任务ID列表: %s" % taskIDList)
    return taskIDList
            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 UpdTaskValue(curPlayer, taskType, setValue):
def UpdTaskValue(curPlayer, taskType, setValue, conds=None):
    ## 更新任务进度
    taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID)
    if not taskID:
        return
    ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID)
    if not ipyData:
        return
    if ipyData.GetTaskType() != taskType:
        return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue, setValue)
    SyncTaskInfo(curPlayer)
    GameWorld.DebugLog("更新任务进度: taskType=%s,taskID=%s,setValue=%s" % (taskType, taskID, setValue), curPlayer.GetPlayerID())
    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
        if ipyData.GetTaskType() != taskType:
            continue
        if not __CheckTaskCondition(ipyData, conds):
            continue
        SetTaskValue(curPlayer, ipyData, setValue)
    return
def AddTaskValue(curPlayer, taskType, addValue=1, conds=[]):
def AddTaskValue(curPlayer, taskType, addValue=1, conds=None):
    ## 增加任务进度
    taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID)
    if not taskID:
        return
    ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID)
    if not ipyData:
        return
    if ipyData.GetTaskType() != taskType:
        return
    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
        if ipyData.GetTaskType() != taskType:
            continue
        if not __CheckTaskCondition(ipyData, conds):
            continue
        curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup) + addValue
        SetTaskValue(curPlayer, ipyData, curValue)
    return
def __CheckTaskCondition(ipyData, conds=None):
    ## 检查任务条件是否满足
    taskType = ipyData.GetTaskType()
    if taskType == ChConfig.TaskType_FBPass:
        taskConds = ipyData.GetTaskConds()
        if len(conds) != 2 or len(taskConds) != 2:
        if not conds or len(conds) != 2 or len(taskConds) != 2:
            return
        if conds[0] != taskConds[0]:
            return
        if conds[1] < taskConds[1]:
            return
    finishNeedValue = ipyData.GetNeedValue()
    curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue)
    if curValue >= finishNeedValue:
    return True
def SetTaskValue(curPlayer, taskIpyData, value=0):
    ## 设置当前任务进度值,统一处理任务状态、触发额外逻辑等
    if not taskIpyData:
        return
    updValue = min(curValue + addValue, ShareDefine.Def_UpperLimit_DWord)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue, updValue)
    SyncTaskInfo(curPlayer)
    GameWorld.DebugLog("增加任务进度: taskType=%s,taskID=%s,addValue=%s,updValue=%s" % (taskType, taskID, addValue, updValue), curPlayer.GetPlayerID())
    playerID = curPlayer.GetPlayerID()
    taskGroup = taskIpyData.GetTaskGroup()
    taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup)
    if taskIpyData.GetTaskID() != taskID:
        return
    curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup)
    if curState == ChConfig.TaskState_Finish:
        return
    taskType = taskIpyData.GetTaskType()
    finishNeedValue = taskIpyData.GetNeedValue()
    value = min(value, finishNeedValue, ShareDefine.Def_UpperLimit_DWord)
    GameWorld.DebugLog("更新任务进度: taskGroup=%s,taskType=%s,taskID=%s,value=%s/%s"
                       % (taskGroup, taskType, taskID, value, finishNeedValue), playerID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue % taskGroup, value)
    if value >= finishNeedValue:
        __OnTaskFinish(curPlayer, taskGroup, taskID, taskIpyData)
    SyncTaskInfo(curPlayer, taskGroup)
    return True
def __OnTaskFinish(curPlayer, taskGroup, taskID, taskIpyData):
    GameWorld.DebugLog("任务完成: taskGroup=%s,taskID=%s" % (taskGroup, taskID), curPlayer.GetPlayerID())
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskState % taskGroup, ChConfig.TaskState_Finish)
    GameFuncComm.DoFuncOpenLogic(curPlayer, [taskID])
    return
def IsTaskFinish(curPlayer, taskID):
    ## 任务是否已完成
    ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID)
    if not ipyData:
        return
    taskGroup = ipyData.GetTaskGroup()
    nowTaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup)
    if nowTaskID and curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup) == ChConfig.TaskState_Finish:
        finishTaskID = nowTaskID
    else:
        finishTaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskIDLast % taskGroup)
    if taskID == finishTaskID:
        return True
    taskIDList = GetTaskIDList(taskGroup)
    if finishTaskID not in taskIDList or taskID not in taskIDList:
        return
    return taskIDList.index(finishTaskID) >= taskIDList.index(taskID)
def GetTaskAward(curPlayer, taskID):
    ## 领取任务奖励
    playerID = curPlayer.GetPlayerID()
    curTaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID)
    if taskID != curTaskID:
        GameWorld.DebugLog("非当前任务: curTaskID=%s" % curTaskID, playerID)
        return
    ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID)
    if not ipyData:
        return
    taskGroup = ipyData.GetTaskGroup()
    curTaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup)
    if taskID != curTaskID:
        GameWorld.DebugLog("非当前任务: curTaskID=%s" % curTaskID, playerID)
        return
    needValue = ipyData.GetNeedValue()
    awardItemList = ipyData.GetAwardItemList()
    curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue)
    if curValue < needValue:
        GameWorld.DebugLog("任务进度不足无法领奖: taskID=%s,curValue=%s < %s" % (taskID, curValue, needValue), playerID)
    curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup)
    curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup)
    if curState != ChConfig.TaskState_Finish:
        GameWorld.DebugLog("任务未完成无法领奖: taskID=%s,curValue=%s/%s,curState=%s" % (taskID, curValue, needValue, curState), playerID)
        return
    if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList):
        return
    
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskIDLast, taskID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskID, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskIDLast % taskGroup, taskID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskID % taskGroup, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue % taskGroup, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskState % taskGroup, 0)
    
    for itemID, itemCount, isAuctionItem in awardItemList:
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
        
    __giveNewTask(curPlayer)
    SyncTaskInfo(curPlayer)
    if not __giveNewTask(curPlayer, taskGroup):
        SyncTaskInfo(curPlayer, taskGroup)
    return
def SyncTaskInfo(curPlayer):
def SyncTaskInfo(curPlayer, taskGroup=None):
    syncGroupList = [taskGroup] if taskGroup != None else ChConfig.TaskGroupList
    if not syncGroupList:
        return
    taskList = []
    for taskGroup in syncGroupList:
        task = ChPyNetSendPack.tagMCTask()
        task.TaskGroup = taskGroup
        task.TaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup)
        task.CurValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup)
        task.State = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup)
        taskList.append(task)
    if not taskList:
        return
    clientPack = ChPyNetSendPack.tagMCTaskInfo()
    clientPack.TaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID)
    clientPack.CurValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue)
    clientPack.TaskList = taskList
    clientPack.TaskCount = len(clientPack.TaskList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return