local streamedElements = {} local debugTimer local enabled local drawStr = '' local SW = guiGetScreenSize() local function getElementInfoStr(element, level) local spaces = string.rep('----- ', level) --if isValidElement(element) then if tonumber(getElementData(element, 'element:model')) then return ('%s%s | model: %s\n'):format(spaces, inspect(element), getElementModel(element)) else return ('%s%s\n'):format(spaces, inspect(element)) end end local function getElementChidrenStr(element, level) local str = '' local children = getElementChildren(element) or {} for i=1, #children do str = str .. getElementInfoStr(children[i], level) str = str .. getElementChidrenStr(children[i], level + 1) end return str end local function pairsByKeys(t) local a = {} for n in pairs(t) do table.insert(a, n) end table.sort(a) local i = 0 local iter = function() i = i + 1 if a[i] == nil then return nil else return a[i], t[a[i]] end end return iter end local function getElementCustomModelString(element) local ELEMENT_MODEL = tonumber(getElementData(element, 'element:model')) if REPLACES and REPLACES[ELEMENT_MODEL] then return {('%d \'%s\' (%d)'):format(ELEMENT_MODEL, REPLACES[ELEMENT_MODEL].name, REPLACES[ELEMENT_MODEL].base), 0xffffa263} else return {('%d'):format(getElementModel(element))} end end local function updateDebugViewInfo() local loadedModelsStr = '' --for customModel, v in pairsByKeys(ALLOCATED_MODELS) do -- local str = ('%d \'%s\' (%d)'):format(customModel, v.name, v.base) -- if loadedModelsStr == '' then -- loadedModelsStr = str -- else -- loadedModelsStr = str .. ', ' .. loadedModelsStr -- end --end drawStr = getElementChidrenStr(resourceRoot, 0) if loadedModelsStr ~= '' then drawStr = 'Loaded models:\n' .. loadedModelsStr .. '\n\n' .. drawStr end streamedElements = {} for _, element in pairs(getElementsByType('vehicle', root, true)) do streamedElements[element] = getElementCustomModelString(element) end for _, element in pairs(getElementsByType('object', root, true)) do streamedElements[element] = getElementCustomModelString(element) end for _, element in pairs(getElementsByType('ped', root, true)) do streamedElements[element] = getElementCustomModelString(element) end for _, element in pairs(getElementsByType('player', root, true)) do streamedElements[element] = getElementCustomModelString(element) end end local function drawDebug() dxDrawText(drawStr, SW/2, 30, SW, 0, 0xFFFFFFFF, 1, 'default-bold') for element, customModelStr in pairs(streamedElements) do local x, y, z = getElementPosition(element) local sx, sy = getScreenFromWorldPosition(x, y, z + 0.5) if sx and sy then dxDrawText(customModelStr[1], sx, sy, sx, sy, customModelStr[2] or 0xFFFFFFFF, 1, 'default', 'center') end end end local function handleElementDestroyed() streamedElements[source] = nil end local function toggleDebugView(cmd) if not enabled then if not debugTimer or not isTimer(debugTimer) then debugTimer = setTimer(updateDebugViewInfo, 1000, 0) end addEventHandler('onClientRender', root, drawDebug, false) addEventHandler('onClientElementDestroy', root, handleElementDestroyed) else streamedElements = {}; if debugTimer then if isTimer(debugTimer) then killTimer(debugTimer) end debugTimer = nil end removeEventHandler('onClientRender', root, drawDebug) removeEventHandler('onClientElementDestroy', root, handleElementDestroyed) end enabled = not enabled outputChatBox('MODELS DEBUG => ' .. (enabled and 'Ativo' or 'Desativado')) end RegisterNetEvent('onClientModelsDebugToggle', resourceRoot, toggleDebugView)