10054 【后端】任务系统(支持功能开启任务条件;支持任务分组如主线、支线等;)
| | |
| | | struct tagTask
|
| | | {
|
| | | WORD _TaskID; //任务ID
|
| | | BYTE TaskGroup; //任务组别 0-主线
|
| | | BYTE TaskType; //任务类型
|
| | | list TaskConds; //任务条件[...]
|
| | | DWORD NeedValue; //所需任务值
|
| | |
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | | 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
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | | 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" # 已雇佣工人数
|
| | |
| | | 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
|
| | |
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | | 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
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | | 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
|
| | |
|
| | |
| | |
|
| | | "Task":(
|
| | | ("WORD", "TaskID", 1),
|
| | | ("BYTE", "TaskGroup", 0),
|
| | | ("BYTE", "TaskType", 0),
|
| | | ("list", "TaskConds", 0),
|
| | | ("DWORD", "NeedValue", 0),
|
| | |
| | | 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(): |
| | |
| | | import PlayerArena
|
| | | import PlayerFaQi
|
| | | import PlayerTJG
|
| | | import PlayerTask
|
| | |
|
| | |
|
| | | # 功能开启需执行的函数{功能ID:执行函数, ...} 函数需返回是否激活成功, 功能开启有需要处理功能逻辑的这里增加函数调用配置即可
|
| | |
| | | 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
|
| | |
| | | # @date 2023-12-20
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 玩家任务,简化版任务,有且仅有一个进行中的任务
|
| | | # 详细描述: 玩家任务
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2023-12-20 12:30"""
|
| | |
| | | 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
|
| | |
| | | return
|
| | | taskType = ipyData.GetTaskType()
|
| | | conds = ipyData.GetTaskConds()
|
| | | needValue = ipyData.GetNeedValue()
|
| | | taskValue = 0
|
| | |
|
| | | if taskType == ChConfig.TaskType_LV:
|
| | |
| | | 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
|