From 5268d9e89c9ebd10fa9d793186e91c4b55f53d8e Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 20 十二月 2023 12:08:59 +0800
Subject: [PATCH] 10054 【后端】任务系统

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py    |  175 +++++++++++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py     |   48 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py      |   56 ++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py        |   29 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py      |    5 
 PySysDB/PySysDBPY.h                                                                         |   11 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py   |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCutTree.py |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py |    2 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                           |   56 ++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py             |   17 ++
 11 files changed, 405 insertions(+), 1 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index c6ac5fa..76a7ef5 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -60,6 +60,17 @@
 	list		LVAttrValueList;	//每级额外属性值(非累积)
 };
 
+//任务表
+
+struct	tagTask
+{
+	WORD		_TaskID;	//任务ID
+	BYTE		TaskType;	//任务类型
+	list		TaskConds;	//任务条件[...]
+	DWORD		NeedValue;	//所需任务值
+	list		AwardItemList;	//奖励物品列表 [[物品ID,个数,是否拍品], ...]
+};
+
 //境界修仙之路
 
 struct	tagRealmXXZL
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 3cef67e..de6cfec 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -43940,6 +43940,62 @@
 
 
 #------------------------------------------------------
+# B1 10 当前任务信息 #tagMCTaskInfo
+
+class  tagMCTaskInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("TaskID", c_int),    # 任务ID
+                  ("CurValue", c_int),    # 当前进度值
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB1
+        self.SubCmd = 0x10
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB1
+        self.SubCmd = 0x10
+        self.TaskID = 0
+        self.CurValue = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCTaskInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B1 10 当前任务信息 //tagMCTaskInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                TaskID:%d,
+                                CurValue:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.TaskID,
+                                self.CurValue
+                                )
+        return DumpString
+
+
+m_NAtagMCTaskInfo=tagMCTaskInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTaskInfo.Cmd,m_NAtagMCTaskInfo.SubCmd))] = m_NAtagMCTaskInfo
+
+
+#------------------------------------------------------
 # B1 21 仙树信息 #tagMCTreeInfo
 
 class  tagMCTreeInfo(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 05307bf..e0774f0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4381,6 +4381,11 @@
 Def_PDict_TreeLVUPState = "TreeLVUPState" # 仙树升级状态;0-未升级;1-升级中
 Def_PDict_TreeLVUPRemainTime = "TreeLVUPRemainTime" # 仙树升级剩余时间,秒
 Def_PDict_TreeLVUPRefreshTime = "TreeLVUPRefreshTime" # 仙树升级上次刷新时间戳
+
+#任务-简化版任务,有且仅有一个进行中的任务
+Def_PDict_TaskIDLast = "TaskIDLast" # 上一次完成的任务ID
+Def_PDict_TaskID = "TaskID" # 当前进行中的任务ID
+Def_PDict_TaskValue = "TaskValue" # 当前进行中的任务进度
 #-------------------------------------------------------------------------------
 #可以从07 41封包购买的背包类型,和对应字典{背包类型:[字典key, 默认格子数]}
 
@@ -5868,7 +5873,8 @@
 Def_RewardType_FamilyBossHurt, #仙盟boss伤害奖励 63
 Def_RewardType_DailyPackBuyGift, #打包直购礼包奖励 64
 Def_RewardType_Zhanling, #战令奖励 65
-)= range(66)
+Def_RewardType_Task, #任务奖励 66
+)= range(67)
 
 
 #boss复活相关活动定义
@@ -6080,6 +6086,15 @@
 TTLTaskType_CrossBoss, # 跨服boss击杀x次 18
 ) = range(1, 1 + 18)
 
