From 1ea0e353d47a78209a18f619374da252a0080940 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 19 四月 2024 19:13:43 +0800 Subject: [PATCH] 10054 【后端】任务系统(增加任务类型支持 6~16;优化修改任务值配置时上线进行修正进度值或任务状态;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py | 200 ++++++++++++++++++++++++++++++++++++------------- 1 files changed, 146 insertions(+), 54 deletions(-) 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 40b36eb..d06a415 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py +++ b/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 -- Gitblit v1.8.0