87 lines
		
	
	
		
			No EOL
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			No EOL
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
-- shared logic file for map manager - don't call any subsystem-specific functions here
 | 
						|
mapFiles = {}
 | 
						|
 | 
						|
function addMap(file, owningResource)
 | 
						|
    if not mapFiles[owningResource] then
 | 
						|
        mapFiles[owningResource] = {}
 | 
						|
    end
 | 
						|
 | 
						|
    table.insert(mapFiles[owningResource], file)
 | 
						|
end
 | 
						|
 | 
						|
undoCallbacks = {}
 | 
						|
 | 
						|
function loadMap(res)
 | 
						|
    if mapFiles[res] then
 | 
						|
        for _, file in ipairs(mapFiles[res]) do
 | 
						|
            parseMap(file, res)
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
function unloadMap(res)
 | 
						|
    if undoCallbacks[res] then
 | 
						|
        for _, cb in ipairs(undoCallbacks[res]) do
 | 
						|
            cb()
 | 
						|
        end
 | 
						|
 | 
						|
        undoCallbacks[res] = nil
 | 
						|
        mapFiles[res] = nil
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
function parseMap(file, owningResource)
 | 
						|
    if not undoCallbacks[owningResource] then
 | 
						|
        undoCallbacks[owningResource] = {}
 | 
						|
    end
 | 
						|
 | 
						|
    local env = {
 | 
						|
        math = math, pairs = pairs, ipairs = ipairs, next = next, tonumber = tonumber, tostring = tostring,
 | 
						|
        type = type, table = table, string = string, _G = env,
 | 
						|
        vector3 = vector3, quat = quat, vec = vec, vector2 = vector2
 | 
						|
    }
 | 
						|
 | 
						|
    TriggerEvent('getMapDirectives', function(key, cb, undocb)
 | 
						|
        env[key] = function(...)
 | 
						|
            local state = {}
 | 
						|
 | 
						|
            state.add = function(k, v)
 | 
						|
                state[k] = v
 | 
						|
            end
 | 
						|
 | 
						|
            local result = cb(state, ...)
 | 
						|
            local args = table.pack(...)
 | 
						|
 | 
						|
            table.insert(undoCallbacks[owningResource], function()
 | 
						|
                undocb(state)
 | 
						|
            end)
 | 
						|
 | 
						|
            return result
 | 
						|
        end
 | 
						|
    end)
 | 
						|
 | 
						|
    local mt = {
 | 
						|
        __index = function(t, k)
 | 
						|
            if rawget(t, k) ~= nil then return rawget(t, k) end
 | 
						|
 | 
						|
            -- as we're not going to return nothing here (to allow unknown directives to be ignored)
 | 
						|
            local f = function()
 | 
						|
                return f
 | 
						|
            end
 | 
						|
 | 
						|
            return function() return f end
 | 
						|
        end
 | 
						|
    }
 | 
						|
 | 
						|
    setmetatable(env, mt)
 | 
						|
    
 | 
						|
    local fileData = LoadResourceFile(owningResource, file)
 | 
						|
    local mapFunction, err = load(fileData, file, 't', env)
 | 
						|
 | 
						|
    if not mapFunction then
 | 
						|
        Citizen.Trace("Couldn't load map " .. file .. ": " .. err .. " (type of fileData: " .. type(fileData) .. ")\n")
 | 
						|
        return
 | 
						|
    end
 | 
						|
 | 
						|
    mapFunction()
 | 
						|
end |