+# 任务类型定义
+TaskTypeList = (
+TaskType_LV, # 等级提升至x级 1
+TaskType_CutTree, # 砍树x次 2
+TaskType_EquipDecompose, # 分解装备x次 3
+TaskType_FBPass, # 副本过关到xxx 4
+TaskType_Arena, # 挑战竞技场x次 5
+) = range(1, 1 + 5)
+
 # 充值点券处理类型
 (
 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 3cef67e..de6cfec 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -43940,6 +43940,62 @@
 
 
 #------------------------------------------------------
+# B1 10 当前任务信息 #tagMCTaskInfo
+
+class  tagMCTaskInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("TaskID", c_int),    # 任务ID
+                  ("CurValue", c_int),    # 当前进度值
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB1
+        self.SubCmd = 0x10
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB1
+        self.SubCmd = 0x10
+        self.TaskID = 0
+        self.CurValue = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCTaskInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B1 10 当前任务信息 //tagMCTaskInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                TaskID:%d,
+                                CurValue:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.TaskID,
+                                self.CurValue
+                                )
+        return DumpString
+
+
+m_NAtagMCTaskInfo=tagMCTaskInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTaskInfo.Cmd,m_NAtagMCTaskInfo.SubCmd))] = m_NAtagMCTaskInfo
+
+
+#------------------------------------------------------
 # B1 21 仙树信息 #tagMCTreeInfo
 
 class  tagMCTreeInfo(Structure):
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
new file mode 100644
index 0000000..d94b64d
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py
@@ -0,0 +1,48 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.Task
+#
+# @todo:任务
+# @author hxp
+# @date 2023-12-20
+# @version 1.0
+#
+# 详细描述: 任务
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2023-12-20 12:30"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import IpyGameDataPY
+import PlayerControl
+import PlayerTask
+import ChConfig
+
+## GM命令执行入口
+#  @param curPlayer 当前玩家
+#  @param playerList 参数列表 [ missionID]
+#  @return None
+#  @remarks 函数详细说明.
+def OnExec(curPlayer, playerList):
+    
+    if len(playerList) == 0:
+        GameWorld.DebugAnswer(curPlayer, "设置任务: Task 任务ID 进度")
+        return
+    
+    taskID = playerList[0]
+    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))
+    return
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 0f160f9..afc7b01 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -79,6 +79,14 @@
                         ("list", "LVAttrValueList", 0),
                         ),
 
