From fd569f371890909dc35c09d1275d9204b39d77f9 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 19 四月 2024 11:41:09 +0800 Subject: [PATCH] 10054 【后端】任务系统(支持功能开启任务条件;支持任务分组如主线、支线等;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py | 221 ++++++++++++++++++-------- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py | 33 ++- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 92 +++++++++-- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 10 PySysDB/PySysDBPY.h | 1 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py | 9 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 92 +++++++++-- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 21 ++ 8 files changed, 355 insertions(+), 124 deletions(-) diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h index cab9d6c..e0a6ae0 100644 --- a/PySysDB/PySysDBPY.h +++ b/PySysDB/PySysDBPY.h @@ -75,6 +75,7 @@ struct tagTask { WORD _TaskID; //任务ID + BYTE TaskGroup; //任务组别 0-主线 BYTE TaskType; //任务类型 list TaskConds; //任务条件[...] DWORD NeedValue; //所需任务值 diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py index 9b233d2..f880c1f 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py +++ b/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 #------------------------------------------------------ diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py index 69631ac..1f5314f 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py +++ b/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 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py index 9b233d2..f880c1f 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py +++ b/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 #------------------------------------------------------ diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py index d94b64d..fc5d6cf 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py +++ b/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 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py index 6b3d8ba..02784f3 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py +++ b/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(): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py index 0211847..73826b8 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py +++ b/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 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py index ace7d8a..40b36eb 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py +++ b/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 -- Gitblit v1.8.0