--[[ 遍历NPC表里的数据 1、非任务和交互类的NPC配置了常驻NPC 2、NPC配置了但是没有在关卡里配置的 ]] local LevelItemNpcCheck = {} local private = {} local DataSheetManager = require "Main/DataSheetManager" rawset(_G, 'FP', require('Common/fixedpoint')) rawset(_G, "logging", require('Main/Logging')) rawset(_G, "LTAG", require("Main/LogTags")) require "Common/Utils" local LuaConst = require "Battle/Logic/LuaConst" local resultStr = "" local levelNpcDataArr = {} local ResultTitle = { "LevelId", "LevelLowCost", "LevelMiddleCost", "LevelHighCost", "TotalNpcCount", "ResidentNpcCount", "ResidentNpcCost", "ResidentNpcData", } function LevelItemNpcCheck.StartCheck() resultStr = table.concat(ResultTitle, ",") .. "\n" for __, levelInfoCfg in DataSheetManager.LevelInfoData:GetEnumerator() do if levelInfoCfg.LevelType == LuaConst.LevelType.TOWN then local curLevelData = require("Battle/Logic/Level/LevelItemAndEventData/LevelLayoutData" .. levelInfoCfg.LevelID) --关卡的原始数据 levelNpcDataArr[levelInfoCfg.LevelID] = {LevelLowCost=0,LevelMiddleCost=0,LevelHighCost=0,TotalNpcCount=0,ResidentNpcCount=0,ResidentNpcCost=0,ResidentNpcData=""} private.RechargeLevelData(levelInfoCfg.LevelID, levelInfoCfg.LevelType) for __, levelItemCfg in ipairs(curLevelData.LevelItemList) do if levelItemCfg.LevelItemType == LuaConst.LevelItemType.Npc then levelNpcDataArr[levelInfoCfg.LevelID].TotalNpcCount = levelNpcDataArr[levelInfoCfg.LevelID].TotalNpcCount+1 private.CheckResidentNpc(levelInfoCfg.LevelID, levelItemCfg.LevelItemID, levelItemCfg.NpcID) end end end end for levelID, residentNpcData in pairs(levelNpcDataArr) do if residentNpcData.ResidentNpcCount>0 then for __, titleStr in ipairs(ResultTitle) do resultStr = resultStr .. residentNpcData[titleStr] .. "," end resultStr = resultStr .. "\n" end end resultStr = resultStr .. private.GetNpcDataCfgError() LuaExt.FileWriteText("ResidentNpc.csv", resultStr) end function private.RechargeLevelData(levelID, levelType) local curLevelFeatureDataCfg = DataSheetManager.LevelFeatureData:GetDataByLevelFeatureID(levelType) levelNpcDataArr[levelID].LevelId = levelID levelNpcDataArr[levelID].LevelLowCost = curLevelFeatureDataCfg.VCullCapLevel0 == 0 and 400 or 0 levelNpcDataArr[levelID].LevelMiddleCost = curLevelFeatureDataCfg.VCullCapLevel1 == 0 and 480 or 0 levelNpcDataArr[levelID].LevelHighCost = curLevelFeatureDataCfg.VCullCapLevel2 == 0 and 560 or 0 end function private.CheckResidentNpc(levelID, levelItemId, npcId) local __, npcCfgData = DataSheetManager.NpcData:TryGetDataByID(npcId) if not npcCfgData or (levelID ~= npcCfgData.MapID and not private.IsNpcExistByLevel(npcCfgData.MapID, npcId)) then logging.error(LTAG.ERROR, "npcId", npcId, "checkedLevel", levelID, levelItemId, "npcMapID", npcCfgData.MapID) return end local monsterFeature = DataSheetManager.MonsterFeatureData:GetDataByID(npcCfgData.NPCType) if not npcCfgData.TaskBorn and monsterFeature.VisualPriority == -1 and not private.IsTaskNpc(levelID, levelItemId, npcId) then local npcModelDataCfg = DataSheetManager.MonsterModelData:GetDataByID(npcCfgData.ModelID) levelNpcDataArr[levelID].ResidentNpcCost = levelNpcDataArr[levelID].ResidentNpcCost+npcModelDataCfg.VisualCost levelNpcDataArr[levelID].ResidentNpcCount = levelNpcDataArr[levelID].ResidentNpcCount+1 levelNpcDataArr[levelID].ResidentNpcData = levelNpcDataArr[levelID].ResidentNpcData.."{"..levelItemId.."|"..npcId.."|"..npcModelDataCfg.VisualCost.."}#" end end function private.GetLevelItem(levelID,LevelItemID) local levelData = require("Battle/Logic/Level/LevelItemAndEventData/LevelLayoutData" .. levelID) for _,item in ipairs(levelData.LevelItemList) do if item.LevelItemID == LevelItemID then return item end end return nil end function private.IsTaskNpc(levelID, levelItemId, npcId) for __, taskChildDataCfg in DataSheetManager.TaskChildData:GetEnumerator() do for _,id in ipairs(taskChildDataCfg.NPCID) do if id == npcId then return true end end if taskChildDataCfg.MapID == levelID then for _,id in ipairs(taskChildDataCfg.MapItemID) do if id == levelItemId then return true end end end end end function private.IsActivityDataNpcEntry(npcId) for _, v in DataSheetManager.ActivityData:GetEnumerator() do for __, activityId in ipairs(v.childID) do if private.IsActivityDataNpc(activityId, npcId) then return true end end if private.IsActivityDataNpc(v.ID, npcId) then return true end end end --NPCItemID 组队填的是npcItemId, 其他是npcId function private.IsActivityDataNpc(activityId, npcId) local npcDataCfg = DataSheetManager.NpcData:GetDataByID(npcId) local activityDataConfig = DataSheetManager.ActivityData:GetDataByID(activityId) if activityDataConfig.MapID<=0 then return false end if activityDataConfig.NPCItemID == npcId then return true end for _, v in DataSheetManager.LevelCfgReplace:GetEnumerator() do if v.ReplaceTarget == npcId then if activityDataConfig.NPCItemID == v.ReplaceID then return true end end end local npcItemId = activityDataConfig.NPCItemID local levelItem = private.GetLevelItem(npcDataCfg.MapID, npcItemId) if levelItem then if npcId == levelItem.NpcID then return true end end for _, v in DataSheetManager.LevelCfgReplace:GetEnumerator() do if v.ReplaceID == npcItemId then npcItemId = v.ReplaceTarget end end levelItem = private.GetLevelItem(npcDataCfg.MapID, npcItemId) if levelItem then if npcId == levelItem.NpcID then return true end end return false end function private.IsOfficialNpc(npcId) for _, v in DataSheetManager.LevelCfgReplace:GetEnumerator() do if v.ReplaceTarget == npcId then npcId = v.ReplaceID end end for _, v in DataSheetManager.OfficialPosition:GetEnumerator() do if v.NPC == npcId then return true end end return false end function private.IsCountryNpc(npcId) for __, v in DataSheetManager.CountryBase:GetEnumerator() do if v.WantedNPCID == npcId then return true end end return false end function private.IsOtherRequiredNpc(npcId) for _, v in DataSheetManager.LevelCfgReplace:GetEnumerator() do if v.ReplaceTarget == npcId then npcId = v.ReplaceID end end for __, specialNpcId in pairs(LuaConst.NpcID) do if specialNpcId == npcId then return true end end return false end function private.IsTaskNpcByLevelId(levelId, npcId) local curLevelData = require("Battle/Logic/Level/LevelItemAndEventData/LevelLayoutData" .. levelId) --关卡的原始数据 for __, levelItemCfg in ipairs(curLevelData.LevelItemList) do if levelItemCfg.LevelItemType == LuaConst.LevelItemType.Npc and levelItemCfg.NpcID == npcId then if private.IsTaskNpc(levelId, levelItemCfg.LevelItemID, npcId) then return true end end end return false end function private.IsNpcExistByLevel(levelId, npcId) local curLevelData = require("Battle/Logic/Level/LevelItemAndEventData/LevelLayoutData" .. levelId) --关卡的原始数据 for __, levelItemCfg in ipairs(curLevelData.LevelItemList) do if levelItemCfg.LevelItemType == LuaConst.LevelItemType.Npc and levelItemCfg.NpcID == npcId then return true end end return false end function private.GetNpcDataCfgError() local monsterFeatureDataVisualPriorityArr = {} for __, monsterFeatureData in DataSheetManager.MonsterFeatureData:GetEnumerator() do if not table.containValue(monsterFeatureDataVisualPriorityArr, monsterFeatureData.VisualPriority) then table.insert(monsterFeatureDataVisualPriorityArr, monsterFeatureData.VisualPriority) end end local NpcDataErrorStr = "All VisualPriority\n" NpcDataErrorStr = NpcDataErrorStr .. table.concat(monsterFeatureDataVisualPriorityArr, ",") .. "\n" NpcDataErrorStr = NpcDataErrorStr .. "NpcId,VisualPriority\n" for __, npcDataCfg in DataSheetManager.NpcData:GetEnumerator() do local monsterFeature = DataSheetManager.MonsterFeatureData:GetDataByID(npcDataCfg.NPCType) local isResidentNpc = false if npcDataCfg.MapID>0 and private.IsNpcExistByLevel(npcDataCfg.MapID, npcDataCfg.ID) then if not string.isNilOrEmpty(npcDataCfg.DialogueId) then isResidentNpc = true elseif private.IsCountryNpc(npcDataCfg.ID) then isResidentNpc = true elseif private.IsActivityDataNpcEntry(npcDataCfg.ID) then isResidentNpc = true elseif private.IsOtherRequiredNpc(npcDataCfg.ID) then isResidentNpc = true elseif private.IsOfficialNpc(npcDataCfg.ID) then isResidentNpc = true elseif npcDataCfg.TaskBorn or private.IsTaskNpc(-1, -1, npcDataCfg.ID) then isResidentNpc = true elseif private.IsTaskNpcByLevelId(npcDataCfg.MapID, npcDataCfg.ID) then isResidentNpc = true end if not isResidentNpc and monsterFeature.VisualPriority==-1 then NpcDataErrorStr = NpcDataErrorStr .. npcDataCfg.ID .. "," .. monsterFeature.VisualPriority .. ",None Task Npc\n" end else -- NpcDataErrorStr = NpcDataErrorStr .. npcDataCfg.ID .. "," .. monsterFeature.VisualPriority .. ",Npc Not In LevelLayout\n" end end return NpcDataErrorStr end return LevelItemNpcCheck