local table_insert=table.insert local ipairs=ipairs local pairs=pairs local LuaConst=LuaConst local LevelItemManager = { MatchCheckFunc = { [LuaConst.MatchCheckType.All] = function(entity, param) return true end, [LuaConst.MatchCheckType.CharacterID] = function(entity, param) return entity._logicInitData.CharacterID == param end, [LuaConst.MatchCheckType.BornItemID] = function(entity, param) return param[entity._logicInitData.BornItemID] end, [LuaConst.MatchCheckType.CampID] = function(entity, param) return param[entity:GetCampID()] end } } local private = { allItemDic = {}, -- 本次关卡中所有的元素--查询用 allItemList = {}, -- 本次关卡中所有的元素--遍历用 allEventDic = {}, -- 本次关卡中的所有事件--查询用 allEventList = {}, -- 本次关卡中的所有事件--遍历用 dontActiveOnStartItemIdDic = {}, --在LevelItemManager.Start里不active的关卡元素id字典,key是itemId,value是bool,如果为true则不在Start里调用OnActive。这个的效果优先级大于配置 dontBornMonsterItemIdDic = {}, --禁止刷怪的itemId,在这里面的的关卡元素不会刷怪 } local EventSystem = require('Event/EventSystem') local LevelEvent = require("Battle/Logic/Level/LevelItemFunction/LevelEvent") local LevelItemFactory = require("Battle/Logic/Level/LevelItemFactory/LevelItemFactory") local LevelTerritoryModule = require("Battle/Logic/Level/LevelItemFunction/LevelTerritoryModule") local _itemType local _itemIPair = function(t, i) while true do i = i + 1 local v = t[i] if v then if v.LevelItemType == _itemType then return i, v end else break end end end --[[ 1. 需要再关卡开始的时候调用InitLevel(lelveID) ,初始化所有的元素,并绑定元素关系 2. level开始,调用start 开始流程 注意:全局元素的itemid=0 ]]-- -----------开始部分---------- function LevelItemManager.BeforeInitLevel(levelID) --一些数据清理工作需要在InitLevel之前做,因为InitLevel可能就会修改这些数据 private.dontActiveOnStartItemIdDic = {} private.dontBornMonsterItemIdDic = {} end function LevelItemManager.AfterInitLevel(levelID, combineLevelData) private.levelInfo = DataSheetManager.LevelInfoData:GetDataByLevelID(levelID) private.dataPath = "Battle/Logic/Level/LevelItemAndEventData/LevelLayoutData" .. levelID private.curLevelData = require(private.dataPath) --当前关卡的原始数据 private.globalData = { LevelItemID = 0, LevelItemType = LuaConst.LevelItemType.Global, LevelInfo = private.levelInfo, ActiveDefault = true, } private.CreatAllItems(private.curLevelData) private.CreatAllEvent(private.curLevelData) if combineLevelData then private.SetLevelOverride(combineLevelData) end LevelTerritoryModule.InitLevel() LevelManager.CountBornPoint() -- 统计出生点数量 LevelManager.CurLevelFunc:AfterLevelLayoutInited() end --创建关卡中所有的元素 function private.CreatAllItems(data) local allItemData = data.LevelItemList --补充创建全局元素,原因:不想和这个大manager掺和太乱 --By LSH 注意时序,全局元素应放在最前 local globalItem = LevelItemFactory.CreatItem(private.globalData) LevelItemManager.Global = globalItem private.allItemDic[0] = globalItem for _, v in ipairs(allItemData) do local newItem = LevelItemFactory.CreatItem(v) private.allItemDic[v.LevelItemID] = newItem table_insert(private.allItemList,newItem) end table_insert(private.allItemList,globalItem) -- global 最后更新 EventSystem.Dispatch(EventID.Task_ShowTaskTrigger) end --添加一个元素 function LevelItemManager.CreateOneItem(data, isClientTest) if not private.allItemDic[data.LevelItemID] then local newItem = LevelItemFactory.CreatItem(data) if newItem.SetClientTest then newItem:SetClientTest(isClientTest); end private.allItemDic[data.LevelItemID] = newItem table_insert(private.allItemList,newItem) else logging.error(LTAG.ERROR, "dupliate levelitem" .. data.LevelItemID); end return private.allItemDic[data.LevelItemID]; end --删除所有test的元素 function LevelItemManager.DeleteAllTestItem() local index = #private.allItemList; for i=index, 1, -1 do local deleteItem = private.allItemList[i]; if deleteItem.isClientTest then table.remove(private.allItemList, i); private.allItemDic[deleteItem.LevelItemID]:OnDestroy(); private.allItemDic[deleteItem.LevelItemID] = nil; end end end --创建所有消息事件 ,并和元素绑定 function private.CreatAllEvent(data) local allEventData = data.LevelEventList for _, v in ipairs(allEventData) do local event = LevelEvent:new(v) if v.EventID and v.EventID > 0 then private.allEventDic[v.EventID] = event end table_insert(private.allEventList,event) end end function private.SetLevelOverride(data) for i, v in ipairs(data.MonsterItem_Table) do private.allItemDic[v.ItemID]:OverrideData(v.MonsterIDList) end end function LevelItemManager.GetLayoutData() return private.curLevelData end function LevelItemManager.GetEventConditionParam(eventID, type) local event = private.allEventDic[eventID] local eventData = event._eventData local conditions = eventData.Conditions for i, v in ipairs(conditions) do if v.Type == type then return v.Param1 end end return nil end --获取item by id。 返回的是LevelItem的对象,通过item.ItemData访问LevelLayoutData里面的数据 function LevelItemManager.GetItemByID(id, type) local item = private.allItemDic[id] if type and item and item.LevelItemType ~= type then return nil end return item end function LevelItemManager.GetItemIDListByGroup(groupID, type) if private.curLevelData then if private.curLevelData.ItemGroupDict then if private.curLevelData.ItemGroupDict[groupID] then return private.curLevelData.ItemGroupDict[groupID][type] end end return private.curLevelData.ItemGroupDict[groupID] and private.curLevelData.ItemGroupDict[groupID][type] end end function LevelItemManager.GetItemDataByID(id) local item = private.allItemDic[id] return item and item.ItemData or nil end -- return a new list of item with type param function LevelItemManager.GetItemListByType(type) local itemList = {} for k,item in pairs(private.allItemList) do if item.LevelItemType == type then table_insert(itemList,item) end end return itemList end -- return an iterator of item with type param function LevelItemManager.GetItemIterByType(type) _itemType = type return _itemIPair, private.allItemList,0 end -- type元素的的数量 function LevelItemManager.GetItemCountByType(type) local count = 0 for k,item in pairs(private.allItemList) do if item.LevelItemType == type then count = count + 1 end end return count end function LevelItemManager.GetActiveItemByID(id, type) local item = private.allItemDic[id] if type and item.LevelItemType ~= type then return nil end if not item.IsActive then return nil end return item end function LevelItemManager.GetBornItem(index) local type_BornPoint = LuaConst.LevelItemType.BornPoint local id = type_BornPoint * LuaConst.ItemMaxCount + index local item = private.allItemDic[id] if not item then logging.error(LTAG.ERROR, "[关卡策划] : 没有找到关卡元素:",id) else if item.LevelItemType == type_BornPoint then return item end end end function LevelItemManager.ResetEvent(eventID) local event = private.allEventDic[eventID] if event then event:ResetEvent() end end function LevelItemManager.ActiveEvent(eventID) local event = private.allEventDic[eventID] if event then event:OnActive() end end function LevelItemManager.DeactiveEvent(eventID) local event = private.allEventDic[eventID] if event then event:OnDeactive() end end -- 有事件可以被回收了 function LevelItemManager.StopAllEvent() for i, event in ipairs(private.allEventList) do event:OnDeactive() end end function LevelItemManager.SetDontActiveOnStartItemId(itemID) private.dontActiveOnStartItemIdDic[itemID] = true end function LevelItemManager.SetDontBornMonsterItemIdDic(itemID) private.dontBornMonsterItemIdDic[itemID] = true end function LevelItemManager.GetDontBornMonsterFlag(itemID) return private.dontBornMonsterItemIdDic[itemID] end -- 元素开始 ,这个函数的位置一定要在sendRandom后 ,并且和打开LogicUpdateManager.FightBegin在同一帧 function LevelItemManager.Start() for _, v in ipairs(private.allItemList) do if v.ItemData.ActiveDefault and (not private.dontActiveOnStartItemIdDic[v.LevelItemID]) then v:OnActive() end end end function LevelItemManager.OnUpdate() if LevelManager.IsLevelPause() then return end for _, v in ipairs(private.allItemList) do if v.IsActive then v:OnUpdate() end end for _, v in ipairs(private.allEventList) do v:OnUpdate() end end function LevelItemManager.ExitLevel() LevelTerritoryModule.ExitLevel() for _,v in ipairs(private.allEventList) do v:OnDestroy() end for _,v in ipairs(private.allItemList) do v:OnDestroy() end private.allItemDic= {} private.allItemList= {} private.allEventDic = {} private.allEventList = {} private.globalData = nil if private.dataPath then private.curLevelData = nil local packagePath = string.gsub(private.dataPath, "/", "."); package.loaded[packagePath] = nil end end function LevelItemManager.GetPathPoint(id, index) local item = private.allItemDic[id] if item and item.ItemData.PathPoints then local point = item.ItemData.PathPoints[index] if point then return point:cloneV2() end end return nil end function LevelItemManager.IsShowingTimeline() return LevelItemManager.Global:IsShowingTimeline() end function LevelItemManager.IsShowingDialogue() return LevelItemManager.Global:IsShowingDialogue() end function LevelItemManager.IsShowingMovie() return LevelItemManager.Global:IsShowingMovie() end function LevelItemManager.GetPathType(id) local item = private.allItemDic[id] if item and item.ItemData then return item.ItemData.PathType else return nil end end function LevelItemManager.GetPathPointCount(id) local item = private.allItemDic[id] if item and item.ItemData and item.ItemData.PathPoints then return #item.ItemData.PathPoints else return 0 end end function LevelItemManager.CheckMonsterItemDeadAll() local type = LuaConst.LevelItemType.Monster for _,item in ipairs(private.allItemList) do if item.LevelItemType == type and not item:CheckMonsterDeadAll() then return false end end return true end function LevelItemManager.ClearMonsterItem() local type = LuaConst.LevelItemType.Monster for _,item in ipairs(private.allItemList) do if item.LevelItemType == type and item:CheckTriggered() then item:ClearBorn() item:DeleteRenderMonster() end end end function LevelItemManager.GetConveyData(levelID) local conveyList local levelData = require("Battle/Logic/Level/LevelItemAndEventData/LevelLayoutData" .. levelID) for _,item in ipairs(levelData.LevelItemList) do if item.LevelItemType == LuaConst.LevelItemType.Convey then if conveyList == nil then conveyList = {} end table_insert(conveyList,item) end end return conveyList end --返回的是LevelItemData function LevelItemManager.GetLevelItem(levelID,LevelItemID) if levelID == 0 then return nil end 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 LevelItemManager.GetLevelItemByNpcID(levelID,NpcID) local levelData = require("Battle/Logic/Level/LevelItemAndEventData/LevelLayoutData" .. levelID) for _,item in ipairs(levelData.LevelItemList) do if item.NpcID == NpcID then return item end end return nil end function LevelItemManager.GetBornItemData(entity) return LevelItemManager.GetItemDataByID(entity._logicInitData.BornItemID) end function LevelItemManager.GetMonsterByID(monsterID) for k,entity in pairs(LogicUpdateManager._entityDic) do if entity._logicInitData.CharacterID == monsterID then return entity end end end function LevelItemManager.GetMonsterByItemID(itemID) local monsterItem = private.allItemDic[itemID] if not monsterItem then return nil end return monsterItem:GetMonsterEntity() end function LevelItemManager.GetMonsterByItemIDs(itemIDList) for i, itemID in ipairs(itemIDList) do local monsterItem = private.allItemDic[itemID] local entity = monsterItem:GetMonsterEntity() if entity then return entity end end end --region---------------------cheat 函数------------------------------ function LevelItemManager.CheatKillMonster(itemID) local monsterItem = private.allItemDic[itemID] monsterItem:DoAction(LuaConst.LevelActionType.Delete,{Range = 0, Check = 0},nil,0) end function LevelItemManager.CheatKillMonsterOne(itemID) local monsterItem = private.allItemDic[itemID] monsterItem:DoAction(LuaConst.LevelActionType.Monster_DeleteNum,nil,1) end function LevelItemManager.CheatRoutMonster() LevelItemManager.Global:DoAction(LuaConst.LevelActionType.Rout,{Range = 0, Check = 0},nil,nil) end function LevelItemManager.CheatSlowMotion() LevelItemManager.Global:DoAction(LuaConst.LevelActionType.Global_SlowMotion,"slowMotion_1") end function LevelItemManager.CheatSendEventCondition(key) EventSystem.Dispatch(key,key) end function LevelItemManager.CheatStartDialogue(dialogueID) LevelItemManager.Global:DoAction(LuaConst.LevelActionType.Global_PlayDialogue,dialogueID) end function LevelItemManager.OnEndLevel() LevelItemManager.StopAllEvent() private.dontActiveOnStartItemIdDic = {} private.dontBornMonsterItemIdDic = {} end ---这两个方法是为了防止重新上线断线重连的时候正好退出关卡,导致Global没有初始化,报空 function LevelItemManager.GetLevelPassTime() if LevelItemManager.Global then return LevelItemManager.Global:GetPassTime() end return FP.Const.Zero end function LevelItemManager.GetLevelRemainTime() if LevelItemManager.Global then return LevelItemManager.Global:GetRemainTime() end return FP.Const.Zero end --endregion cheat 函数 return LevelItemManager