PGRData/Script/matrix/xmanager/XTaskForceManager.lua

917 lines
No EOL
28 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

XTaskForceManagerCreator = function()
--派遣
local XTaskForceManager = {}
--派遣任务状态
XTaskForceManager.TaskForceTaskStatus = {
Normal = 0,
Accept = 1,
Complete = 2,
}
local TaskForceConfig = {}
local TaskForceExpendConfig = {}
local TaskForceSectionConfig = {}
local TaskForceTaskPoolConfig = {}
local TaskForceCountConfig = {}
local MaxRefreshTimes = 0 --最大刷新次数,可以超过
local TotalFreeRefreshTimes = 0 -- 总的免费次数
local TotalSectionCount = 0 -- 总的章节数
local TaskForceInfo = {} --所有派遣信息
local NextRefreshTime = -1
local XTaskForceRequest = {
TaskForceRefreshRequest = "TaskForceRefreshRequest",
AcceptTaskForceTaskRequest = "AcceptTaskForceTaskRequest",
GiveUpTaskForceTaskRequest = "GiveUpTaskForceTaskRequest",
TaskForceTaskFinishRequest = "TaskForceTaskFinishRequest",
AcceptTaskForceRewardRequest = "AcceptTaskForceRewardRequest",
}
--初始化
function XTaskForceManager.Init()
XTaskForceManager.InitConfig()
end
--初始化表
function XTaskForceManager.InitConfig()
TaskForceConfig = XTaskForceConfigs.GetTaskForceConfig()
TaskForceExpendConfig = XTaskForceConfigs.GetTaskForceExpendConfig()
TaskForceSectionConfig = XTaskForceConfigs.GetTaskForceSectionConfig()
TaskForceTaskPoolConfig = XTaskForceConfigs.GetTaskForceTaskPoolConfig()
TaskForceCountConfig = XTaskForceConfigs.GetTaskForceCountConfig()
MaxRefreshTimes = XTaskForceConfigs.MaxRefreshTimes
TotalFreeRefreshTimes = XTaskForceConfigs.TotalFreeRefreshTimes
TotalSectionCount = XTaskForceConfigs.TotalSectionCount
end
--获取章节表
function XTaskForceManager.GetTaskForceSectionConfig()
return TaskForceSectionConfig
end
--获取当前章节Id
function XTaskForceManager.GetCurTaskForceSectionId()
if not TaskForceInfo then
return -1
end
return TaskForceInfo.SectionId
end
--获取派遣上限相关
function XTaskForceManager.GetTaskForceConfigById(id)
if not TaskForceConfig then
XLog.ErrorTableDataNotFound("XTaskForceManager.GetTaskForceConfigById",
"TaskForceConfig", "Share/TaskForce/TaskForceConfig.tab", "id", tostring(id))
return
end
return TaskForceConfig[id]
end
---获取总章节数
function XTaskForceManager.GetTotalTaskForeSectionCount()
return TotalSectionCount
end
--获取章节
function XTaskForceManager.GetTaskForceSectionConfigById(id)
if not TaskForceSectionConfig then
XLog.ErrorTableDataNotFound("XTaskForceManager.GetTaskForceSectionConfigById",
"TaskForceSectionConfig", "Share/TaskForce/TaskForceSection.tab", "id", tostring(id))
return
end
return TaskForceSectionConfig[id]
end
---获取派遣最大次数条件数据
function XTaskForceManager.GetTaskForceConfigInfo()
return TaskForceConfig
end
---获取派遣数据
function XTaskForceManager.GetTaskForeInfo()
return TaskForceInfo
end
--获取下次更新时间
function XTaskForceManager.GetNextRefreshTime()
return NextRefreshTime
end
--获取最近一个要完成的派遣任务
function XTaskForceManager.GetLatelyTaskForeInfo()
if not TaskForceInfo then
return
end
if not TaskForceInfo.TaskList or #TaskForceInfo.TaskList <= 0 then
return
end
local taskForeInfo = nil
for _, v in ipairs(TaskForceInfo.TaskList) do
if v.Status == XTaskForceManager.TaskForceTaskStatus.Accept then
if taskForeInfo then
taskForeInfo = taskForeInfo.UtcFinishTime < v.UtcFinishTime and taskForeInfo or v
else
taskForeInfo = v
end
end
end
return taskForeInfo
end
--获取进行中的任务数量
function XTaskForceManager.GetWorkingTaskCount()
if not TaskForceInfo then
return 0
end
if not TaskForceInfo.TaskList then
return 0
end
local taskCount = 0
for _, v in ipairs(TaskForceInfo.TaskList) do
if v.Status ~= XTaskForceManager.TaskForceTaskStatus.Normal then
taskCount = taskCount + 1
end
end
return taskCount
end
--获取任务池数据
function XTaskForceManager.GetTaskPoolInfo()
if not TaskForceTaskPoolConfig then
return
end
if not TaskForceInfo then
return
end
local tasks = {}
for _, v in ipairs(TaskForceInfo.TaskList) do
local task = {}
task.TaskCfg = TaskForceTaskPoolConfig[v.TaskId]
task.Task = v
task.IsWorking = v.Status ~= XTaskForceManager.TaskForceTaskStatus.Normal
table.insert(tasks, task)
end
table.sort(tasks, function(a, b)
return tonumber(a.Task.Status) > tonumber(b.Task.Status)
end)
return tasks
end
--获取免费刷新总次数
function XTaskForceManager.GetTotalFreeRefreshTimes()
return TotalFreeRefreshTimes
end
--获取刷新信息
function XTaskForceManager.GetRefreshInfoByTimes(times)
if not TaskForceExpendConfig then
return
end
if times <= MaxRefreshTimes then
return TaskForceExpendConfig[times]
end
return TaskForceExpendConfig[MaxRefreshTimes]
end
--刷新任务池
function XTaskForceManager.CheckCanRefresh(id, count)
if count < 0 then
return false
end
local enough = XDataCenter.ItemManager.CheckItemCountById(id, count)
if not enough then
local itemName = XDataCenter.ItemManager.GetItemName(id)
local text = CS.XTextManager.GetText('AssetsBuyConsumeNotEnough', itemName)
XUiManager.TipMsg(text, XUiManager.UiTipType.Tip)
return false
end
return true
end
--檢查隊伍條件
function XTaskForceManager.CheckTeamCondition(taskId, characterIds)
if #characterIds <= 0 then
return false, CS.XTextManager.GetText("MissionConditionMemberLimit")
end
if not TaskForceTaskPoolConfig then
return false
end
local taskCfg = TaskForceTaskPoolConfig[taskId]
if not taskCfg then
return false
end
local requireMemberCount = taskCfg.MemberCount
if #characterIds < requireMemberCount then
return false, CS.XTextManager.GetText("MissionConditionMemberLimit")
end
--[[ local characterLevelLimit = taskCfg.CharacterLevelLimit
for i, id in ipairs(characterIds) do
local character = XDataCenter.CharacterManager.GetCharacter(id)
if character.Level < characterLevelLimit then
return false, CS.XTextManager.GetText("MissionConditionNotEnough")
end
end]]
--
return true
end
local DefaultSort = function(a, b)
if a.IsWorking ~= b.IsWorking then
return a.IsWorking < b.IsWorking
end
if a.Level ~= b.Level then
return a.Level > b.Level
end
if a.Quality ~= b.Quality then
return a.Quality > b.Quality
end
local priorityA = XCharacterConfigs.GetCharacterPriority(a.Id)
local priorityB = XCharacterConfigs.GetCharacterPriority(b.Id)
if priorityA ~= priorityB then
return priorityA < priorityB
end
return a.Id > b.Id
end
--获取可选择的角色
function XTaskForceManager.GetOwnCharacterList()
local characterList = XDataCenter.CharacterManager.GetOwnCharacterList()
if not characterList then
return
end
if not TaskForceInfo or not TaskForceInfo.TaskList or #TaskForceInfo.TaskList == 0 then
return characterList
end
local workingId = {}
for _, v in ipairs(TaskForceInfo.TaskList) do
if v.Status ~= XTaskForceManager.TaskForceTaskStatus.Normal then
local members = v.Members
for _, id in ipairs(members) do
workingId[id] = true
end
end
end
for _, v in ipairs(characterList) do
if workingId[v.Id] then
v.IsWorking = 1
else
v.IsWorking = 0
end
end
table.sort(characterList, DefaultSort)
return characterList
end
--获取可选择的角色
function XTaskForceManager.GetOwnCharacterCanTeamList()
local characterList = XDataCenter.CharacterManager.GetOwnCharacterList()
if not characterList then
return
end
if not TaskForceInfo or not TaskForceInfo.TaskList or #TaskForceInfo.TaskList == 0 then
return characterList
end
local workingId = {}
for _, v in ipairs(TaskForceInfo.TaskList) do
if v.Status ~= XTaskForceManager.TaskForceTaskStatus.Normal then
local members = v.Members
for _, id in ipairs(members) do
workingId[id] = true
end
end
end
local list = {}
for _, v in ipairs(characterList) do
if not workingId[v.Id] then
table.insert(list, v.Id)
end
end
return list
end
--一键选择
function XTaskForceManager.AutoChoiceCharacter(taskId)
local emptyTable = {}
if not TaskForceTaskPoolConfig then
return emptyTable
end
local taskCfg = TaskForceTaskPoolConfig[taskId]
if not taskCfg then
return emptyTable
end
local requireMemberCount = taskCfg.MemberCount
local charIds = XTaskForceManager.GetOwnCharacterCanTeamList()
if not charIds or #charIds <= 0 then
return emptyTable
end
--条件筛选
local conditions = {}
local conditionIds = taskCfg.ConditionList
for _, id in ipairs(conditionIds) do
local conditionRequireMember = XTaskForceManager.GetConditionRequireMember(id)
if conditionRequireMember == requireMemberCount then
charIds = XTaskForceManager.FitterPriorityCondition(charIds, id)
else
local condition = {}
condition.Id = id
condition.Members = {}
condition.MemberIndexs = {}
condition.ConditionRequireMember = conditionRequireMember
table.insert(conditions, condition)
end
end
if not charIds or #charIds < requireMemberCount then
return emptyTable
end
--如果没有需要匹配的条件
if not conditions or #conditions <= 0 then
local newCharIds = {}
for _ = 1, requireMemberCount, 1 do
local rand = math.random(1, #charIds)
table.insert(newCharIds, charIds[rand])
table.remove(charIds, rand)
end
return newCharIds
end
--乱序
charIds = XTool.RandomBreakTableOrder(charIds)
--获得多个条件集合
for index = 1, #conditions, 1 do
local condition = conditions[index]
for _, id in ipairs(charIds) do
if XTaskForceManager.CheckCondition(condition.Id, id) then
condition.Members[id] = id
table.insert(condition.MemberIndexs, id)
end
end
--某一个条件不满足
if #condition.MemberIndexs < condition.ConditionRequireMember then
return emptyTable
end
end
local ret, tmpCharIds = XTaskForceManager.RandomMultContionCalculate(charIds, requireMemberCount, conditions)
if not ret then
return emptyTable
end
return tmpCharIds
end
--多条件随机算法
function XTaskForceManager.RandomMultContionCalculate(charIds, requireCount, conditions)
local charIdMap = {}
local count = 0
local ret
ret, charIdMap, count = XTaskForceManager.RecursionCalculate(charIdMap, requireCount, conditions, count, 1)
if not ret then
return false
end
--提前满足条件,随机补充
while count < requireCount do
local rand = math.random(1, #charIds)
local id = charIds[rand]
if not charIdMap[id] then
charIdMap[id] = id
count = count + 1
end
end
local Ids = {}
for k, _ in pairs(charIdMap) do
table.insert(Ids, k)
end
return true, Ids
end
--递归检查条件
function XTaskForceManager.RecursionCalculate(charIds, requireCount, conditions, count, index)
--超出条件上限
if index > #conditions then
return false
end
local curCondition = conditions[index]
for randIndex = 1, #curCondition.MemberIndexs do
local id = curCondition.MemberIndexs[randIndex]
if not charIds[id] then
charIds[id] = id
--检测是否行得通
local result, refCount = XTaskForceManager.CheckAllConditionEnough(charIds, conditions, requireCount, count + 1)
if result == 1 then
return true, charIds, count + 1
elseif result == 0 then
if refCount[index] >= curCondition.ConditionRequireMember then
return XTaskForceManager.RecursionCalculate(charIds, requireCount, conditions, count + 1, index + 1)
else
count = count + 1
end
else
charIds[id] = nil
end
end
end
return false
end
--检测
--返回 1 完成
--返回 0 继续
--返回 -1 返回上一步
function XTaskForceManager.CheckAllConditionEnough(charIds, conditions, requireCount, count)
--检测每个条件的满足情况
local refCount = {}
local compeltedCount = 0
for index, condition in ipairs(conditions) do
refCount[index] = refCount[index] or 0
for _, v in pairs(charIds) do
if condition.Members[v] then
refCount[index] = refCount[index] + 1
end
end
--当前条件的需求数量大于坑位数
if refCount[index] >= condition.ConditionRequireMember then
compeltedCount = compeltedCount + 1
elseif condition.ConditionRequireMember - refCount[index] > requireCount - count then
return -1
end
end
--满足了所有条件
if compeltedCount == #conditions then
return 1
end
--没有坑位
if count == requireCount then
return -1
end
return 0, refCount
end
--过滤全条件不满足的构造体
function XTaskForceManager.FitterPriorityCondition(charIdList, id)
if not charIdList or #charIdList <= 0 then
return
end
local newList = {}
for _, charId in ipairs(charIdList) do
if XTaskForceManager.CheckCondition(id, charId) then
table.insert(newList, charId)
end
end
return newList
end
--检测红点
function XTaskForceManager.CheckTaskForceCompleted()
if not TaskForceInfo or not TaskForceInfo.TaskList or #TaskForceInfo.TaskList == 0 then
return false
end
for _, v in ipairs(TaskForceInfo.TaskList) do
if v.Status == XTaskForceManager.TaskForceTaskStatus.Complete then
return true
end
end
return false
end
------------------------------------------------------------
--完成任务
function XTaskForceManager.CompletedTaskForceTask(taskId)
if not TaskForceInfo then
return
end
if not TaskForceInfo.TaskList or #TaskForceInfo.TaskList <= 0 then
return
end
for _, var in ipairs(TaskForceInfo.TaskList) do
if var.TaskId == taskId then
var.Status = XTaskForceManager.TaskForceTaskStatus.Complete
break
end
end
end
--网络协议----------------------------
--放弃任务
function XTaskForceManager.GiveUpTaskForceTaskRequest(taskId)
XNetwork.Call(XTaskForceRequest.GiveUpTaskForceTaskRequest, { TaskId = taskId }, function(resp)
if resp.Code ~= XCode.Success then
XUiManager.TipCode(resp.Code)
return
end
if not TaskForceInfo then
return
end
if not TaskForceInfo.TaskList or #TaskForceInfo.TaskList <= 0 then
return
end
-- local removeIndex = -1
for _, var in ipairs(TaskForceInfo.TaskList) do
if var.TaskId == resp.TaskId then
var.Members = {}
var.Status = XTaskForceManager.TaskForceTaskStatus.Normal
break
end
end
-- if removeIndex > 0 then
-- table.remove(TaskForceInfo.TaskList, removeIndex)
-- end
XUiManager.TipMsg(CS.XTextManager.GetText("MissionGiveupSuccess"))
XEventManager.DispatchEvent(XEventId.EVENT_TASKFORCE_GIVEUP_TASK_REQUEST)
end)
end
--接受任务
function XTaskForceManager.AcceptTaskForceTaskRequest(taskId, members, callback)
XNetwork.Call(XTaskForceRequest.AcceptTaskForceTaskRequest, { TaskId = taskId, Members = members }, function(resp)
if resp.Code ~= XCode.Success then
XUiManager.TipCode(resp.Code)
return
end
if not TaskForceInfo then
return
end
local removeIndex = -1
for index, v in ipairs(TaskForceInfo.TaskList) do
if resp.TaskId == v.TaskId then
removeIndex = index
--v.Status = XTaskForceManager.TaskForceTaskStatus.Accept
break
end
end
if removeIndex > 0 then
TaskForceInfo.TaskList[removeIndex] = resp.TaskInfo
end
if callback then
callback()
end
--XUiManager.TipMsg(CS.XTextManager.GetText("MissionSendSuccess"))
XEventManager.DispatchEvent(XEventId.EVENT_TASKFORCE_ACCEPT_TASK_REQUEST)
end)
end
--请求刷新任务池
function XTaskForceManager.TaskForceRefreshRequest(cb)
XNetwork.Call(XTaskForceRequest.TaskForceRefreshRequest, nil, function(resp)
if resp.Code ~= XCode.Success then
XUiManager.TipCode(resp.Code)
return
end
if not TaskForceInfo then
return
end
TaskForceInfo.TaskList = resp.TaskList
TaskForceInfo.RefreshCount = TaskForceInfo.RefreshCount + 1
--XUiManager.TipMsg(CS.XTextManager.GetText("MissionRefreshSuccess"))
if cb then
cb()
end
XEventManager.DispatchEvent(XEventId.EVENT_TASKFORCE_REFRESH_REQUEST)
end)
end
--请求立即完成任务
function XTaskForceManager.TaskForceTaskFinishRequest(taskId)
XNetwork.Call(XTaskForceRequest.TaskForceTaskFinishRequest, { TaskId = taskId }, function(resp)
if resp.Code ~= XCode.Success then
XUiManager.TipCode(resp.Code)
return
end
if not TaskForceInfo then
return
end
if not TaskForceInfo.TaskList or #TaskForceInfo.TaskList <= 0 then
return
end
for _, var in ipairs(TaskForceInfo.TaskList) do
if var.TaskId == resp.TaskId then
var.Status = XTaskForceManager.TaskForceTaskStatus.Complete
break
end
end
XEventManager.DispatchEvent(XEventId.EVENT_TASKFORCE_TASKFINISH_REQUEST, { taskId })
end)
end
--请求领取奖励
function XTaskForceManager.AcceptTaskForceRewardRequest(taskId, callback)
XNetwork.Call(XTaskForceRequest.AcceptTaskForceRewardRequest, { TaskId = taskId }, function(resp)
if resp.Code ~= XCode.Success then
XUiManager.TipCode(resp.Code)
return
end
if not TaskForceInfo then
return
end
if not TaskForceInfo.TaskList or #TaskForceInfo.TaskList <= 0 then
return
end
TaskForceInfo.TaskList = resp.TaskList
local result = {}
result.DropList = {}
result.ExtraRewardList = {}
result.Rewards = {}
if resp.DropList and #resp.DropList > 0 then
result.IsBigReward = true
for _, var in ipairs(resp.DropList) do
table.insert(result.DropList, var)
end
end
if resp.ExtraRewardList and #resp.ExtraRewardList > 0 then
for _, var in ipairs(resp.ExtraRewardList) do
table.insert(result.ExtraRewardList, var)
end
end
if resp.RewardList and #resp.RewardList > 0 then
for _, var in ipairs(resp.RewardList) do
table.insert(result.Rewards, var)
end
end
if callback then
callback(result)
end
XEventManager.DispatchEvent(XEventId.EVENT_TASKFORCE_ACCEPT_REWARD_REQUEST)
end)
end
XTaskForceManager.ShowMaxTaskForceTeamCountChangeTips = false
XTaskForceManager.ShowMaxTaskForceCountChangeTips = false
--消息推送
function XTaskForceManager.TaskForceInfoNotify(data)
if TaskForceInfo and TaskForceInfo.ConfigIndex then
if data.TaskForceInfo.ConfigIndex ~= TaskForceInfo.ConfigIndex then
XTaskForceManager.ShowMaxTaskForceTeamCountChangeTips = true
end
end
TaskForceInfo = data.TaskForceInfo
NextRefreshTime = data.NextRefreshTime
XEventManager.DispatchEvent(XEventId.EVENT_TASKFORCE_INFO_NOTIFY)
end
--章节变化
function XTaskForceManager.TaskForceSectionChangeNotify(data)
if not TaskForceInfo then
return
end
TaskForceInfo.SectionId = data.SectionId
XEventManager.DispatchEvent(XEventId.EVENT_TASKFORCE_SECTIONCHANGE_NOTIFY)
end
--可派遣队伍最大数量改变通知
function XTaskForceManager.MaxTaskForceCountChangeNotify(data)
if not TaskForceInfo then
return
end
if TaskForceCountConfig and TaskForceCountConfig[data.MaxTaskForceCount] then
local config = TaskForceCountConfig[data.MaxTaskForceCount]
TaskForceInfo.ConfigIndex = config.Id
end
XEventManager.DispatchEvent(XEventId.EVENT_TASKFORCE_MAXTASKFORCECOUNT_CHANGE_NOTIFY)
end
--任务完成
function XTaskForceManager.TaskForceCompleteNotify(data)
if not TaskForceInfo then
return
end
local taskList = data.TaskList
for _, taskId in ipairs(taskList) do
XTaskForceManager.CompletedTaskForceTask(taskId)
end
XEventManager.DispatchEvent(XEventId.EVENT_TASKFORCE_COMPLETE_NOTIFY, data.TaskList)
end
function XTaskForceManager.HandlerPlayTipMission()
if XDataCenter.TaskForceManager.ShowMaxTaskForceTeamCountChangeTips then
local missionData = XDataCenter.TaskForceManager.GetTaskForeInfo()
local taskForeCfg = XDataCenter.TaskForceManager.GetTaskForceConfigById(missionData.ConfigIndex)
XUiManager.TipMsg(string.format(CS.XTextManager.GetText("MissionTaskTeamCountContent"), taskForeCfg.MaxTaskForceCount), nil, function()
XEventManager.DispatchEvent(XEventId.EVENT_TASKFORCE_TIP_MISSION_END)
end)
XDataCenter.TaskForceManager.ShowMaxTaskForceTeamCountChangeTips = false
return true
end
return false
end
---------------------------------------
local Condition = {
[18105] = function(condition, characterId) -- 派遣中拥有指定数量指定兵种构造
local character = XDataCenter.CharacterManager.GetCharacter(characterId)
local npcId = XCharacterConfigs.GetCharNpcId(character.Id, character.Quality)
local npcTemplate = CS.XNpcManager.GetNpcTemplate(npcId)
if npcTemplate.Type == condition.Params[1] then
return true
end
return false, condition.Desc
end,
[18106] = function() -- 派遣中拥有指定数量达到指定战斗力的构造体
return true
end,
[18107] = function(condition, characterId) -- 派遣中拥有指定数量达到指定品质的构造体
local character = XDataCenter.CharacterManager.GetCharacter(characterId)
if character.Quality >= condition.Params[1] then
return true
end
return false, condition.Desc
end,
[18108] = function(condition, characterId) -- 派遣中拥有指定数量达到指定等级的构造体
local character = XDataCenter.CharacterManager.GetCharacter(characterId)
return character.Level >= condition.Params[1], condition.Desc
end,
[18109] = function(condition, characterId) -- 派遣中拥有指定数量指定性别的构造体
local characterTemplate = XCharacterConfigs.GetCharacterTemplate(characterId)
return characterTemplate.Sex == condition.Params[1], condition.Desc
end,
[18110] = function(condition, characterId) -- 派遣中拥有构造体
if characterId == condition.Params[1] then
return true
end
return false, condition.Desc
end,
}
---检查单个
function XTaskForceManager.CheckCondition(conditionId, characterId)
local template = XConditionManager.GetConditionTemplate(conditionId)
if not template then
XLog.ErrorTableDataNotFound("XTaskForceManager.CheckCondition", "template",
"Share/Condition/Condition.tab", "conditionId", tostring(conditionId))
return false
end
local func = Condition[template.Type]
if not func then
local tempStr = "XConditionManager.CheckCharacterCondition错误无法根据Share/Condition/Condition.tab 表中conditionId"
XLog.Error(tempStr .. conditionId .. " 的type" .. template.Type .. "找到Condition对应的函数")
return false
end
return func(template, characterId)
end
---检查需求人数
function XTaskForceManager.GetConditionRequireMember(conditionId)
local template = XConditionManager.GetConditionTemplate(conditionId)
if not template then
XLog.ErrorTableDataNotFound("XTaskForceManager.GetConditionRequireMember",
"template", "Share/Condition/Condition.tab", "conditionId", tostring(conditionId))
return 0
end
if template.Type >= 18105 and template.Type < 18110 then
return template.Params[2]
end
return 1
end
------
XTaskForceManager.Init()
return XTaskForceManager
end
XRpc.TaskForceInfoNotify = function(data)
XDataCenter.TaskForceManager.TaskForceInfoNotify(data)
end
XRpc.TaskForceSectionChangeNotify = function(data)
XDataCenter.TaskForceManager.TaskForceSectionChangeNotify(data)
end
XRpc.MaxTaskForceCountChangeNotify = function(data)
XDataCenter.TaskForceManager.MaxTaskForceCountChangeNotify(data)
end
XRpc.TaskForceCompleteNotify = function(data)
XDataCenter.TaskForceManager.TaskForceCompleteNotify(data)
end