+                "Task":(
+                        ("WORD", "TaskID", 1),
+                        ("BYTE", "TaskType", 0),
+                        ("list", "TaskConds", 0),
+                        ("DWORD", "NeedValue", 0),
+                        ("list", "AwardItemList", 0),
+                        ),
+
                 "RealmXXZL":(
                         ("WORD", "TaskID", 1),
                         ("BYTE", "TaskType", 0),
@@ -2343,6 +2351,23 @@
     def GetEatItemAttrValueList(self): return self.EatItemAttrValueList # 每X个培养丹增加属性值=EatCntEverytime
     def GetLVAttrTypeList(self): return self.LVAttrTypeList # 每级额外属性类(非累积)
     def GetLVAttrValueList(self): return self.LVAttrValueList # 每级额外属性值(非累积)
+
+# 任务表
+class IPY_Task():
+    
+    def __init__(self):
+        self.TaskID = 0
+        self.TaskType = 0
+        self.TaskConds = []
+        self.NeedValue = 0
+        self.AwardItemList = []
+        return
+        
+    def GetTaskID(self): return self.TaskID # 任务ID
+    def GetTaskType(self): return self.TaskType # 任务类型
+    def GetTaskConds(self): return self.TaskConds # 任务条件[...]
+    def GetNeedValue(self): return self.NeedValue # 所需任务值
+    def GetAwardItemList(self): return self.AwardItemList # 奖励物品列表 [[物品ID,个数,是否拍品], ...]
 
 # 境界修仙之路
 class IPY_RealmXXZL():
@@ -6927,6 +6952,8 @@
         self.ipyLingQiAttrLen = len(self.ipyLingQiAttrCache)
         self.ipyLingQiTrainCache = self.__LoadFileData("LingQiTrain", IPY_LingQiTrain)
         self.ipyLingQiTrainLen = len(self.ipyLingQiTrainCache)
+        self.ipyTaskCache = self.__LoadFileData("Task", IPY_Task)
+        self.ipyTaskLen = len(self.ipyTaskCache)
         self.ipyRealmXXZLCache = self.__LoadFileData("RealmXXZL", IPY_RealmXXZL)
         self.ipyRealmXXZLLen = len(self.ipyRealmXXZLCache)
         self.ipyRealmCache = self.__LoadFileData("Realm", IPY_Realm)
@@ -7545,6 +7572,8 @@
     def GetLingQiAttrByIndex(self, index): return self.ipyLingQiAttrCache[index]
     def GetLingQiTrainCount(self): return self.ipyLingQiTrainLen
     def GetLingQiTrainByIndex(self, index): return self.ipyLingQiTrainCache[index]
+    def GetTaskCount(self): return self.ipyTaskLen
+    def GetTaskByIndex(self, index): return self.ipyTaskCache[index]
     def GetRealmXXZLCount(self): return self.ipyRealmXXZLLen
     def GetRealmXXZLByIndex(self, index): return self.ipyRealmXXZLCache[index]
     def GetRealmCount(self): return self.ipyRealmLen
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index 6f0b431..46365fd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -153,6 +153,7 @@
 import PlayerZhanling
 import PlayerCutTree
 import PlayerLianTi
+import PlayerTask
 import PlayerYinji
 import PlayerLove
 import GameObj
@@ -961,6 +962,7 @@
     PlayerGubao.OnPlayerLogin(curPlayer)
     PlayerShentong.OnPlayerLogin(curPlayer)
     PlayerZhanling.OnPlayerLogin(curPlayer)
+    PlayerTask.OnPlayerLogin(curPlayer)
     PlayerCutTree.OnPlayerLogin(curPlayer)
     # 上线查询一次充值订单
     curPlayer.SendDBQueryRecharge()
@@ -5707,6 +5709,9 @@
     #打包直购礼包奖励
     elif rewardType == ChConfig.Def_RewardType_DailyPackBuyGift:
         PlayerGoldGift.GetDailyPackBuyGift(curPlayer, dataEx)
+    #任务奖励
+    elif rewardType == ChConfig.Def_RewardType_Task:
+        PlayerTask.GetTaskAward(curPlayer, dataEx)
     #战令奖励
     elif rewardType == ChConfig.Def_RewardType_Zhanling:
         PlayerZhanling.GetZhanlingReward(curPlayer, dataEx, dataExStr)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
index 4b5cd00..2700979 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
@@ -32,6 +32,7 @@
 import PlayerActivity
 import PlayerSuccess
 import PlayerGubao
+import PlayerTask
 
 def DoArenaOpen(curPlayer):
     ## 竞技场功能开启
@@ -302,6 +303,7 @@
     # 触发任务
     EventShell.EventRespons_ArenaBattleOver(curPlayer)
     EventShell.EventRespons_ArenaHighestScore(curPlayer)
+    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_Arena, 1)
     
     PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Arena, 1)
     PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_Arena, 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 4e91bdd..2398cfe 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -102,6 +102,7 @@
 import PlayerGubao
 import PlayerShentong
 import PlayerCharm
+import PlayerTask
 import ChPlayer
 import GMShell
 import GameObj
@@ -4316,6 +4317,7 @@
             aftBaseCON = curPlayer.GetBaseCON()
             if aftLV > befLV:
                 curPlayer.SetLV(aftLV, False) # 这里不再通知GameServer
+                PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_LV, aftLV)
                 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 8f5f4f3..00c3332 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCutTree.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCutTree.py
@@ -24,6 +24,7 @@
 import PlayerControl
 import IPY_GameWorld
 import ItemControler
+import PlayerTask
 import NPCCommon
 import ChConfig
 import ChEquip
@@ -148,6 +149,8 @@
     
     GameWorld.DebugLog("    实际产出: giveEquipIDList=%s,giveItemListEx=%s,addExp=%s" % (giveEquipIDList, giveItemListEx, addExp), playerID)
     SyncCutTreeResult(curPlayer, giveEquipCount, giveItemListEx)
