Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions ext/Client/Editor.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
17 changes: 16 additions & 1 deletion ext/Client/__init__.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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 = ''

Expand All @@ -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 )
Expand All @@ -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)
Expand Down Expand Up @@ -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

Expand Down
39 changes: 31 additions & 8 deletions ext/Server/DataBaseManager.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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)
Expand All @@ -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
);

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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']
}
Expand All @@ -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']
}
Expand Down Expand Up @@ -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)
Expand Down
106 changes: 104 additions & 2 deletions ext/Server/ProjectManager.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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()
Expand All @@ -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)
Expand Down Expand Up @@ -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())
Expand Down
17 changes: 15 additions & 2 deletions ext/Server/__init__.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
Loading