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