Кто-нибудь знает, как исправить и предотвратить эту ошибку? Я перепробовал все возможные способы, которые мне известны, но ничего не сработало.
[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)
[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