PGRData/Resources/Scripts/XManager/XConditionManager.lua

1332 lines
52 KiB
Lua
Raw Normal View History

2022-12-26 08:36:01 +00:00
local tableUnpack = table.unpack
XConditionManager = XConditionManager or {}
local TABLE_CONDITION_PATH = "Share/Condition/Condition.tab"
local ConditionTemplate = {}
local DefaultRet = true
XConditionManager.ConditionType = {
Unknown = 0,
Player = 1,
Character = 13,
Team = 18,
Kill = 30,
Equip = 31,
Activity = 40,
Formula = 41,--国服代码提前搬迁
}
local PlayerCondition
PlayerCondition = {
[10101] = function(condition) -- 查询玩家等级是否达标
return XPlayer.Level >= condition.Params[1], condition.Desc
end,
[10102] = function(condition) -- 查询玩家是否拥有指定角色
return XDataCenter.CharacterManager.IsOwnCharacter(condition.Params[1]), condition.Desc
end,
[10103] = function(condition) -- 查询玩家是否拥有指定数量的角色
return #XDataCenter.CharacterManager.GetOwnCharacterList() >= condition.Params[1], condition.Desc
end,
[10104] = function(condition) -- 查询玩家背包是否有容量
local ret, desc = PlayerCondition[12101](condition)
if not ret then
return ret, desc
end
return PlayerCondition[12102](condition)
end,
[10105] = function(condition) -- 查询玩家是否通过指定得关卡
local stageId = condition.Params[1]
-- local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
-- if stageInfo then
-- return stageInfo.Passed, condition.Desc
-- else
-- return true, condition.Desc
-- end
local flag = XDataCenter.FubenManager.CheckStageIsPass(stageId)
return flag, condition.Desc
end,
[10106] = function(condition)--至少拥有其中一个角色
if condition.Params and #condition.Params > 0 then
for i = 1, #condition.Params do
local isOwnCharacter = XDataCenter.CharacterManager.IsOwnCharacter(condition.Params[i])
if isOwnCharacter then
return true, condition.Desc
end
end
end
return false, condition.Desc
end,
[10107] = function(condition) -- 查询玩家等级是否小于等于n
return XPlayer.Level <= condition.Params[1], condition.Desc
end,
[10108] = function(condition) -- 查询玩家是否通过指定得关卡
local stageId = condition.Params[1]
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
if stageInfo then
return (not stageInfo.Passed), condition.Desc
else
return false, condition.Desc
end
end,
[10109] = function(condition) --查询玩家是否拥有战力X的角色数量
local needCount = condition.Params[1]
local needAbility = condition.Params[2]
local curCount = XDataCenter.CharacterManager.GetCharacterCountByAbility(needAbility)
if (curCount >= needCount) then
return true, condition.Desc
else
return false, condition.Desc
end
end,
[10110] = function(condition) -- 查询玩家是否有某个勋章
return XPlayer.IsMedalUnlock(condition.Params[1]), condition.Desc
end,
[10111] = function(condition) -- 查询玩家是否完成过某个任务
local task = XDataCenter.TaskManager.GetTaskDataById(condition.Params[1])
return task and task.State == XDataCenter.TaskManager.TaskState.Finish or false, condition.Desc
end,
[10112] = function(condition) -- 单挑Boss奖励是否领取活动是否开启
local isCurActivity = XDataCenter.FubenActivityBossSingleManager.GetCurActivityId() == condition.Params[1]
local isFinish = XDataCenter.FubenActivityBossSingleManager.CheckRewardIsFinish(condition.Params[2])
if XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.FubenActivitySingleBoss) and isFinish and isCurActivity then
return true, condition.Desc
end
return false, condition.Desc
end,
[10114] = function(condition) -- 世界boss属性关完成数量
local worldBossActivity = XDataCenter.WorldBossManager.GetCurWorldBossActivity()
if worldBossActivity then
local finishStageCount = worldBossActivity:GetFinishStageCount()
if finishStageCount >= condition.Params[1] then
return true, condition.Desc
end
end
return false, condition.Desc
end,
[10115] = function(condition) -- 世界boss血量低于xx(百分比)
local bossArea = XDataCenter.WorldBossManager.GetBossAreaById(condition.Params[1])
if bossArea then
local hpPercent = bossArea:GetHpPercent()
if hpPercent * 100 <= condition.Params[2] then
return true, condition.Desc
end
end
return false, condition.Desc
end,
[10118] = function(condition) -- 判断玩家是否完成预热关拼图
local puzzleId = condition.Params[1]
if XDataCenter.FubenActivityPuzzleManager.GetPuzzleStateById(puzzleId) == XFubenActivityPuzzleConfigs.PuzzleState.Complete then
return true, condition.Desc
end
return false, condition.Desc
end,
[10119] = function(condition) -- 判断是否完成跑团TRPG某个目标
local targetId = condition.Params[1]
if XDataCenter.TRPGManager.IsTargetFinish(targetId) then
return true, condition.Desc
end
return false, condition.Desc
end,
[10120] = function(condition) -- 判断尼尔角色等级是否达标
local characterId = condition.Params[1]
local nieRCharacter = XDataCenter.NieRManager.GetNieRCharacterByCharacterId(characterId)
if nieRCharacter and (nieRCharacter:GetNieRCharacterLevel() >= condition.Params[2]) then
return true, condition.Desc
end
return false, condition.Desc
end,
[10121] = function(condition) -- 判断尼尔辅助机等级是否达标
local targetLevel = condition.Params[1]
local nieRPOd = XDataCenter.NieRManager.GetNieRPODData()
if nieRPOd and (nieRPOd:GetNieRPODLevel() >= targetLevel) then
return true, condition.Desc
end
return false, condition.Desc
end,
[10122] = function(condition) -- 判断尼尔辅助机技能等级是否达标
local skillId = condition.Params[1]
local skillLevel = condition.Params[2]
local nieRPOd = XDataCenter.NieRManager.GetNieRPODData()
if nieRPOd and (nieRPOd:GetNieRPODSkillLevelById(skillId) >= skillLevel) then
return true, condition.Desc
end
return false, condition.Desc
end,
[10123] = function(condition)
local result = XDataCenter.RegressionManager.IsRegressionActivityOpen(XRegressionConfigs.ActivityType.Task)
return result, condition.Desc
end,
[10126] = function(condition)--玩家是否完成跑团TRPG某迷宫卡牌
local mazeId = condition.Params[1]
local layerId = condition.Params[2]
local cardId = condition.Params[3]
if XDataCenter.TRPGManager.IsMazeCardFinished(mazeId, layerId, cardId) then
return true, condition.Desc
end
return false, condition.Desc
end,
[10127] = function(condition)--判断玩家合成小游戏活动进度是否达标
local schedule = condition.Params[1]
local gameId = condition.Params[2]
local game = XDataCenter.ComposeGameManager.GetGameById(gameId)
if game then
local currentSchedule = game:GetCurrentSchedule()
return currentSchedule >= schedule, condition.Desc
end
return false, condition.Desc
end,
[10128] = function(condition)--超级据点拥有矿工数量
local requireCount = condition.Params[1] or 0
local haveCount = XDataCenter.StrongholdManager.GetMinerCount()
return haveCount >= requireCount, condition.Desc, haveCount, requireCount
end,
[10129] = function(condition)--超级据点拥有矿石数量
local requireCount = condition.Params[1]
local haveCount = XDataCenter.StrongholdManager.GetTotalMineralCount()
return haveCount >= requireCount, condition.Desc, haveCount, requireCount
end,
[10130] = function(condition)--超级据点完成据点数量
local requireCount = condition.Params[1]
local haveCount = XDataCenter.StrongholdManager.GetFinishGroupCount()
return haveCount >= requireCount, condition.Desc, haveCount, requireCount
end,
[10131] = function(condition)--超级据点完成某个据点
local groupId = condition.Params[1]
local isfinished = XDataCenter.StrongholdManager.IsGroupFinished(groupId)
return isfinished, condition.Desc
end,
[10132] = function(condition)--超级据点矿石预计产出
local requireCount = condition.Params[1]
local haveCount = XDataCenter.StrongholdManager.GetPredictTotalMineralCount()
return haveCount >= requireCount, condition.Desc, haveCount, requireCount
end,
[10133] = function(condition, ...)--超级据点队伍是否满员
local args = { ... }
local teamList = args and args[1]
local isfinished = XDataCenter.StrongholdManager.CheckCurGroupTeamFull(teamList)
return isfinished, condition.Desc
end,
[10134] = function(condition, ...)--超级据点队伍列表平均战力是否符合要求
local requireCount = condition.Params[1]
local args = { ... }
local teamList = args and args[1]
local isfinished, averageAbility = XDataCenter.StrongholdManager.CheckTeamListAverageAbility(requireCount, teamList)
return isfinished, condition.Desc .. "/" .. math.floor(averageAbility)
end,
[10135] = function(condition)--超级据点未完成某个据点
local groupId = condition.Params[1]
local isfinished = XDataCenter.StrongholdManager.IsGroupFinished(groupId)
return not isfinished, condition.Desc
end,
[10139] = function(condition)--玩家是否未完成跑团TRPG某迷宫卡牌
local mazeId = condition.Params[1]
local layerId = condition.Params[2]
local cardId = condition.Params[3]
if XDataCenter.TRPGManager.IsMazeCardFinished(mazeId, layerId, cardId) then
return false, condition.Desc
end
return true, condition.Desc
end,
[10140] = function(condition)--超级据点当前活动阶段是否满足任一参数1, --开启中2, --战斗开启3, --战斗结束4, --已结束)
local isfinished = false
for _, status in pairs(condition.Params) do
if status > 0 and XDataCenter.StrongholdManager.CheckActivityStatus(status) then
isfinished = true
break
end
end
return isfinished, condition.Desc
end,
[10141] = function(condition)--Rpg爬塔玩法是否当前队伍等级高于参照值
local needLevel = condition.Params[1]
local reachLevel = XDataCenter.RpgTowerManager.GetCurrentLevel() >= needLevel
return reachLevel, condition.Desc
end,
[10142] = function(condition)--是否拥有某个伙伴
local templateId = condition.Params[1]
local IsUnLock = XDataCenter.ArchiveManager.GetPartnerUnLockById(templateId)
return IsUnLock, condition.Desc
end,
[10143] = function(condition)--是否完成翻牌小游戏某个关卡
local activityId = condition.Params[1]
local stageId = condition.Params[2]
return XDataCenter.InvertCardGameManager.CheckActivityStageFinished(activityId, stageId), condition.Desc
end,
[10144] = function(condition) -- 判断杀戮无双难度星数
local diff = condition.Params[1]
local star = condition.Params[2]
local curStar = XDataCenter.KillZoneManager.GetTotalStageStarByDiff(diff)
return curStar >= star, condition.Desc
end,
[10145] = function(condition) -- 判断超级爬塔通关目标关卡进度
local targetStageId = condition.Params[1]
local progress = condition.Params[2]
local stageManager = XDataCenter.SuperTowerManager.GetStageManager()
if not stageManager then return false end
local stStage = stageManager:GetTargetStageByStStageId(targetStageId)
if not stStage then return false end
return stStage:GetCurrentProgress() >= progress, condition.Desc
end,
[10146] = function(condition,...) -- 或条件判断通过特定13章探索模型XX节点或通关指定id副本
local tempCondition1 = {Params = {[1] = condition.Params[1]}}
local tempCondition2 = {Params = {[1] = condition.Params[2]}}
local ret1 = PlayerCondition[10105](tempCondition1)
local ret2 = PlayerCondition[10119](tempCondition2)
local ret = ret1 or ret2
return ret, condition.Desc
end,
[11101] = function(condition) -- 查询指定道具数量是否达标
return XDataCenter.ItemManager.CheckItemCountById(condition.Params[1], condition.Params[2]), condition.Desc
end,
[11102] = function(condition)--查询玩家角色解放阶段是否达到
return XDataCenter.ExhibitionManager.IsAchieveLiberation(condition.Params[1], condition.Params[2]), condition.Desc
end,
[11103] = function(condition) -- 查询玩家是否领取首充奖励
return XDataCenter.PayManager.GetFirstRechargeReward(), condition.Desc
end,
[11104] = function(condition) -- 查询玩家是否拥有某个时装
return XDataCenter.FashionManager.CheckHasFashion(condition.Params[1]), condition.Desc
end,
[11105] = function(condition) -- 查询玩家是否不拥有某个时装
return not XDataCenter.FashionManager.CheckHasFashion(condition.Params[1]), condition.Desc
end,
[11106] = function(condition) -- 查询玩家是否通过某个试验区关卡填试验区ID
return XDataCenter.FubenExperimentManager.CheckExperimentIsFinish(condition.Params[1]), condition.Desc
end,
[11108] = function(condition) -- 查询玩家复刷关等级是否达到
return XDataCenter.FubenRepeatChallengeManager.IsLevelReach(condition.Params[1]), condition.Desc
end,
[11109] = function(condition) -- 查询玩家在指定时间内通过某个关卡
if not condition.Params or #condition.Params < 2 then
return false, condition.Desc
end
local stageId = condition.Params[1]
local stageData = XDataCenter.FubenManager.GetStageData(stageId)
if not stageData then
return false, condition.Desc
end
if stageData.BestRecordTime <= 0 or stageData.BestRecordTime > condition.Params[2] then
return false, condition.Desc
end
return true, condition.Desc
end,
[11110] = function(condition) -- 查询玩家在本期巴别塔活动中的分数是否超过某个值
local count = condition.Params[1]
local _, maxLevel = XDataCenter.FubenBabelTowerManager.GetCurrentActivityScores()
if maxLevel >= count then
return true, condition.Desc
end
return false, condition.Desc
end,
[11111] = function(condition) --查询当前爬塔达到的最高层数
local curMaxTier = XDataCenter.FubenRogueLikeManager.GetHistoryMaxTier()
if condition and condition.Params[1] then
return curMaxTier >= condition.Params[1], condition.Desc
end
return false, condition.Desc
end,
[11112] = function(condition) --查询玩家是否拥有某个永久武器时装
local id = condition.Params[1]
local ret = XDataCenter.WeaponFashionManager.CheckHasFashion(id)
and not XDataCenter.WeaponFashionManager.IsFashionTimeLimit(id)
return ret, condition.Desc
end,
[11113] = function(condition) --查询玩家是否不拥有某个永久武器时装
local id = condition.Params[1]
local ret = not XDataCenter.WeaponFashionManager.CheckHasFashion(id)
or XDataCenter.WeaponFashionManager.IsFashionTimeLimit(id)
return ret, condition.Desc
end,
[11114] = function(condition)--查询玩家是否拥有一堆时装中的某一个
local ret = false
for _, fashionId in pairs(condition.Params) do
ret = XDataCenter.WeaponFashionManager.CheckHasFashion(fashionId)
and not XDataCenter.WeaponFashionManager.IsFashionTimeLimit(fashionId)
if ret then
break
end
end
return ret, condition.Desc
end,
[11117] = function(condition)--查询玩家是否拥指定ID的场景
local ret = false
ret = XDataCenter.PhotographManager.CheckSceneIsHaveById(condition.Params[1])
return ret, condition.Desc
end,
[12101] = function(condition) -- 查询武器库是否有容量
return XDataCenter.EquipManager.CheckMaxCount(XEquipConfig.Classify.Weapon), condition.Desc
end,
[12102] = function(condition) -- 查询意识库是否有容量
return XDataCenter.EquipManager.CheckMaxCount(XEquipConfig.Classify.Awareness), condition.Desc
end,
[21101] = function(condition) -- 查询玩家是否购买月卡
local isGot = true
local uiType = condition.Params[1]
local id = condition.Params[2]
if XDataCenter.PurchaseManager.IsYkBuyed(uiType, id) then
local data = XDataCenter.PurchaseManager.GetYKInfoData(uiType, id)
if data then
isGot = data.IsDailyRewardGet
end
end
return not isGot, condition.Desc
end,
[21102] = function(condition) -- 查询玩家是否未领取首充奖励
return not XDataCenter.PayManager.GetFirstRechargeReward(), condition.Desc
end,
[22001] = function(condition) -- 红包活动ID下指定NPC累计获得的物品数量
local count = condition.Params[1]
local itemId = condition.Params[2]
local activityId = condition.Params[3]
local npcId = condition.Params[4]
local total = XDataCenter.ItemManager.GetRedEnvelopeCertainNpcItemCount(activityId, npcId, itemId)
return total >= count, condition.Desc
end,
[23001] = function(condition) -- 判断服务器时间是否达到某个开始时间
local timeId = condition.Params[1]
return XFunctionManager.CheckInTimeByTimeId(timeId), condition.Desc
end,
[15101] = function(condition)
local nodeId = condition.Params[1]
local cfg = XFubenExploreConfigs.GetLevel(nodeId)
if not cfg then
return false, condition.Desc
end
return XDataCenter.FubenExploreManager.IsNodeFinish(cfg.ChapterId, nodeId), condition.Desc
end,
[15102] = function(condition)
local chapterId = condition.Params[1]
local chapterData = XDataCenter.FubenAssignManager.GetChapterDataById(chapterId)
return (chapterData and chapterData:IsPass()), condition.Desc
end,
[15106] = function(condition)
local count = condition.Params[1]
local myCount = XDataCenter.ArenaOnlineManager.GetFirstPassCount()
return myCount >= count, condition.Desc
end,
[15110] = function(condition) --查询纷争战区是否开启
return XDataCenter.ArenaManager.IsPlayerCanEnterFight(), condition.Desc
end,
[15111] = function(condition) --幻痛囚笼是否开启
return XDataCenter.FubenBossSingleManager.IsBossSingleOpen(), condition.Desc
end,
[15200] = function(condition) -- 主线普通与隐藏模式的收集进度是否均达到100%
local chapterMainId = condition.Params[1]
local chapterMain = XDataCenter.FubenMainLineManager.GetChapterMainTemplate(chapterMainId)
local NorProgress = XDataCenter.FubenMainLineManager.GetProgressByChapterId(chapterMain.ChapterId[1])
local DiffProgress = XDataCenter.FubenMainLineManager.GetProgressByChapterId(chapterMain.ChapterId[2])
if NorProgress >= condition.Params[2] and DiffProgress >= condition.Params[2] then
return true, condition.Desc
end
return false, condition.Desc
end,
[15201] = function(condition) -- 外篇普通与隐藏模式的收集进度是否均达到100%
local chapterMainId = condition.Params[1]
local chapterMain = XDataCenter.ExtraChapterManager.GetChapterCfg(chapterMainId)
local NorProgress = XDataCenter.ExtraChapterManager.GetProgressByChapterId(chapterMain.ChapterId[1])
local DiffProgress = XDataCenter.ExtraChapterManager.GetProgressByChapterId(chapterMain.ChapterId[2])
if NorProgress >= condition.Params[2] and DiffProgress >= condition.Params[2] then
return true, condition.Desc
end
return false, condition.Desc
end,
[15202] = function(condition) -- 是否通关周目章节
local lastStage = XFubenZhouMuConfigs.GetZhouMuChapterLastStage(condition.Params[1])
local flag = XDataCenter.FubenManager.CheckStageIsPass(lastStage)
return flag, condition.Desc
end,
[16100] = function(condition) --查询公会等级是否达到(服务端未实现)
if not XDataCenter.GuildManager.IsJoinGuild() then return false, condition.Desc end
local guildLevel = XDataCenter.GuildManager.GetGuildLevel()
if condition.Params and condition.Params[1] > 0 and guildLevel >= condition.Params[1] then
return true, condition.Desc
end
return false, condition.Desc
end,
[22002] = function(condition) --查询公会职务是否与参数中任一值匹配
if not XDataCenter.GuildManager.IsJoinGuild() then return false, condition.Desc end
local rankLevel = XDataCenter.GuildManager.GetCurRankLevel()
for i = 1, #condition.Params do
if rankLevel == condition.Params[i] then
return true, condition.Desc
end
end
return false, condition.Desc
end,
[10117] = function(condition) -- 查询玩家荣耀勋阶是否达标
return XPlayer.GetHonorLevel() >= condition.Params[1], condition.Desc
end,
[10124] = function(condition)
local wave = XDataCenter.ExpeditionManager.GetWave()
return wave and wave >= condition.Params[1]
end,
[10125] = function(condition)
local recruitLevel = XDataCenter.ExpeditionManager.GetRecruitLevel()
return recruitLevel and recruitLevel >= condition.Params[1]
end,
[15301] = function(condition) --追击玩法
local mapId = condition.Params[1]
local mapDb = XDataCenter.ChessPursuitManager.GetChessPursuitMapDb(mapId)
if mapDb and mapDb:IsKill() then
return true
else
return false, condition.Desc
end
end,
[15302] = function(condition) --追击玩法
local mapId = condition.Params[1]
local killBossCount = condition.Params[2]
local mapDb = XDataCenter.ChessPursuitManager.GetChessPursuitMapDb(mapId)
if mapDb and mapDb:IsKill() then
return mapDb:GetWinForBattleCount() <= killBossCount
else
return false, condition.Desc
end
end,
[15303] = function(condition) --追击玩法:是否布过阵
for i, mapId in ipairs(condition.Params) do
local mapDb = XDataCenter.ChessPursuitManager.GetChessPursuitMapDb(mapId)
if mapDb and not mapDb:NeedBuZhen() then
return true
end
end
end,
[15304] = function(condition) --骇入玩法:查询研发等级是否达到
if XDataCenter.FubenHackManager.GetIsActivityEnd() then return false end
return condition.Params[1] >= XDataCenter.FubenHackManager.GetLevel()
end,
}
local CharacterCondition = {
[13101] = function(condition, characterId) -- 查询角色性别是否符合
if type(characterId) ~= "number" then
characterId = characterId.Id
end
local characterTemplate = XCharacterConfigs.GetCharacterTemplate(characterId)
return characterTemplate.Sex == condition.Params[1], condition.Desc
end,
[13102] = function(condition, characterId) -- 查询角色类型是否符合
local character = characterId
if type(characterId) == "number" then
character = XDataCenter.CharacterManager.GetCharacter(characterId)
end
local npcId = XCharacterConfigs.GetCharNpcId(character.Id, character.Quality)
local npcTemplate = CS.XNpcManager.GetNpcTemplate(npcId)
for i = 1, #condition.Params do
if npcTemplate.Type == condition.Params[i] then
return true
end
end
return false, condition.Desc
end,
[13103] = function(condition, characterId) -- 查询角色是否符合等级
local character = XDataCenter.CharacterManager.GetCharacter(characterId)
return character.Level >= condition.Params[1], condition.Desc
end,
[13104] = function(condition, characterId) -- 查询单个角色类型是否符合
local character = characterId
if type(characterId) == "number" then
character = XDataCenter.CharacterManager.GetCharacter(characterId)
end
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,
[13105] = function(condition, characterId) -- 查询单个角色品质是否符合
local character = characterId
if type(characterId) == "number" then
character = XDataCenter.CharacterManager.GetCharacter(characterId)
end
if character.Quality >= condition.Params[1] then
return true
end
return false, condition.Desc
end,
[13106] = function(condition, characterId) -- 查询拥有构造体
if characterId == condition.Params[1] then
return true
end
return false, condition.Desc
end,
[13107] = function(condition, characterId) --查询角色是否符合Grade等级要求
local character = nil
if type(characterId) == "number" then
character = XDataCenter.CharacterManager.GetCharacter(characterId)
end
if not character then
return false, condition.Desc
end
if character.Grade >= condition.Params[1] then
return true
end
return false, condition.Desc
end,
[13108] = function(condition, characterId) --查询角色战力是否满足
local character = XDataCenter.CharacterManager.GetCharacter(characterId)
if character.Ability >= condition.Params[1] then
return true, condition.Desc
end
return false, condition.Desc
end,
[13109] = function(condition, characterId) --查询角色是否佩戴共鸣技能
local starLimit = condition.Params[1]
local limitSkillNum = condition.Params[2]
local allSkillNum = 0
local weaponData = XDataCenter.EquipManager.GetCharacterWearingWeaponId(characterId)
local equipInfo = XDataCenter.EquipManager.GetEquip(weaponData)
local star = XDataCenter.EquipManager.GetEquipStar(equipInfo.TemplateId)
if star >= starLimit then
if equipInfo.ResonanceInfo ~= nil then
for _, info in pairs(equipInfo.ResonanceInfo) do
if info.CharacterId == characterId then
allSkillNum = allSkillNum + 1
end
end
end
end
local awarenessData = XDataCenter.EquipManager.GetCharacterWearingAwarenessIds(characterId)
for _, equipId in pairs(awarenessData) do
local equipInfo2 = XDataCenter.EquipManager.GetEquip(equipId)
local star2 = XDataCenter.EquipManager.GetEquipStar(equipInfo2.TemplateId)
if star2 >= starLimit then
if equipInfo2.ResonanceInfo ~= nil then
for _, info in pairs(equipInfo2.ResonanceInfo) do
if info.CharacterId == characterId then
allSkillNum = allSkillNum + 1
end
end
end
end
end
if allSkillNum >= limitSkillNum then
return true, condition.Desc
end
return false, condition.Desc
end,
[13110] = function(condition, characterId) --角色武器共鸣技能数
if not condition.Params or #condition.Params ~= 2 then
return false, condition.Desc
end
local resonanceCount = 0
local weaponData = XDataCenter.EquipManager.GetCharacterWearingWeaponId(characterId)
local equipInfo = XDataCenter.EquipManager.GetEquip(weaponData)
if equipInfo.ResonanceInfo ~= nil then
for _, info in pairs(equipInfo.ResonanceInfo) do
local quality = XDataCenter.EquipManager.GetEquipQuality(equipInfo.TemplateId)
if info.CharacterId == characterId and quality >= condition.Params[1] then
resonanceCount = resonanceCount + 1
end
if resonanceCount > condition.Params[2] then
return true, condition.Desc
end
end
end
return false, condition.Desc
end,
[13111] = function(condition, characterId) --角色意识共鸣技能数
if not condition.Params or #condition.Params ~= 2 then
return false, condition.Desc
end
local weaponData = XDataCenter.EquipManager.GetCharacterWearingAwarenessIds(characterId)
local resonanceCount = 0
for _, equipId in pairs(weaponData) do
local equipInfo = XDataCenter.EquipManager.GetEquip(equipId)
if equipInfo.ResonanceInfo ~= nil then
for _, info in pairs(equipInfo.ResonanceInfo) do
local quality = XDataCenter.EquipManager.GetEquipQuality(equipInfo.TemplateId)
if info.CharacterId == characterId and quality >= condition.Params[1] then
resonanceCount = resonanceCount + 1
end
if resonanceCount > condition.Params[2] then
return true, condition.Desc
end
end
end
end
return false, condition.Desc
end,
[13112] = function(condition, characterId) --角色指定id武器共鸣技能数
if not condition.Params or #condition.Params ~= 2 then
return false, condition.Desc
end
local weaponData = XDataCenter.EquipManager.GetCanUseWeaponIds(characterId)
local resonanceCount = 0
local equipInfo = nil
for _, equipId in pairs(weaponData) do
if equipId == condition.Params[1] then
equipInfo = XDataCenter.EquipManager.GetEquip(equipId)
end
if equipInfo then
if equipInfo.ResonanceInfo ~= nil then
for _, info in pairs(equipInfo.ResonanceInfo) do
if info.CharacterId == characterId then
resonanceCount = resonanceCount + 1
end
if resonanceCount > condition.Params[2] then
return true, condition.Desc
end
end
end
end
end
return false, condition.Desc
end,
[13113] = function(condition) --判断是否是好感度最高的构造体
if not condition.Params or #condition.Params < 1 then
return false, condition.Desc
end
local id = XDataCenter.FavorabilityManager.GetHighestTrustExpCharacter()
for _, roleId in pairs(condition.Params) do
if id == roleId then
return true
end
end
return false, condition.Desc
end,
[13114] = function(condition, characterId) -- 构造体是否终解
local character = XDataCenter.CharacterManager.GetCharacter(characterId)
if not character then
return false, condition.Desc
end
local growUpLevel = XDataCenter.ExhibitionManager.GetCharacterGrowUpLevel(character.Id)
return (XDataCenter.ExhibitionManager.IsMaxLiberationLevel(growUpLevel)), condition.Desc
end,
[13115] = function(condition, characterId) -- 构造体是否类型相符(构造体,感染体)
local character = characterId
if type(characterId) == "number" then
character = XDataCenter.CharacterManager.GetCharacter(characterId)
end
local charType = XCharacterConfigs.GetCharacterType(character.Id)
if charType == condition.Params[1] then
return true
end
return false, condition.Desc
end,
[59001] = function(condition) --查询猜拳小游戏对应关卡是否通关
local stageId = condition.Params[1]
local stage = XDataCenter.FingerGuessingManager.GetStageByStageId(stageId)
if stage then
return stage:GetIsClear(), condition.Desc
end
return false, condition.Desc
end,
}
local TeamCondition = {
[18101] = function(condition, characterIds) -- 查询队伍角色性别是否符合
local ret, desc = true, nil
if type(characterIds) == "table" then
for _, id in pairs(characterIds) do
if id > 0 then
ret, desc = CharacterCondition[13101](condition, id)
if not ret then
break
end
end
end
else
XTool.LoopCollection(characterIds, function(id)
if id > 0 then
if ret then
ret, desc = CharacterCondition[13101](condition, id)
end
end
end)
end
return ret, desc
end,
[18102] = function(condition, characterIds) -- 查询队伍角色类型是否符合
local ret, desc = true, nil
if type(characterIds) == "table" then
for _, id in pairs(characterIds) do
if id > 0 then
ret, desc = CharacterCondition[13102](condition, id)
if not ret then
break
end
end
end
else
XTool.LoopCollection(characterIds, function(id)
if id > 0 then
ret, desc = CharacterCondition[13102](condition, id)
if ret then
ret, desc = CharacterCondition[13101](condition, id)
end
end
end)
end
return ret, desc
end,
[18103] = function(condition, characterIds) -- 查询队伍是否拥有指定角色数量
local chechCount = condition.Params[1] or 1
local total = 0
if type(characterIds) == "table" then
for i = 2, #condition.Params do
for _, id in pairs(characterIds) do
if id > 0 then
if id == condition.Params[i] then
total = total + 1
break
end
end
end
if total >= chechCount then
break
end
end
else
for i = 2, #condition.Params do
XTool.LoopCollection(characterIds, function(id)
if id > 0 then
if id == condition.Params[i] then
total = total + 1
end
end
end)
if total >= chechCount then
break
end
end
end
return total >= chechCount, condition.Desc
end,
[18104] = function(condition, characterIds) -- 查询队伍是否已拥有指定角色数量
if type(characterIds) == "table" then
for i = 1, #condition.Params do
for _, id in pairs(characterIds) do
if id > 0 then
if id == condition.Params[i] then
return false, condition.Desc
end
end
end
end
else
for i = 2, #condition.Params do
XTool.LoopCollection(characterIds, function(id)
if id > 0 then
if id == condition.Params[i] then
return false, condition.Desc
end
end
end)
end
end
return true, condition.Desc
end,
[18105] = function(condition, characterIds) -- 派遣中拥有指定数量指定兵种构造
local ret = true
local chechCount = condition.Params[2] or 1
local total = 0
if type(characterIds) == "table" then
for _, id in pairs(characterIds) do
if id > 0 then
ret = CharacterCondition[13104](condition, id)
if ret then
total = total + 1
end
end
if total >= chechCount then
break
end
end
else
XTool.LoopCollection(characterIds, function(id)
if id > 0 then
ret = CharacterCondition[13104](condition, id)
if ret then
total = total + 1
end
end
if total >= chechCount then
return
end
end)
end
return total >= chechCount, condition.Desc
end,
[18106] = function(condition, characterIds) -- 派遣中拥有指定数量达到指定战斗力的构造体
local chechCount = condition.Params[2] or 1
local total = 0
if type(characterIds) == "table" then
for _, id in pairs(characterIds) do
local character = XDataCenter.CharacterManager.GetCharacter(id)
if character.Ability >= condition.Params[1] then
total = total + 1
end
end
end
return total >= chechCount, condition.Desc
end,
[18107] = function(condition, characterIds) -- 派遣中拥有指定数量达到指定品质的构造体
local ret = true
local chechCount = condition.Params[2] or 1
local total = 0
if type(characterIds) == "table" then
for _, id in pairs(characterIds) do
if id > 0 then
ret = CharacterCondition[13105](condition, id)
if ret then
total = total + 1
end
end
if total >= chechCount then
break
end
end
else
XTool.LoopCollection(characterIds, function(id)
if id > 0 then
ret = CharacterCondition[13105](condition, id)
if ret then
total = total + 1
end
end
if total >= chechCount then
return
end
end)
end
return total >= chechCount, condition.Desc
end,
[18108] = function(condition, characterIds) -- 派遣中拥有指定数量达到指定等级的构造体
local ret = true
local chechCount = condition.Params[2] or 1
local total = 0
if type(characterIds) == "table" then
for _, id in pairs(characterIds) do
if id > 0 then
ret = CharacterCondition[13103](condition, id)
if ret then
total = total + 1
end
end
if total >= chechCount then
break
end
end
else
XTool.LoopCollection(characterIds, function(id)
if id > 0 then
ret = CharacterCondition[13103](condition, id)
if ret then
total = total + 1
end
end
if total >= chechCount then
return
end
end)
end
return total >= chechCount, condition.Desc
end,
[18109] = function(condition, characterIds) -- 派遣中拥有指定数量指定性别的构造体
local ret = true
local chechCount = condition.Params[2] or 1
local total = 0
if type(characterIds) == "table" then
for _, id in pairs(characterIds) do
if id > 0 then
ret = CharacterCondition[13101](condition, id)
if ret then
total = total + 1
end
end
if total >= chechCount then
break
end
end
else
XTool.LoopCollection(characterIds, function(id)
if id > 0 then
ret = CharacterCondition[13101](condition, id)
if ret then
total = total + 1
end
end
if total >= chechCount then
return
end
end)
end
return total >= chechCount, condition.Desc
end,
[18110] = function(condition, characterIds) -- 派遣中拥有构造体
local ret = true
local chechCount = condition.Params[2] or 1
local total = 0
if type(characterIds) == "table" then
for _, id in pairs(characterIds) do
if id > 0 then
ret = CharacterCondition[13106](condition, id)
if ret then
total = total + 1
end
end
if total >= chechCount then
break
end
end
else
XTool.LoopCollection(characterIds, function(id)
if id > 0 then
ret = CharacterCondition[13106](condition, id)
if ret then
total = total + 1
end
end
if total >= chechCount then
return
end
end)
end
return total >= chechCount, condition.Desc
end,
[18111] = function(condition, characterIds) -- 仅可上阵N个人
local count = condition.Params[1]
local compareType = condition.Params[2]
local total = 0
for _, v in pairs(characterIds) do
if v > 0 then
total = total + 1
end
end
if compareType == XUiCompareType.Equal then--等于
return total == count, condition.Desc
end
if compareType == XUiCompareType.NoLess then--大于等于
return total >= count, condition.Desc
end
return false, condition.Desc
end,
[18112] = function(condition, characterIds) -- 要求队伍中有N个类型构造体
local ret = true
local chechCount = condition.Params[2] or 1
local total = 0
if type(characterIds) == "table" then
for _, id in pairs(characterIds) do
if id > 0 then
ret = CharacterCondition[13115](condition, id)
if ret then
total = total + 1
end
end
if total >= chechCount then
break
end
end
else
XTool.LoopCollection(characterIds, function(id)
if id > 0 then
ret = CharacterCondition[13115](condition, id)
if ret then
total = total + 1
end
end
if total >= chechCount then
return
end
end)
end
return total >= chechCount, condition.Desc
end,
}
local KillCondition = {
[30101] = function(condition, npcId) -- 查询怪物击杀数是否达到
return XDataCenter.ArchiveManager.GetMonsterKillCount(npcId) >= condition.Params[1], condition.Desc
end,
}
local EquipCondition = {
[31101] = function(condition, equipId) -- 是否拥有某个装备
return XDataCenter.ArchiveManager.IsEquipGet(equipId), condition.Desc
end,
[31102] = function(condition, equipId) -- 装备是否达到目标等级
return XDataCenter.ArchiveManager.GetEquipLv(equipId) >= condition.Params[1], condition.Desc
end,
[31103] = function(condition, equipId) -- 武器的突破次数是否达到目标次数
return XDataCenter.ArchiveManager.GetEquipBreakThroughTimes(equipId) >= condition.Params[1], condition.Desc
end,
[31104] = function(condition, suitId) -- 套装中某一个意识的等级是否达到目标等级
local idList = XEquipConfig.GetEquipTemplateIdsBySuitId(suitId)
local targetNum = condition.Params[1]
local isOpen = false
for _, id in ipairs(idList) do
if XDataCenter.ArchiveManager.GetEquipLv(id) >= targetNum then
isOpen = true
break
end
end
return isOpen, condition.Desc
end,
[31105] = function(condition, suitId) -- 套装中某一个意识的突破次数是否达到目标次数
local idList = XEquipConfig.GetEquipTemplateIdsBySuitId(suitId)
local targetNum = condition.Params[1]
local isOpen = false
for _, id in ipairs(idList) do
if XDataCenter.ArchiveManager.GetEquipBreakThroughTimes(id) >= targetNum then
isOpen = true
break
end
end
return isOpen, condition.Desc
end,
[31106] = function(condition, suitId) -- 套装中不同的意识的数量达到目标数量
return XDataCenter.ArchiveManager.GetAwarenessCountBySuitId(suitId) >= condition.Params[1], condition.Desc
end,
}
function XConditionManager.GetConditionType(id)
local template = ConditionTemplate[id]
if not template then
XLog.Error("XConditionManager.GetConditionType error: can not found template, id is " .. id)
return XConditionManager.ConditionType.Unknown
end
-- 0代表公式专用没有范围设置主要是要与服务器逻辑同步
if template.Type == 0 then
return XConditionManager.ConditionType.Formula
elseif template.Type >= 13000 and template.Type < 14000 then
return XConditionManager.ConditionType.Character
elseif template.Type >= 18000 and template.Type < 19000 then
return XConditionManager.ConditionType.Team
elseif template.Type >= 30000 and template.Type < 31000 then
return XConditionManager.ConditionType.Kill
elseif template.Type >= 31000 and template.Type < 32000 then
return XConditionManager.ConditionType.Equip
else
return XConditionManager.ConditionType.Player
end
end
function XConditionManager.Init()
ConditionTemplate = XTableManager.ReadByIntKey(TABLE_CONDITION_PATH, XTable.XTableCondition, "Id")
end
function XConditionManager.GetConditionTemplate(id)
if not ConditionTemplate[id] then
XLog.Error("XConditionManager.GetConditionTemplate config is null " .. id)
return
end
return ConditionTemplate[id]
end
function XConditionManager.CheckCharacterCondition(id, characterId)
local template = ConditionTemplate[id]
if not template then
XLog.Error("XConditionManager.CheckCharacterCondition error: can not found template, id is " .. id)
return DefaultRet
end
local func = CharacterCondition[template.Type]
if not func then
XLog.Error("XConditionManager.CheckCharacterCondition error: can not found condition, id is " .. id .. " type is " .. template.Type)
return DefaultRet
end
return func(template, characterId)
end
function XConditionManager.CheckPlayerCondition(id, ...)
local template = ConditionTemplate[id]
if not template then
XLog.Error("XConditionManager.CheckPlayerCondition error: can not found template, id is " .. id)
return DefaultRet
end
local func = PlayerCondition[template.Type]
if not func then
XLog.Error("XConditionManager.CheckPlayerCondition error: can not found condition, id is " .. id .. " type is " .. template.Type)
return DefaultRet
end
return func(template, ...)
end
function XConditionManager.CheckTeamCondition(id, characterIds)
local template = ConditionTemplate[id]
if not template then
XLog.Error("XConditionManager.CheckTeamCondition error: can not found template, id is " .. id)
return DefaultRet
end
local func = TeamCondition[template.Type]
if not func then
XLog.Error("XConditionManager.CheckTeamCondition error: can not found condition, id is " .. id .. " type is " .. template.Type)
return DefaultRet
end
return func(template, characterIds)
end
function XConditionManager.CheckKillCondition(id, NpcId)
local template = ConditionTemplate[id]
if not template then
XLog.Error("XConditionManager.CheckKillCondition error: can not found template, id is " .. id)
return DefaultRet
end
local func = KillCondition[template.Type]
if not func then
XLog.Error("XConditionManager.CheckKillCondition error: can not found condition, id is " .. id .. " type is " .. template.Type)
return DefaultRet
end
return func(template, NpcId)
end
-- checkedId can be suitId or equipId
function XConditionManager.CheckEquipCondition(conditionId, checkedId)
local template = ConditionTemplate[conditionId]
if not template then
XLog.Error("XConditionManager.CheckEquipCondition error: can not found template, id is " .. conditionId)
return DefaultRet
end
local func = EquipCondition[template.Type]
if not func then
XLog.Error("XConditionManager.CheckEquipCondition error: can not found condition, id is " .. conditionId .. " type is " .. template.Type)
return DefaultRet
end
return func(template, checkedId)
end
function XConditionManager.CheckCondition(id, ...)
local type = XConditionManager.GetConditionType(id)
if type == XConditionManager.ConditionType.Character then
return XConditionManager.CheckCharacterCondition(id, ...)
elseif type == XConditionManager.ConditionType.Team then
return XConditionManager.CheckTeamCondition(id, ...)
elseif type == XConditionManager.ConditionType.Kill then
return XConditionManager.CheckKillCondition(id, ...)
elseif type == XConditionManager.ConditionType.Equip then
return XConditionManager.CheckEquipCondition(id, ...)
elseif type == XConditionManager.ConditionType.Formula then
return XConditionManager.CheckComplexCondition(id, ...)
else
return XConditionManager.CheckPlayerCondition(id, ...)
end
end
--[[
& | ()
1.1001 & (1002 | 1003)
2.1001 & 1002 | 1003 id201000
3.1001 & 1002 | 1003 1001 1002id5020
]]
function XConditionManager.CheckComplexCondition(id, ...)
local args = { ... }
local conditionFormula = XConditionManager.ConditionFormula
if conditionFormula == nil then
local XConditionFormula = require("XFormula/XConditionFormula")
conditionFormula = XConditionFormula.New()
XConditionManager.ConditionFormula = conditionFormula
end
local config = XConditionManager.GetConditionTemplate(id)
-- 便于在内部提示配置错误
conditionFormula:SetConfig(config)
local result, desc = conditionFormula:GetResult(config.Formula, args)
if config.Desc then
desc = config.Desc
end
return result, desc
end
function XConditionManager.GetConditionDescById(id)
if (ConditionTemplate[id] or {}).Desc then
return ConditionTemplate[id].Desc
end
end
function XConditionManager.GetConditionParams(id)
if (ConditionTemplate[id] or {}).Params then
return tableUnpack(ConditionTemplate[id].Params)
end
end