+    
+    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_CutTree, giveEquipCount)
     return
 
 #// B2 22 砍树装备操作 #tagCMCutTreeEquipOP
@@ -208,6 +211,8 @@
     # 这边执行分解逻辑,待扩展...
     
     ItemCommon.DelItem(curPlayer, curEquip, curEquip.GetCount(), True, ChConfig.ItemDel_EquipDecompose)
+    
+    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_EquipDecompose, 1)
     return
 
 #// B2 23 仙树升级 #tagCMTreeLVUP
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py
new file mode 100644
index 0000000..ace7d8a
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py
@@ -0,0 +1,175 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerTask
+#
+# @todo:玩家任务
+# @author hxp
+# @date 2023-12-20
+# @version 1.0
+#
+# 详细描述: 玩家任务,简化版任务,有且仅有一个进行中的任务
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2023-12-20 12:30"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import IpyGameDataPY
+import PlayerControl
+import NetPackCommon
+import ChPyNetSendPack
+import ItemControler
+import IPY_GameWorld
+import ShareDefine
+import ChConfig
+
+def OnPlayerLogin(curPlayer):
+    __giveNewTask(curPlayer)
+    SyncTaskInfo(curPlayer)
+    return
+
+def __giveNewTask(curPlayer):
+    ## 给新任务
+    taskIDList = GetTaskIDList()
+    if not taskIDList:
+        return
+    playerID = curPlayer.GetPlayerID()
+    taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID)
+    lastTaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskIDLast)
+    newTaskID = 0
+    if not taskID and not lastTaskID:
+        newTaskID = taskIDList[0]
+        GameWorld.DebugLog("给第一个任务: newTaskID=%s" % (newTaskID), playerID)
+        
+    elif not taskID and lastTaskID:
+        # 没有当前任务,给下一个任务
+        if lastTaskID not in taskIDList:
+            GameWorld.ErrLog("找不到上一次完成的任务ID! lastTaskID=%s" % lastTaskID, playerID)
+            return
+        lastIndex = taskIDList.index(lastTaskID)
+        if lastIndex >= len(taskIDList) - 1:
+            GameWorld.DebugLog("已经完成了所有任务: lastTaskID=%s" % (lastTaskID), playerID)
+            return
+        newTaskID = taskIDList[lastIndex + 1]
+        GameWorld.DebugLog("给下一个任务: newTaskID=%s,lastTaskID=%s" % (newTaskID, lastTaskID), playerID)
+        
+    if not newTaskID:
+        return
+    ipyData = IpyGameDataPY.GetIpyGameData("Task", newTaskID)
+    if not ipyData:
+        return
+    taskType = ipyData.GetTaskType()
+    conds = ipyData.GetTaskConds()
+    needValue = ipyData.GetNeedValue()
+    taskValue = 0
+    
+    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_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
+
+def GetTaskIDList():
+    ## 获取所有的任务ID列表
+    key = "TaskIDList"
+    taskIDList = IpyGameDataPY.GetConfigEx(key)
+    if not taskIDList:
+        taskIDList = []
+        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
+
+def UpdTaskValue(curPlayer, taskType, setValue):
+    ## 更新任务进度
+    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())
+    return
+
+def AddTaskValue(curPlayer, taskType, addValue=1, conds=[]):
+    ## 增加任务进度
+    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
+    if taskType == ChConfig.TaskType_FBPass:
+        taskConds = ipyData.GetTaskConds()
+        if 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
+    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())
+    return
+
+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
+    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)
+        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)
+    
+    for itemID, itemCount, isAuctionItem in awardItemList:
+        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
+        
+    __giveNewTask(curPlayer)
+    SyncTaskInfo(curPlayer)
+    return
+
+def SyncTaskInfo(curPlayer):
+    clientPack = ChPyNetSendPack.tagMCTaskInfo()
+    clientPack.TaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID)
+    clientPack.CurValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return

--
Gitblit v1.8.0