diff --git a/ext/Client/Editor.lua b/ext/Client/Editor.lua index 25d706c8..3f5f6878 100644 --- a/ext/Client/Editor.lua +++ b/ext/Client/Editor.lua @@ -16,6 +16,11 @@ function Editor:RegisterVars() self.m_CameraTransform = nil --self.m_LevelLoaded = false + self.m_CurrentProjectHeader = nil +end + +function Editor:SetProjectHeaders(p_CurrentProjectHeader) + self.m_CurrentProjectHeader = p_CurrentProjectHeader end function Editor:OnEngineMessage(p_Message) diff --git a/ext/Client/__init__.lua b/ext/Client/__init__.lua index 7cb528be..de56f22b 100644 --- a/ext/Client/__init__.lua +++ b/ext/Client/__init__.lua @@ -35,6 +35,7 @@ function MapEditorClient:RegisterEvents() Events:Subscribe('UpdateManager:Update', self, self.OnUpdatePass) Events:Subscribe('UI:DrawHud', self, self.OnDrawHud) Events:Subscribe('Level:LoadingInfo', self, self.OnLoadingInfo) + Events:Subscribe('Level:LoadResources', self, self.OnLevelLoadResources) -- Editor Events NetEvents:Subscribe('MapEditorClient:ReceiveProjectData', self, self.OnReceiveProjectData) @@ -58,6 +59,8 @@ function MapEditorClient:RegisterEvents() Hooks:Install('UI:PushScreen', 999, self, self.OnPushScreen) Hooks:Install('ResourceManager:LoadBundles', 999, self, self.OnLoadBundles) + Hooks:Install('Terrain:Load', 1, self, self.OnTerrainLoad) + Hooks:Install('VisualTerrain:Load', 1, self, self.OnTerrainLoad) Hooks:Install('EntityFactory:CreateFromBlueprint', 999, self, self.OnEntityCreateFromBlueprint) Hooks:Install('EntityFactory:Create', 999, self, self.OnEntityCreate) end @@ -120,6 +123,10 @@ function MapEditorClient:OnLevelDestroy() UIManager:OnLevelDestroy() end +function MapEditorClient:OnTerrainLoad(p_HookCtx, p_AssetName) + EditorCommon:OnTerrainLoad(p_HookCtx, p_AssetName, Editor.m_CurrentProjectHeader) +end + function MapEditorClient:OnLoadBundles(p_Hook, p_Bundles, p_Compartment) local s_LoadingInfo = '' @@ -132,7 +139,9 @@ function MapEditorClient:OnLoadBundles(p_Hook, p_Bundles, p_Compartment) end UIManager:SetLoadingInfo('Mounting bundles: ' .. tostring(s_LoadingInfo)) - EditorCommon:OnLoadBundles(p_Hook, p_Bundles, p_Compartment) + local s_Bundles = EditorCommon:OnLoadBundles(p_Hook, p_Bundles, p_Compartment, Editor.m_CurrentProjectHeader) + + p_Hook:Pass(s_Bundles, p_Compartment) end function MapEditorClient:OnEntityCreate(p_Hook, p_EntityData, p_Transform ) @@ -147,6 +156,10 @@ function MapEditorClient:OnLoadingInfo(p_Info) UIManager:SetLoadingInfo(p_Info) end +function MapEditorClient:OnLevelLoadResources(p_LevelName, p_GameMode, p_IsDedicatedServer) + EditorCommon:OnLevelLoadResources(Editor.m_CurrentProjectHeader) +end + ----------- Editor functions---------------- function MapEditorClient:OnSendCommandsToServer(p_CommandsJson) @@ -174,10 +187,12 @@ function MapEditorClient:OnUIReloaded() end function MapEditorClient:OnReceiveProjectHeaders(p_ProjectHeaders) + Editor:SetProjectHeaders(p_ProjectHeaders) WebUpdater:AddUpdate('SetProjectHeaders', p_ProjectHeaders) end function MapEditorClient:OnReceiveCurrentProjectHeader(p_CurrentProjectHeader) + Editor:SetProjectHeaders(p_CurrentProjectHeader) WebUpdater:AddUpdate('SetCurrentProjectHeader', p_CurrentProjectHeader) end diff --git a/ext/Server/DataBaseManager.lua b/ext/Server/DataBaseManager.lua index d7481d6e..ab21301e 100644 --- a/ext/Server/DataBaseManager.lua +++ b/ext/Server/DataBaseManager.lua @@ -8,7 +8,9 @@ local m_ProjectName_Unique_Index = "idx_project_name" local m_ProjectName_Text_Column_Name = "project_name" local m_MapName_Text_Column_Name = "map_name" local m_GameModeName_Text_Column_Name = "gamemode_name" +local m_RequiredSuperBundles_Text_Column_Name = "required_superbundles" local m_RequiredBundles_Text_Column_Name = "required_bundles" +local m_TerrainLevelName_Text_Column_Name = "terrain_level_name" local m_TimeStamp_Text_Column_Name = "timestamp" local m_DB_Data_Table_Name = "project_data" @@ -23,21 +25,26 @@ function DataBaseManager:__init() self:CreateOrUpdateDatabase() end -function DataBaseManager:SaveProject(p_ProjectName, p_MapName, p_GameModeName, p_RequiredBundles, p_GameObjectSaveDatas, p_TimeStamp) +function DataBaseManager:SaveProject(p_ProjectName, p_MapName, p_GameModeName, p_RequiredSuperBundles, p_RequiredBundles, p_TerrainLevelName, p_GameObjectSaveDatas, p_TimeStamp) local s_TimeStamp = p_TimeStamp or SharedUtils:GetTimeMS() local s_GameObjectSaveDatasJson = p_GameObjectSaveDatas + local s_RequiredSuperBundlesJson = p_RequiredSuperBundles local s_RequiredBundlesJson = p_RequiredBundles if type(p_GameObjectSaveDatas) ~= 'string' then s_GameObjectSaveDatasJson = json.encode(p_GameObjectSaveDatas) end + if type(p_RequiredSuperBundles) ~= 'string' then + s_RequiredSuperBundlesJson = json.encode(p_RequiredSuperBundles) + end + if type(p_RequiredBundles) ~= 'string' then s_RequiredBundlesJson = json.encode(p_RequiredBundles) end - local s_Success, s_ErrorMsg, s_HeaderId = self:SaveProjectHeader(p_ProjectName, p_MapName, p_GameModeName, s_RequiredBundlesJson, s_TimeStamp) + local s_Success, s_ErrorMsg, s_HeaderId = self:SaveProjectHeader(p_ProjectName, p_MapName, p_GameModeName, s_RequiredSuperBundlesJson, s_RequiredBundlesJson, p_TerrainLevelName, s_TimeStamp) if s_Success then return self:SaveProjectData(s_HeaderId, s_GameObjectSaveDatasJson) @@ -60,7 +67,9 @@ function DataBaseManager:CreateOrUpdateDatabase() ]] .. m_ProjectName_Text_Column_Name .. [[ TEXT, ]] .. m_MapName_Text_Column_Name .. [[ TEXT, ]] .. m_GameModeName_Text_Column_Name .. [[ TEXT, + ]] .. m_RequiredSuperBundles_Text_Column_Name .. [[ TEXT, ]] .. m_RequiredBundles_Text_Column_Name .. [[ TEXT, + ]] .. m_TerrainLevelName_Text_Column_Name .. [[ TEXT, ]] .. m_TimeStamp_Text_Column_Name .. [[ INTEGER ); @@ -91,7 +100,7 @@ function DataBaseManager:CreateOrUpdateDatabase() m_Logger:Write("Successfully created database!") end -function DataBaseManager:SaveProjectHeader(p_ProjectName, p_MapName, p_GameModeName, p_RequiredBundlesJson, p_TimeStamp) +function DataBaseManager:SaveProjectHeader(p_ProjectName, p_MapName, p_GameModeName, p_RequiredSuperBundlesJson, p_RequiredBundlesJson, p_TerrainLevelName, p_TimeStamp) if p_ProjectName == nil or type(p_ProjectName) ~= "string" then return false, "Failed to save Project - header.projectName is invalid: " .. tostring(p_ProjectName) end @@ -104,20 +113,28 @@ function DataBaseManager:SaveProjectHeader(p_ProjectName, p_MapName, p_GameModeN return false, "Failed to save Project - header.gameModeName is invalid: " .. tostring(p_GameModeName) end + if p_RequiredSuperBundlesJson == nil or type(p_RequiredSuperBundlesJson) ~= "string" then + return false, "Failed to save Project - header.requiredSuperBundles is invalid: " .. tostring(p_RequiredSuperBundlesJson) + end + if p_RequiredBundlesJson == nil or type(p_RequiredBundlesJson) ~= "string" then return false, "Failed to save Project - header.requiredBundles is invalid: " .. tostring(p_RequiredBundlesJson) end + if p_TerrainLevelName == nil or type(p_TerrainLevelName) ~= "string" then + return false, "Failed to save Project - header.terrainLevelName is invalid: " .. tostring(p_TerrainLevelName) + end + if p_TimeStamp == nil or type(p_TimeStamp) ~= "number" then return false, "Failed to save Project - header.timeStamp is invalid: " .. tostring(p_TimeStamp) end - local s_Query = [[INSERT OR REPLACE INTO ]] .. m_DB_Header_Table_Name .. [[ (]] .. m_ProjectName_Text_Column_Name .. [[, ]] .. m_MapName_Text_Column_Name .. [[, ]] .. m_GameModeName_Text_Column_Name .. [[, ]] .. m_RequiredBundles_Text_Column_Name .. [[, ]] .. m_TimeStamp_Text_Column_Name .. [[) VALUES (?, ?, ?, ?, ?)]] + local s_Query = [[INSERT OR REPLACE INTO ]] .. m_DB_Header_Table_Name .. [[ (]] .. m_ProjectName_Text_Column_Name .. [[, ]] .. m_MapName_Text_Column_Name .. [[, ]] .. m_GameModeName_Text_Column_Name .. [[, ]] .. m_RequiredSuperBundles_Text_Column_Name .. [[, ]] .. m_RequiredBundles_Text_Column_Name .. [[, ]] .. m_TerrainLevelName_Text_Column_Name .. [[, ]] .. m_TimeStamp_Text_Column_Name .. [[) VALUES (?, ?, ?, ?, ?, ?, ?)]] m_Logger:Write("Inserting values:") - m_Logger:Write(p_ProjectName .. " | " .. p_MapName .. " | " .. p_GameModeName .. " | " .. p_RequiredBundlesJson .. " | " .. tostring(p_TimeStamp)) + m_Logger:Write(p_ProjectName .. " | " .. p_MapName .. " | " .. p_GameModeName .. " | " .. p_RequiredSuperBundlesJson .. " | " .. p_RequiredBundlesJson .. " | " .. p_TerrainLevelName .. " | " .. tostring(p_TimeStamp)) - if not SQL:Query(s_Query, p_ProjectName, p_MapName, p_GameModeName, p_RequiredBundlesJson, p_TimeStamp) then + if not SQL:Query(s_Query, p_ProjectName, p_MapName, p_GameModeName, p_RequiredSuperBundlesJson, p_RequiredBundlesJson, p_TerrainLevelName, p_TimeStamp) then m_Logger:Error('Failed to execute query: ' .. SQL:Error()) return false, 'Internal database error, check server output for more info' end @@ -158,7 +175,9 @@ function DataBaseManager:GetProjectHeaders() projectName = l_Row[m_ProjectName_Text_Column_Name], mapName = l_Row[m_MapName_Text_Column_Name], gameModeName = l_Row[m_GameModeName_Text_Column_Name], + requiredSuperBundles = json.decode(l_Row[m_RequiredSuperBundles_Text_Column_Name]), requiredBundles = json.decode(l_Row[m_RequiredBundles_Text_Column_Name]), + terrainLevelName = l_Row[m_TerrainLevelName_Text_Column_Name], timeStamp = l_Row[m_TimeStamp_Text_Column_Name], id = l_Row['id'] } @@ -184,7 +203,9 @@ function DataBaseManager:GetProjectHeader(p_ProjectId) projectName = s_ProjectHeaderRow[1][m_ProjectName_Text_Column_Name], mapName = s_ProjectHeaderRow[1][m_MapName_Text_Column_Name], gameModeName = s_ProjectHeaderRow[1][m_GameModeName_Text_Column_Name], + requiredSuperBundles = json.decode(s_ProjectHeaderRow[1][m_RequiredSuperBundles_Text_Column_Name]), requiredBundles = json.decode(s_ProjectHeaderRow[1][m_RequiredBundles_Text_Column_Name]), + terrainLevelName = s_ProjectHeaderRow[1][m_TerrainLevelName_Text_Column_Name], timeStamp = s_ProjectHeaderRow[1][m_TimeStamp_Text_Column_Name], id = s_ProjectHeaderRow[1]['id'] } @@ -260,11 +281,13 @@ function DataBaseManager:ImportProject(p_ProjectDataJSON) if s_Header.projectName == nil or s_Header.mapName == nil or s_Header.gameModeName == nil or - s_Header.requiredBundles == nil then + s_Header.requiredSuperBundles == nil or + s_Header.requiredBundles == nil or + s_Header.terrainLevelName == nil then return false, 'Save header missing necessary field(s)' end - return self:SaveProject(s_Header.projectName, s_Header.mapName, s_Header.gameModeName, s_Header.requiredBundles, s_Data, s_Header.timeStamp) + return self:SaveProject(s_Header.projectName, s_Header.mapName, s_Header.gameModeName, s_Header.requiredSuperBundles, s_Header.requiredBundles, s_Header.terrainLevelName, s_Data, s_Header.timeStamp) end function DataBaseManager:DeleteProject(p_ProjectId) diff --git a/ext/Server/ProjectManager.lua b/ext/Server/ProjectManager.lua index 93a4b027..916ce4d8 100644 --- a/ext/Server/ProjectManager.lua +++ b/ext/Server/ProjectManager.lua @@ -4,6 +4,55 @@ ProjectManager = class 'ProjectManager' local m_Logger = Logger("ProjectManager", false) local m_IsLevelLoaded = false local m_LoadDelay = 0 +local m_SuperBundles = { + ["levels/coop_002/coop_002"] = true, + ["levels/coop_003/coop_003"] = true, + ["levels/coop_006/coop_006"] = true, + ["levels/coop_007/coop_007"] = true, + ["levels/coop_009/coop_009 "] = true, + ["levels/coop_010/coop_010"] = true, + ["levels/mp_001/mp_001"] = true, + ["levels/mp_003/mp_003"] = true, + ["levels/mp_007/mp_007"] = true, + ["levels/mp_011/mp_011"] = true, + ["levels/mp_012/mp_012"] = true, + ["levels/mp_013/mp_013"] = true, + ["levels/mp_017/mp_017"] = true, + ["levels/mp_018/mp_018"] = true, + ["levels/mp_subway/mp_subway"] = true, + ["levels/sp_bank/sp_bank"] = true, + ["levels/sp_earthquake/sp_earthquake"] = true, + ["levels/sp_earthquake2/sp_earthquake2"] = true, + ["levels/sp_finale/sp_finale"] = true, + ["levels/sp_jet/sp_jet"] = true, + ["levels/sp_new_york/sp_new_york"] = true, + ["levels/sp_paris/sp_paris"] = true, + ["levels/sp_sniper/sp_sniper"] = true, + ["levels/sp_tank/sp_tank"] = true, + ["levels/sp_tank_b/sp_tank_b"] = true, + ["levels/sp_valley/sp_valley"] = true, + ["levels/sp_villa/sp_villa"] = true, + ["levels/xp1_001/xp1_001"] = true, + ["levels/xp1_002/xp1_002"] = true, + ["levels/xp1_003/xp1_003"] = true, + ["levels/xp1_004/xp1_004"] = true, + ["levels/xp2_factory/xp2_factory"] = true, + ["levels/xp2_office/xp2_office"] = true, + ["levels/xp2_palace/xp2_palace"] = true, + ["levels/xp2_skybar/xp2_skybar"] = true, + ["levels/xp3_alborz/xp3_alborz"] = true, + ["levels/xp3_desert/xp3_desert"] = true, + ["levels/xp3_shield/xp3_shield"] = true, + ["levels/xp3_valley/xp3_valley"] = true, + ["levels/xp4_fd/xp4_fd"] = true, + ["levels/xp4_parl/xp4_parl"] = true, + ["levels/xp4_quake/xp4_quake"] = true, + ["levels/xp4_rubble/xp4_rubble"] = true, + ["levels/xp5_001/xp5_001"] = true, + ["levels/xp5_002/xp5_002"] = true, + ["levels/xp5_003/xp5_003"] = true, + ["levels/xp5_004/xp5_004"] = true +} function ProjectManager:__init() @@ -18,6 +67,7 @@ function ProjectManager:RegisterVars() self.m_MapName = nil self.m_GameMode = nil self.m_LoadedBundles = {} + self.m_LoadedSuperBundles = {} end function ProjectManager:RegisterEvents() @@ -31,9 +81,61 @@ function ProjectManager:RegisterEvents() end function ProjectManager:OnLoadBundles(p_Bundles, p_Compartment) + if not self:IsLevelBundle(p_Bundles) then + return + end + for _, l_Bundle in pairs(p_Bundles) do - self.m_LoadedBundles[l_Bundle] = true + if l_Bundle ~= SharedUtils:GetLevelName() then + if l_Bundle:match("xp1_") then + self.m_LoadedSuperBundles["xp1chunks"] = true + elseif l_Bundle:match("xp2_") then + self.m_LoadedSuperBundles["xp2chunks"] = true + elseif l_Bundle:match("xp3_") then + self.m_LoadedSuperBundles["xp3chunks"] = true + elseif l_Bundle:match("xp4_") then + self.m_LoadedSuperBundles["xp4chunks"] = true + elseif l_Bundle:match("xp5_") then + self.m_LoadedSuperBundles["xp5chunks"] = true + elseif l_Bundle:match("coop_") or l_Bundle:match("sp_") then + self.m_LoadedSuperBundles["spchunks"] = true + end + + if m_SuperBundles[l_Bundle] ~= nil then + self.m_LoadedSuperBundles[l_Bundle] = true + end + + self.m_LoadedBundles[l_Bundle] = true + end end + + local s_Bundle = SharedUtils:GetLevelName() + + if s_Bundle:match("xp1_") then + self.m_LoadedSuperBundles["xp1chunks"] = nil + elseif s_Bundle:match("xp2_") then + self.m_LoadedSuperBundles["xp2chunks"] = nil + elseif s_Bundle:match("xp3_") then + self.m_LoadedSuperBundles["xp3chunks"] = nil + elseif s_Bundle:match("xp4_") then + self.m_LoadedSuperBundles["xp4chunks"] = nil + elseif s_Bundle:match("xp5_") then + self.m_LoadedSuperBundles["xp5chunks"] = nil + elseif s_Bundle:match("coop_") or s_Bundle:match("sp_") then + self.m_LoadedSuperBundles["spchunks"] = nil + self.m_LoadedSuperBundles["mpchunks"] = true + end +end + + +function ProjectManager:IsLevelBundle(p_Bundles) + for _, l_Bundle in pairs(p_Bundles) do + if l_Bundle == SharedUtils:GetLevelName() then + return true + end + end + + return false end function ProjectManager:OnRequestProjectHeaders(p_Player) @@ -216,7 +318,7 @@ function ProjectManager:SaveProjectCoroutine(p_ProjectSaveData) gameModeName = self.m_GameMode, requiredBundles = self.m_LoadedBundles } - local s_Success, s_Msg = DataBaseManager:SaveProject(p_ProjectSaveData.projectName, self.m_CurrentProjectHeader.mapName, self.m_CurrentProjectHeader.gameModeName, self.m_LoadedBundles, s_GameObjectSaveDatas) + local s_Success, s_Msg = DataBaseManager:SaveProject(p_ProjectSaveData.projectName, self.m_CurrentProjectHeader.mapName, self.m_CurrentProjectHeader.gameModeName, self.m_LoadedSuperBundles, self.m_LoadedBundles, self.m_CurrentProjectHeader.mapName, s_GameObjectSaveDatas) if s_Success then NetEvents:BroadcastLocal("MapEditorClient:ReceiveProjectHeaders", DataBaseManager:GetProjectHeaders()) diff --git a/ext/Server/__init__.lua b/ext/Server/__init__.lua index a52c6f7e..c24fb925 100644 --- a/ext/Server/__init__.lua +++ b/ext/Server/__init__.lua @@ -43,8 +43,11 @@ function MapEditorServer:RegisterEvents() Events:Subscribe('Partition:Loaded', self, self.OnPartitionLoaded) Events:Subscribe('Player:Chat', self, self.OnChat) Events:Subscribe('Player:Authenticated', self, self.OnPlayerAuthenticated) + Events:Subscribe('Level:LoadResources', self, self.OnLevelLoadResources) Hooks:Install('ResourceManager:LoadBundles', 999, self, self.OnLoadBundles) + Hooks:Install('Terrain:Load', 1, self, self.OnTerrainLoad) + Hooks:Install('VisualTerrain:Load', 1, self, self.OnTerrainLoad) Hooks:Install('EntityFactory:CreateFromBlueprint', 999, self, self.OnEntityCreateFromBlueprint) Hooks:Install('EntityFactory:Create', 999, self, self.OnEntityCreate) end @@ -125,9 +128,19 @@ function MapEditorServer:OnEntityCreate(p_Hook, p_EntityData, p_Transform) GameObjectManager:OnEntityCreate(p_Hook, p_EntityData, p_Transform ) end +function MapEditorServer:OnLevelLoadResources(p_LevelName, p_GameMode, p_IsDedicatedServer) + EditorCommon:OnLevelLoadResources(ProjectManager.m_CurrentProjectHeader) +end + +function MapEditorServer:OnTerrainLoad(p_HookCtx, p_AssetName) + EditorCommon:OnTerrainLoad(p_HookCtx, p_AssetName, ProjectManager.m_CurrentProjectHeader) +end + function MapEditorServer:OnLoadBundles(p_Hook, p_Bundles, p_Compartment) - EditorCommon:OnLoadBundles(p_Hook, p_Bundles, p_Compartment, ProjectManager.m_CurrentProjectHeader) - ProjectManager:OnLoadBundles(p_Bundles, p_Compartment) + local s_Bundles = EditorCommon:OnLoadBundles(p_Hook, p_Bundles, p_Compartment, ProjectManager.m_CurrentProjectHeader) + ProjectManager:OnLoadBundles(s_Bundles, p_Compartment) + + p_Hook:Pass(s_Bundles, p_Compartment) end function MapEditorServer:OnPlayerAuthenticated(p_Player) diff --git a/ext/Shared/EditorCommon.lua b/ext/Shared/EditorCommon.lua index 4387e6d7..2470e3eb 100644 --- a/ext/Shared/EditorCommon.lua +++ b/ext/Shared/EditorCommon.lua @@ -7,22 +7,99 @@ function EditorCommon:__init() m_Logger:Write("Initializing EditorCommon") end -function EditorCommon:OnLoadBundles(p_Hook, p_Bundles, p_Compartment, p_ProjectHeader) +function EditorCommon:OnLevelLoadResources(p_ProjectHeader) + if p_ProjectHeader == nil then + return + end + + if p_ProjectHeader.requiredSuperBundles == nil then + return + end + + local s_SortedSuperBundles = {} + + for l_SuperBundle, l_IsRequired in pairs(p_ProjectHeader.requiredSuperBundles) do + if l_IsRequired then + if l_SuperBundle:match("chunks") then + table.insert(s_SortedSuperBundles, 1, l_SuperBundle) + else + table.insert(s_SortedSuperBundles, l_SuperBundle) + end + end + end + + for _, l_SuperBundle in pairs(s_SortedSuperBundles) do + print("MountSuperBundle: " .. l_SuperBundle) + ResourceManager:MountSuperBundle(l_SuperBundle) + end +end + +function EditorCommon:OnTerrainLoad(p_HookCtx, p_AssetName, p_ProjectHeader) if p_ProjectHeader == nil then return end - -- Catch the earliest possible bundle. Both server & client. - if p_Bundles[1] == "gameconfigurations/game" or p_Bundles[1] == "UI/Flow/Bundle/LoadingBundleMp" then - -- Mount your superbundle and bundles.. + if p_ProjectHeader.terrainLevelName == nil then + return + end + + if not p_AssetName:match(p_ProjectHeader.terrainLevelName) then + p_HookCtx:Return() + end +end + +function EditorCommon:OnLoadBundles(p_Hook, p_Bundles, p_Compartment, p_ProjectHeader) + local s_Bundles = {} + + if p_ProjectHeader == nil then + return p_Bundles + end + + if p_ProjectHeader.requiredBundles == nil then + return p_Bundles + end + + if not self:IsLevelBundle(p_Bundles) then + return p_Bundles + end + + + for _, p_Bundle in pairs(p_Bundles) do + table.insert(s_Bundles, p_Bundle) + end + + for l_Bundle, l_IsRequired in pairs(p_ProjectHeader.requiredBundles) do + if l_IsRequired then + if not self:IsBundleInList(s_Bundles, l_Bundle) then + print("Add to bundle: " .. l_Bundle) + table.insert(s_Bundles, 1, l_Bundle) + end + end + end + + print("Pass bundles") + return s_Bundles +end + +function EditorCommon:IsLevelBundle(p_Bundles) + for _, l_Bundle in pairs(p_Bundles) do + if l_Bundle == SharedUtils:GetLevelName() then + return true + end + end - -- for _, l_BundleName in pairs(p_ProjectHeader.requiredBundles) do - -- local s_Bundle = Bundles[l_BundleName] -- Bundles doesnt exit yet + return false +end - -- Events:Dispatch('BundleMounter:LoadBundles', s_Bundle.superBundle, s_Bundle.path) - -- -- TODO Might make sense to gather all bundles of a superbundle and send them together, but not sure if worth the effort - -- end +function EditorCommon:IsBundleInList(p_Bundles, p_BundleToCheck) + for _, l_Bundle in pairs(p_Bundles) do + if l_Bundle == p_BundleToCheck then + return true + end end + + return false end + return EditorCommon