ошибка потока lua

yoshishi

Новичок
Автор темы
15
1
Кто-нибудь знает, как исправить и предотвратить эту ошибку? Я перепробовал все возможные способы, которые мне известны, но ничего не сработало.

[09:12:15.420146] (error) test.lua: cannot resume non-suspended coroutine
stack traceback:
... gta\bitch\GTA San Andreas\moonloader\test.lua: in function 'renderProgress'
... gta\bitch\GTA San Andreas\moonloader\test.lua:180: in function 'drawInstaller'
... gta\bitch\GTA San Andreas\moonloader\test.lua:71: in function <... gta\bitch\GTA San Andreas\moonloader\test.lua:62>
[09:12:15.420146] (error) test.lua: Script died due to an error. (id:7)


Lua:
local bigFont = renderCreateFont("BD Sans", 10, 0x0)
local font = renderCreateFont("Tahoma", 7, 0x1)
-- Path
local workingDir = getWorkingDirectory()
-- URL
local url = "url"
local folders = {
    "\\lib",
    "\\lib\\samp",
    "\\lib\\samp\\events",
    "\\lib\\windows",
    "\\lib\\socket",
    "\\lib\\ssl",
    "\\lib\\xml",
    "\\lib\\md5",
    "\\lib\\mime",
    "\\lib\\lub",
    "\\lib\\mimgui",
    "\\resource",
    "\\resource\\fonts"
}
local files = {
    "lib/samp/events.lua", "lib/samp/raknet.lua", "lib/samp/synchronization.lua", "lib/samp/events/bitstream_io.lua", "lib/samp/events/core.lua", "lib/samp/events/extra_types.lua", "lib/samp/events/handlers.lua", "lib/samp/events/utils.lua",
    "lib/effil.lua", "lib/libeffil.dll",
    "lib/windows/message.lua",
    "lib/sampfuncs.lua",
    "lib/vector3d.lua",
    "lib/vkeys.lua",
    "lib/encoding.lua", 
    "lib/iconv.dll",
    "lib/request.lua",
    "lib/socket.lua", "lib/socket/http.lua", "lib/socket/url.lua", "lib/socket/headers.lua", "lib/socket/core.dll",
    "lib/ssl.dll", "lib/ssl.lua","lib/ssl/https.lua",
    "lib/ltn12.lua",
    "lib/cjson.dll",
    "lib/xml/core.dll", "lib/xml/init.lua", "lib/xml/Parser.lua",
    "lib/md5.lua", "lib/md5/core.dll",
    "lib/base64.dll",
    "lib/mime.lua", "lib/mime/core.dll",
    "lib/lub/Autoload.lua", "lib/lub/init.lua",
    "lib/lfs.dll",
    "lib/mimgui/cdefs.lua", "lib/mimgui/cimguidx9.dll", "lib/mimgui/dx9.lua", "lib/mimgui/imgui.lua",
    "lib/memory.lua",
    "resource/fonts/fa-solid-900.ttf"
}
local libraries = {
    currentFile = "",
    libsProgress = 0,
    totalMissingLibs = 0,
    createdLibs = 0,
}
function checkLib()
    local downloads = {}
    -- Цикл для отображения индикатора выполнения, пока библиотеки ещё обрабатываются
    lua_thread.create(function()
        while true do
            -- Как только прогресс достигнет 100%, завершить цикл
            if libraries.libsProgress >= 100 then
                break
            end
            -- Запустить индикатор выполнения
            if libraries.libsProgress < 100 then
                libraries:new():drawInstaller() -- Запуск индикатора выполнения
            end
            wait(0) -- Имитировать ожидание для следующего обновления прогресса
        end
    end)
    -- Первый проход для подсчёта отсутствующих библиотек (папки и файлы)
    for _, folder in pairs(folders) do
        local fullPath = workingDir .. folder
        if not doesDirectoryExist(fullPath) then
            libraries.totalMissingLibs = libraries.totalMissingLibs + 1
        end
    end
    for _, v in pairs(files) do
        local filePath = workingDir .. '\\' .. v
        if not doesFileExist(filePath) then
            libraries.totalMissingLibs = libraries.totalMissingLibs + 1
        end
    end
    -- Первый проход для создания отсутствующих папок
    for _, folder in pairs(folders) do
        local fullPath = workingDir .. folder
        if not doesDirectoryExist(fullPath) then
            libraries.currentFile = "Создание папки: " .. folder
            createDirectory(fullPath)
            libraries.createdLibs = libraries.createdLibs + 1
            libraries.libsProgress = (libraries.createdLibs / libraries.totalMissingLibs) * 100
            wait(0) -- Имитировать ожидание для обновления прогресса
        end
    end
    -- Второй проход для сбора отсутствующих файлов для загрузки
    for _, v in pairs(files) do
        local filePath = workingDir .. '\\' .. v
        if not doesFileExist(filePath) then
            table.insert(downloads, {url = url .. v, path = filePath, file = v})
        end
    end
    -- Создать новый поток для управления процессом загрузки
    lua_thread.create(function()
        if #downloads > 0 then
            for _, download in ipairs(downloads) do
                libraries.currentFile = "Загрузка файла: " .. download.file
                downloadUrlToFile(download.url, download.path, function(id, status)
                    if status == 6 then -- Файл успешно загружен
                        libraries.createdLibs = libraries.createdLibs + 1
                        libraries.libsProgress = (libraries.createdLibs / libraries.totalMissingLibs) * 100
                    end
                end)
                -- Ожидание вне обратного вызова
                wait(0)
            end
        end
    end)
