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/Item/ChEquip.py             |   29 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py      |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py        |  200 ++++++++++++++++++++++++---------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py       |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py       |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py         |   33 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCutTree.py     |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py     |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMineArea.py    |    6 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                 |   13 ++
 13 files changed, 242 insertions(+), 62 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 1f5314f..8ade00e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -6193,7 +6193,18 @@
 TaskType_EquipDecompose, # 分解装备x次 3
 TaskType_FBPass, # 副本过关到xxx 4
 TaskType_Arena, # 挑战竞技场x次 5
-) = range(1, 1 + 5)
+TaskType_EquipColorItem, # 穿戴X品质装备x件 6
+TaskType_TreeLV, # 仙树达到X级 7
+TaskType_RealmLV, # 境界达到X级 8
+TaskType_MineItemSelf, # 采集自己福地物品x次 9
+TaskType_MineWorkerCnt, # 拥有x只福地老鼠 10
+TaskType_MineItemRob, # 采集他人福地物品x次 11
+TaskType_FBChallenge, # 副本xxx挑战x次 12
+TaskType_CreateOrJoinFamily, # 创建或申请加入仙盟 13
+TaskType_HorseUp, # 坐骑升级x次 14
+TaskType_RefineItem, # 炼丹x次 15
+TaskType_FairyDomain, # 缥缈仙域x次 16
+) = range(1, 1 + 16)
 
 # 任务分组
 TaskGroupList = (
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 fc5d6cf..ea9f48c 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
@@ -26,14 +26,15 @@
 #  @param playerList 参数列表 [ missionID]
 #  @return None
 #  @remarks 函数详细说明.
-def OnExec(curPlayer, playerList):
+def OnExec(curPlayer, paramList):
     
-    if len(playerList) == 0:
+    if len(paramList) == 0:
         GameWorld.DebugAnswer(curPlayer, "重置主线: Task 0")
+        GameWorld.DebugAnswer(curPlayer, "输出任务: Task 1")
         GameWorld.DebugAnswer(curPlayer, "设置任务: Task 任务ID 进度")
         return
     
-    taskID = playerList[0]
+    taskID = paramList[0]
     if not taskID:
         taskGroup = ChConfig.TaskGroup_Main
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskIDLast % taskGroup, 0)
@@ -43,7 +44,11 @@
         PlayerTask.__giveNewTask(curPlayer, taskGroup)
         return
     
-    taskValue = playerList[1] if len(playerList) > 1 else 0
+    if len(paramList) == 1 and paramList[0] == 1:
+        __ShowTask(curPlayer)
+        return
+    
+    taskValue = paramList[1] if len(paramList) > 1 else 0
     ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID)
     if not ipyData:
         GameWorld.DebugAnswer(curPlayer, "该任务ID不存在:%s" % taskID)
@@ -59,3 +64,23 @@
     GameWorld.DebugAnswer(curPlayer, "设置任务ID:%s  进度:%s/%s" % (taskID, curValue, needValue))
     return
 
+def __ShowTask(curPlayer):
+    taskCount = 0
+    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
+        curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup)
+        curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup)
+        needValue = ipyData.GetNeedValue()
+        GameWorld.DebugAnswer(curPlayer, "任务ID:%s 进度:%s/%s 状态:%s" % (taskID, curValue, needValue, curState))
+        taskCount += 1
+        
+    if not taskCount:
+        GameWorld.DebugAnswer(curPlayer, "当前没有任务!")       
+        
+    return
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
index b5d3f56..b6c2bd1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
@@ -333,6 +333,35 @@
         
     return
 
+def GetPlayerEquipItemCount(curPlayer, classLV, itemColor, includeHigh=True):
+    ## 获取玩家穿戴的装备数量
+    
+    haveCnt = 0
+    classlVList = [classLV] if classLV else range(1, IpyGameDataPY.GetFuncCfg('EquipMaxClasslv')+1)
+    equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
+    for classLV in classlVList:
+        ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'ClassLV':classLV}, True, False)
+        if not ipyDataList:
+            continue
+        for ipyData in ipyDataList:
+            gridIndex = ipyData.GetGridIndex()
+            curEquip = equipPack.GetAt(gridIndex)
+            if not ItemCommon.CheckItemCanUse(curEquip):
+                continue
+            if itemColor != None:
+                if includeHigh:
+                    if curEquip.GetItemColor() < itemColor:
+                        continue
+                else:
+                    if curEquip.GetItemColor() != itemColor:
+                        continue
+                    
+            # 可扩展套装
+            
+            haveCnt += 1
+            
+    return haveCnt
+
 ## 刷新所有装备对人物属性的改变
 #  @param self 类实例
 #  @return 返回值无意义
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
index 934e15c..e8f3ec0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -37,6 +37,7 @@
 import DataRecordPack
 import PlayerGubao
 import EventShell
+import PlayerTask
 import PlayerVip
 import ChEquip
 
@@ -830,6 +831,7 @@
             dataDict = {'dotype':'EquipItem', 'desItemID':desItemID, 'desUserData':desUserData,'srcItemID':srcItemID,'srcUserData':srcUserData}
             DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_EquipChange, dataDict)
             self.__UpdEquipOrangeCount(befIsOrangeEquip, aftIsOrangeEquip)
