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