Гайд [LUA] Событие при краше скрипта.

Lance_Sterling

Известный
Автор темы
956
336
Приветствую уважаемые.
Данная тема создана для облегчения работы с ошибками в скриптах.
К сожалению не нашел на BlastHack гайд как это сделать. Это будет удобно, если вашим скриптом пользуются обычные люди, которые не знают даже что такое moonloader.log
Это будет напрочь упрощать задачу вашим пользователям, просто взял, заскринил, отправил.
Приступим.
ШАГ 1 - Начальная подготовка



В начале скрипта мы вводим имя скрипту, дабы было легче работать.
Lua:
script_name("Имя скрипта")
Если вы хотите скрыть лишние файлы, вы можете создать папку в папке config.
Делается это следующим образом:

Lua:
--в main
if not doesDirectoryExist(getWorkingDirectory()..'\\config\\Имя папки') then
        sampAddChatMessage('Скрипт не увидел рабочей папки. Создаем папку..',0x00BFFF)
        createDirectory(getWorkingDirectory()..'\\config\\Имя папки') --создаем папку с вашим именем в папке config
        wait(500)
        downloadUrlToFile('Прямая ссылка на скачивание файла', getWorkingDirectory()..'\\config\\Имя папки\\errors.lua'--[[Путь сохранения]], function (id, status, p1, p2)
            if status == dlstatus.STATUSEX_ENDDOWNLOAD then
                sampAddChatMessage('Скачивание файла ошибок успешно завершено.',0x00BFFF)
            end
        end)--качаем файл по прямой ссылке, сохраняем в вашу созданную папку.
        errors = script.load(getWorkingDirectory()..'\\config\\Имя папки\\errors.lua')
    end
Созрел вопрос. Что за файл мы качаем?

К сожалению я не знаю как работать с этим прямо в одном файле.
Если бы я вставил код в один файл - он бы работал и на обычную перезагрузку скрипта.
ШАГ 2 - Подгрузка файла.



Теперь нам надо загрузить созданный нами файл, если директория существует.
Залазим выше, прямо к названию вашего скрипта
Lua:
if doesDirectoryExist(getWorkingDirectory()..'\\config\\Название папки') then errors = script.load(getWorkingDirectory()..'\\config\\Название папки\\errors.lua') end
Подгружаем ваш скрипт.
Это можно делать прямо после имени скрипта, но обязательно выше всего кода!! Это важно.
Если вы укажите загрузку файла ниже, скрипт может крашнуть выше, и тогда ошибка не выведется, т.к. файл с ошибками не был загружен!
ШАГ 3 - Основное



Что за скрипт? Все просто.
Данный скрипт имеет всего 6 строчек кода, он отвечает за появление диалога, когда срабатывает ошибка именно в вашем скрипте.

Lua:
require 'lib.sampfuncs'
function onSystemMessage(msg, type, script)
if msg:find('Имя скрипта%.luac?:%d+:.+') and type == 3 then
        sampShowDialog(252,'Что-то пошло не так','{FFFFFF}Произошла непредусмотренная ошибка в скрипте {00BFFF}Имя вашего скрипта{FFFFFF}.\nЕсли данная ошибка повторяется отправьте скриншот данного окна в ВК создателя {00BFFF}vk.com/Ссылка на вк{FFFFFF}\n\n'..msg,'Закрыть',_,0)
    end
end
Вместо диалогов вы можете указать любое другое действие.
Теперь перейдем в Git Hub'у.

Что за ссылки были выше? Все верно, на загрузку этого скрипта в 6 строк.
Диалог вы можете сами редактировать под себя.
Думаю смысла нет рассказывать как загружать и получать прямую ссылку с Git Hub, об этом есть полно гайдов в интернете.
В итоге мы получаем красивый диалог с ошибкой внутри когда скрипт крашится.
sa-mp-485.png

Жду вашей критики, мне будет полезно.

 
Последнее редактирование:

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,283
1675336929368.png

sticker.png

очень радуют таланты на бластхак кидс, скажи пожалуйста, зачем require('lib.moonloader') в скрипте, если ты все равно пишешь type == 3 вместо использования константы из этого самого moonloader.lua?
1675337193976.png
 

Lance_Sterling

Известный
Автор темы
956
336
А что смешного?) Для скомпилированых файлов)

Посмотреть вложение 188292
Посмотреть вложение 188293
очень радуют таланты на бластхак кидс, скажи пожалуйста, зачем require('lib.moonloader') в скрипте, если ты все равно пишешь type == 3 вместо использования константы из этого самого moonloader.lua?
Посмотреть вложение 188294
Я еще слишком говнокодер.
 
Последнее редактирование:

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,283
А что смешного?) Для скомпилированых файлов)
смешная реализация, делать две проверки, когда можно воспользоваться функционалом регулярок
if msg:match('scriptname%.luac?:%d+:.+') then
 
Последнее редактирование:

imring

