local loadedModels = {} local function debugMessage(message, level) if Config and Config.debug then outputDebugString("[mt_model_loader] " .. tostring(message), level or 3) end end local function fileExistsSafe(path) return path and type(path) == "string" and fileExists(path) end local function loadTXD(modelId, path) if not fileExistsSafe(path) then debugMessage("TXD não encontrado: " .. tostring(path) .. " | Modelo: " .. tostring(modelId), 2) return false end local txd = engineLoadTXD(path, modelId) if not txd then debugMessage("Falha ao carregar TXD: " .. tostring(path) .. " | Modelo: " .. tostring(modelId), 1) return false end if not engineImportTXD(txd, modelId) then debugMessage("Falha ao importar TXD: " .. tostring(path) .. " | Modelo: " .. tostring(modelId), 1) return false end return txd end local function loadCOL(modelId, path) if not fileExistsSafe(path) then debugMessage("COL não encontrado: " .. tostring(path) .. " | Modelo: " .. tostring(modelId), 2) return false end local col = engineLoadCOL(path, modelId) if not col then debugMessage("Falha ao carregar COL: " .. tostring(path) .. " | Modelo: " .. tostring(modelId), 1) return false end if not engineReplaceCOL(col, modelId) then debugMessage("Falha ao substituir COL: " .. tostring(path) .. " | Modelo: " .. tostring(modelId), 1) return false end return col end local function loadDFF(modelId, path) if not fileExistsSafe(path) then debugMessage("DFF não encontrado: " .. tostring(path) .. " | Modelo: " .. tostring(modelId), 2) return false end local dff = engineLoadDFF(path, modelId) if not dff then debugMessage("Falha ao carregar DFF: " .. tostring(path) .. " | Modelo: " .. tostring(modelId), 1) return false end if not engineReplaceModel(dff, modelId) then debugMessage("Falha ao substituir DFF: " .. tostring(path) .. " | Modelo: " .. tostring(modelId), 1) return false end return dff end local function applyModelOptions(modelId, data) if data.colDistance and tonumber(data.colDistance) then engineSetModelLODDistance(modelId, tonumber(data.colDistance)) end end local function loadModel(modelId, data) if not modelId or type(data) ~= "table" then return false end modelId = tonumber(modelId) if not modelId then return false end loadedModels[modelId] = loadedModels[modelId] or {} -- Ordem compatível com loaders antigos: TXD -> DFF -> COL -- Alguns modelos de mapa/IDs altos precisam receber o modelId também no engineLoad*. if data.txdPath then loadedModels[modelId].txd = loadTXD(modelId, data.txdPath) end if data.dffPath then loadedModels[modelId].dff = loadDFF(modelId, data.dffPath) end if data.colPath then loadedModels[modelId].col = loadCOL(modelId, data.colPath) end applyModelOptions(modelId, data) debugMessage("Modelo carregado: " .. tostring(modelId), 3) return true end local function loadAllModels() if not Config or not Config.models then debugMessage("Config.models não encontrado.", 1) return false end for modelId, data in pairs(Config.models) do loadModel(modelId, data) end debugMessage("Carregamento finalizado.", 3) end local function restoreAllModels() for modelId in pairs(loadedModels) do engineRestoreModel(modelId) engineRestoreCOL(modelId) end loadedModels = {} debugMessage("Modelos restaurados.", 3) end addEventHandler("onClientResourceStart", resourceRoot, loadAllModels) addEventHandler("onClientResourceStop", resourceRoot, restoreAllModels) addCommandHandler("reloadmodels", function() restoreAllModels() setTimer(loadAllModels, 500, 1) debugMessage("Recarregando modelagens...", 3) end)