end
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    checkLib()
    wait(-1)
end
function libraries:new()
    local public = {}
    public.x, public.y = 0, 0
    function public:drawInstaller()
        -- Получить разрешение экрана
        self.x, self.y = getScreenResolution()
        local maxLength = 0
        -- Вычислить требуемую ширину на основе самого длинного пути файла
        for _, file in ipairs(files) do
            maxLength = math.max(maxLength, string.len(file))
        end
        -- Размер коробки
        local boxSizeX = math.ceil(maxLength * 370 / 44) -- Ширина на основе длины самого длинного имени файла
        local boxSizeY = 70 -- Высота
        -- Динамическое позиционирование коробки в правом нижнем углу
        self.x = self.x - boxSizeX - 10 -- 10 пикселей отступа от правого края
        self.y = self.y - boxSizeY - 10 -- 10 пикселей отступа от нижнего края
        -- Нарисовать коробку с границей
        renderDrawBox(self.x, self.y, boxSizeX, boxSizeY, 0xD0101010)
        -- Размер индикатора выполнения
        local sizeX = boxSizeX - 20  -- Ширина (с учётом отступа)
        local sizeY = 12             -- Высота
        -- Вычислить положение индикатора выполнения внутри коробки, по центру
        local progressBarX = self.x + (boxSizeX - sizeX) / 2  -- Центр по горизонтали
        local progressBarY = self.y + (boxSizeY - sizeY) / 2  -- Центр по вертикали
        -- Нарисовать текст над индикатором выполнения
        renderFontDrawText(bigFont, "Установка зависимостей...", progressBarX, progressBarY - 23.5, 0xFFFFFFFF)
        -- Нарисовать индикатор выполнения
        renderProgress(font, progressBarX, progressBarY, sizeX, sizeY, true, 0xD0f1b514, 0x80808080, 0xFF000000, libraries.libsProgress, 100)
        -- Нарисовать текст под индикатором выполнения
        renderFontDrawText(font, libraries.currentFile, progressBarX, progressBarY + 20, 0xFFFFFFFF)
    end
    setmetatable(public, self)
    self.__index = self
    return public
end
function renderProgress(font, posX, posY, sizeX, sizeY, text, barColor, BarBgColor, fontColor, value)
    -- Убедиться, что значение между 0 и 100
    value = math.min(math.max(value, 0), 100)
    -- Нарисовать фон индикатора выполнения
    renderDrawBox(posX, posY, sizeX, sizeY, BarBgColor)
    
    -- Вычислить ширину динамической панели на основе процента
    local dynamic_bar_width = (value / 100) * sizeX
    renderDrawBox(posX, posY, dynamic_bar_width, sizeY, barColor)
    
    if text then
        -- Форматировать текст с символом '%'
        local drawtext = string.format('%d%%', value)
         
        -- Получить ширину текста
        local text_width = renderGetFontDrawTextLength(font, drawtext)
        
        -- Отобразить текст только если ширина динамической панели достаточна для его отображения
        if dynamic_bar_width > text_width then
            renderFontDrawText(font, drawtext, posX + (dynamic_bar_width / 2) - (text_width / 2), posY, fontColor)
        end
    end
end