+            PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_EquipColorItem)
             
         self.RefreshStartEquipCount()
         return equipPlace if result else -1
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 03ca895..3b8daeb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -4316,7 +4316,7 @@
             aftBaseCON = curPlayer.GetBaseCON()
             if aftLV > befLV:
                 curPlayer.SetLV(aftLV, False) # 这里不再通知GameServer
-                PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_LV, aftLV)
+                PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_LV)
                 PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_HeroLV, aftLV)
                 PlayerActivity.DoAddActivityByLV(curPlayer, befLV, aftLV)
                 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCutTree.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCutTree.py
index c4082df..dabf9c8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCutTree.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCutTree.py
@@ -333,6 +333,8 @@
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRefreshTime, 0)
     GameWorld.DebugLog("执行仙树升级! updTreeLV=%s" % updTreeLV, playerID)
     SyncTreeInfo(curPlayer)
+    
+    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_TreeLV)
     return
 
 def SyncTreeInfo(curPlayer):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py
index d77d8fd..982616d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py
@@ -32,6 +32,7 @@
 import PlayerNewFairyCeremony
 import ItemControler
 import ItemCommon
+import PlayerTask
 import PyGameData
 import EventShell
 import FBCommon
@@ -360,6 +361,8 @@
 #            GameWorld.Log('缥缈仙域事件状态设置错误,fdeventID=%s, state=%s, curState=%s' % (fdeventID, state, curState))
 #            return
         EventShell.EventRespons_FairyDomain(curPlayer, ipyData.GetEventType())
+        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FairyDomain, 1)
+        
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdeventID, state)
     NotifyVisitFairyDomainInfo(curPlayer, [fdeventID], 0)
     return True
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
index 0b5f5f5..794a3ec 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -42,6 +42,7 @@
 import GameFuncComm
 import PlayerTJG
 import IpyGameDataPY
+import PlayerTask
 import cPickle
 
 import time
@@ -140,7 +141,10 @@
         #刚进家族并为族长,触发建家族事件
         if curPlayer.GetFamilyMemberLV() == IPY_GameWorld.fmlLeader:
             EventShell.EventResponse_OnCreateFamily(curPlayer)
-        
+            PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_CreateOrJoinFamily)
+        else:
+            PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_CreateOrJoinFamily, 1)
+            
         #进入家族触发事件
         __OnEnterFamily(curPlayer, tick)
         
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
index a7a4d97..bd7d6a8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -36,6 +36,7 @@
 import IpyGameDataPY
 import CrossPlayerData
 import PlayerSuccess
+import PlayerTask
 import PlayerPet
 
 import time
@@ -634,6 +635,7 @@
     
     # 升阶
     EventShell.EventRespons_HorseUp(curPlayer) # 改为使用就算
+    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HorseUp, 1)
     if updClassLV > horseLV:
         EventShell.EventRespons_HorseLV(curPlayer, updClassLV)
         # 玩家马匹进阶
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMineArea.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMineArea.py
index ee34b98..845d521 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMineArea.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMineArea.py
@@ -24,6 +24,7 @@
 import ItemControler
 import ItemCommon
 import GameWorld
+import PlayerTask
 
 # 聚宝盆默认最大进度
 MineTreasureProgressMax = 100
@@ -159,6 +160,8 @@
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineWorkerCount, updEmployCount)
     SyncPlayerMineAreaInfo(curPlayer)
     GameWorld.DebugLog("福地雇佣工人! costItemID=%s,costItemCount=%s,updEmployCount=%s" % (costItemID, costItemCount, updEmployCount), playerID)
+    
+    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_MineWorkerCnt)
     return
 
 def SendToGameServer_MineArea(curPlayer, msgType, dataMsg=""):
@@ -206,6 +209,9 @@
         
     if robCount:
         OnAddMineTreasureProgress(curPlayer, robCount, False)
+        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_MineItemRob, 1)
+    else:
+        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_MineItemSelf, 1)
         
     SyncPlayerMineAreaInfo(curPlayer)
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
index 3bbfd0b..808d431 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
@@ -33,6 +33,7 @@
 import EventShell
 import DataRecordPack
 import SkillCommon
+import PlayerTask
 
 import time
 #------------------------------------------------------------------------------
@@ -385,6 +386,7 @@
     # 记录开服活动
     #OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_RealmLV, nextRealmLv)
     EventShell.EventRespons_RealmUp(curPlayer, nextRealmLv)
+    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_RealmLV)
     #流向
     DataRecordPack.DR_RealmLVUp(curPlayer, nextRealmLv)
     return True
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
index 50930c2..8c6802a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
@@ -33,6 +33,7 @@
 import PlayerNewFairyCeremony
 import PlayerActGarbageSorting
 import PlayerActLogin
+import PlayerTask
 import PlayerVip
 
 import copy
@@ -146,7 +147,8 @@
         #日常任务
         costItemCnt = sum(needMaterialDict.values())
         #PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_RefineStove, costItemCnt)
-
+        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_RefineItem, refineTimes)
+        
     elif doType == 2:
         if curAlchemyItemID != alchemyItemID:
             GameWorld.DebugLog('停止丹药ID错误 curAlchemyItemID=%s' % curAlchemyItemID)
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