Ride the Lightning
Всефорумный модератор
2,362
2,545
if msg:find('Имя скрипта%.luac?:%d+:.+') and type == 3 then
не думаю, что через название скрипта будет безопасно, учитывая, что могут поменять название скрипта (это можно исправить используя script (https://wiki.blast.hk/ru/moonloader/lua/onSystemMessage)).

или ид, как в моём примере:
Lua:
local error_handler = [[
require 'moonloader'  

function onSystemMessage(msg, type, sender)
    if not isSampLoaded() or not isSampAvailable() then -- how to print the message?
        return
    end

    if sender.id == %d and (type == TAG.TYPE_ERROR or type == TAG.TYPE_FATAL) then
        sampShowDialog(12345, "error", msg, "ok", nil, 0)
        script.this:unload()
    end
end
]]

local function create_error_handler()
    local error_path = script.this.path .. '_temp'
    local error_script = io.open(error_path, 'w')
    error_script:write(error_handler:format(script.this.id))
    error_script:close()
   
    script.load(error_path)
    os.remove(error_path)
end

function main()
    while not isSampAvailable() do wait(0) end

    create_error_handler()
    sampRegisterChatCommand("test0", function () error("test0") end)
    sampRegisterChatCommand("test1", function () nil_function() end)
    sampRegisterChatCommand("test2", function () require 'unknown' end)
    wait(-1)
end
результат:
1675356351931.png

1675356355480.png

1675356359851.png
 

Lance_Sterling

Известный
Автор темы
956
336
не думаю, что через название скрипта будет безопасно, учитывая, что могут поменять название скрипта (это можно исправить используя script (https://wiki.blast.hk/ru/moonloader/lua/onSystemMessage)).

или ид, как в моём примере:
Lua:
local error_handler = [[
require 'moonloader' 

function onSystemMessage(msg, type, sender)
    if not isSampLoaded() or not isSampAvailable() then -- how to print the message?
        return
    end

    if sender.id == %d and (type == TAG.TYPE_ERROR or type == TAG.TYPE_FATAL) then
        sampShowDialog(12345, "error", msg, "ok", nil, 0)
        script.this:unload()
    end
end
]]

local function create_error_handler()
    local error_path = script.this.path .. '_temp'
    local error_script = io.open(error_path, 'w')
    error_script:write(error_handler:format(script.this.id))
    error_script:close()
  
    script.load(error_path)
    os.remove(error_path)
end

function main()
    while not isSampAvailable() do wait(0) end

    create_error_handler()
    sampRegisterChatCommand("test0", function () error("test0") end)
    sampRegisterChatCommand("test1", function () nil_function() end)
    sampRegisterChatCommand("test2", function () require 'unknown' end)
    wait(-1)
end
результат:
Тоже можно
 

Lance_Sterling

Известный
Автор темы
956
336
не думаю, что через название скрипта будет безопасно, учитывая, что могут поменять название скрипта (это можно исправить используя script (https://wiki.blast.hk/ru/moonloader/lua/onSystemMessage)).

или ид, как в моём примере:
Lua:
local error_handler = [[
require 'moonloader' 

function onSystemMessage(msg, type, sender)
    if not isSampLoaded() or not isSampAvailable() then -- how to print the message?
        return
    end

    if sender.id == %d and (type == TAG.TYPE_ERROR or type == TAG.TYPE_FATAL) then
        sampShowDialog(12345, "error", msg, "ok", nil, 0)
        script.this:unload()
    end
end
]]

local function create_error_handler()
    local error_path = script.this.path .. '_temp'
    local error_script = io.open(error_path, 'w')
    error_script:write(error_handler:format(script.this.id))
    error_script:close()
  
    script.load(error_path)
    os.remove(error_path)
end

function main()
    while not isSampAvailable() do wait(0) end

    create_error_handler()
    sampRegisterChatCommand("test0", function () error("test0") end)
    sampRegisterChatCommand("test1", function () nil_function() end)
    sampRegisterChatCommand("test2", function () require 'unknown' end)
    wait(-1)
end
результат:
но я все таки не понимаю зачем, если скрипт может не дойти до мейна, например если нет библиотеки выше мейна
еще тут строчек больше)
 

imring

Ride the Lightning
Всефорумный модератор
2,362
2,545
например если нет библиотеки выше мейна
поставь обработчик вначале скрипта
правда это имеет смысл, если ты перезапускаешь скрипт в игре, поскольку при первом запуске у тебя самп не загрузился и ты пытаешься вывести сообщение

еще тут строчек больше)
из-за одной лишь проверки на загрузку сампа?
 

Lance_Sterling

Известный
Автор темы
956
336
поставь обработчик вначале скрипта
правда это имеет смысл, если ты перезапускаешь скрипт в игре, поскольку при первом запуске у тебя самп не загрузился и ты пытаешься вывести сообщение


из-за одной лишь проверки на загрузку сампа?
все же позволь спросить, где ты блять был когда я это искал?)