Проблема с перезапуском скриптов (Ctrl + R)

w99zzl1

Участник
Автор темы
108
10
Версия MoonLoader
.026-beta
Всех приветствую! Однажды, при попытке перезапустить скрипты (с помощью reload_all.lua и комбинации клавиш ctrl + r), но тут, все скрипты перестали работать, открыв консоль я понял проблему. В консоли было следущее:

Lua:
[ML] (system) +B.lua: Script terminated. (1090AAEC)
[ML] (system) auto-join.lua: Script terminated. (1090AC74)
[ML] (system) ML-AutoReboot: Script terminated. (01BC698C)
[ML] (system) binder.lua: Script terminated. (01BC6F1C)
... и так далее со всеми моими скриптами
Немного потупив, я решил узнать, из за какого именно скрипта существует эта проблема (путем экспорта всех скриптов из папки moonloader, я поочередно добавлял по одному скрипту и запускал игру пока проблема вновь не появится), в итоге, проблема вызывается из за моего скрипта, который мне очень дорог. Раньше все работало, а скрипт я не помню чтобы как то переписывал/обновлял... Помогите пожалуйста исправить проблему!!! Вот код скрипта:

Lua:
local imgui = require 'mimgui'
local encoding = require 'encoding'
local ffi = require('ffi')
encoding.default = 'CP1251'
local u8 = encoding.UTF8

local inputAutoText = imgui.new.char(256)
ffi.copy(inputAutoText, u8('Алло, я вас слушаю'))

local inputGnewsText1 = imgui.new.char(256)
local inputGnewsText2 = imgui.new.char(256)
local inputGnewsText3 = imgui.new.char(256)
local showGnewsWindow = imgui.new.bool(false)

local function json(filePath)
    local class = {}
    function class.save(tbl)
        if tbl then
            local F = io.open(filePath, 'w')
            F:write(encodeJson(tbl) or '{}')
            F:close()
            return true, 'ok'
        end
        return false, 'table = nil'
    end

    function class.load(defaultTable)
        if not doesFileExist(filePath) then
            class.save(defaultTable or {})
        end
        local F = io.open(filePath, 'r')
        local content = F:read('*a')
        local TABLE = decodeJson(content or '{}')
        F:close()
        for def_k, def_v in pairs(defaultTable) do
            if TABLE[def_k] == nil then
                TABLE[def_k] = def_v
            end
        end
        return TABLE
    end
    return class
end

createDirectory(getWorkingDirectory() .. '/config/')
local jPath = getWorkingDirectory() .. '/config/cfg.json'
local j = json(jPath).load({
    autoP = false,
    gnews1 = "Текст новости по умолчанию", -- Текст новости по умолчанию
    autoAnswerText = "Алло, я вас слушаю", -- Текст автоответчика по умолчанию
})

local window = imgui.new.bool()
local autoP = imgui.new.bool(j.autoP)

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
end)

imgui.OnFrame(function() return window[0] end, function(player)
    local X, Y = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(415, 279), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(X / 2 - 207, Y / 2 - 139), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'Название окна', window)

    -- Раздел для автоответчика
    if imgui.CollapsingHeader(u8"Role-Play отыгровки", imgui.TreeNodeFlags.DefaultOpen) then 
        if imgui.Checkbox(u8'Авто ответчик (звонки)', autoP) then
            j.autoP = autoP[0]
            json(jPath).save(j)
        end
        
        if autoP[0] then
            if imgui.InputTextWithHint(u8'##autoAnswerInput', u8 'Введите текст для автоответчика', inputAutoText, 256) then
                local userInput = u8:decode(ffi.string(inputAutoText))
                if userInput and userInput ~= '' then
                    j.autoAnswerText = userInput
                    json(jPath).save(j)
                end
            end
        end
    end

    if imgui.CollapsingHeader(u8"Для лидеров", imgui.TreeNodeFlags.DefaultOpen) then
        if imgui.Button(u8"Гос. новости", imgui.ImVec2(-1, 0)) then
            showGnewsWindow[0] = true -- Показываем окно новостей
        end
    end

    imgui.End()

    -- Новое окно для ввода новостей
    if showGnewsWindow[0] then
        imgui.SetNextWindowSize(imgui.ImVec2(415, 279), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowPos(imgui.ImVec2(X / 2 - 207, Y / 2 - 139), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"Добавление новости", showGnewsWindow)

        -- Поля ввода новостей
        if imgui.InputTextWithHint(u8'##gnewsInput1', u8 'Введите первую новость', inputGnewsText1, 256) then

        end

        if imgui.InputTextWithHint(u8'##gnewsInput2', u8 'Введите вторую новость', inputGnewsText2, 256) then

        end

        if imgui.InputTextWithHint(u8'##gnewsInput3', u8 'Введите третью новость', inputGnewsText3, 256) then

        end

        if imgui.Button(u8"Отправить", imgui.ImVec2(-1, 0)) then
            local news1 = u8:decode(ffi.string(inputGnewsText1))
            local news2 = u8:decode(ffi.string(inputGnewsText2))
            local news3 = u8:decode(ffi.string(inputGnewsText3))
        
            lua_thread.create(function()
                if news1 and news1 ~= '' then
                    sampSendChat("/gnews " .. news1)
                    wait(900)
                end
                if news2 and news2 ~= '' then
                    sampSendChat("/gnews " .. news2)
                    wait(900)
                end
                if news3 and news3 ~= '' then
                    sampSendChat("/gnews " .. news3)
                    wait(900)
                end
            end)
        end
        

        imgui.End()
    end
end)

-- Функция для автоответа
function autoAnswer()
    sampAddChatMessage('/p', -1)
    wait(900)

    if autoP[0] then
        local answerText = j.autoAnswerText or "Алло, я вас слушаю"
        sampAddChatMessage(answerText, -1)
    end
end

-- Функция для команды /uninvite
function cmd_uninvite(args)
    local id, reason = args:match("^(%S+)%s+(.+)$")
    local nickname = sampGetPlayerNickname(tonumber(id))

    if id and reason then
        if nickname then
            nickname = nickname:gsub("_", " ")
            sampAddChatMessage('/me взял бланк с приказом', -1)
            wait(900)
            sampAddChatMessage('/me написал текст приказа об увольнении игрока ' .. nickname, -1)
            wait(900)
            sampAddChatMessage('/me поставил печать', -1)
            wait(900)
            sampAddChatMessage('/me поставил подпись под документом', -1)
            wait(900)
            sampAddChatMessage('/do приказ подписан', -1)
            wait(900)
            sampAddChatMessage('/uninvite ' .. id .. ' ' .. reason, -1)
            sampAddChatMessage('Сотрудник ' .. nickname .. ' был уволен. Причина: ' .. reason, -1)
        else

            sampAddChatMessage('Игрок с ID ' .. id .. ' не найден.', -1)
        end
    else
        sampAddChatMessage('Использование: /uninvite [id] [причина увольнения]', -1)
    end
end

-- Функция для команды /invite
function cmd_invite(args)
    local id = args:match("^(%S+)$")
    local nickname = sampGetPlayerNickname(tonumber(id))

    if id then
        if nickname then
            nickname = nickname:gsub("_", " ")
            sampAddChatMessage('/do На плечах висит рюкзак.', -1)
            wait(900)
            sampAddChatMessage('/me снял рюкзак, открыл его и достал форму и бейджик', -1)
            wait(900)
            sampAddChatMessage('/me передал вещи ' .. nickname, -1)
            wait(900)
            sampAddChatMessage('/invite ' .. id, -1)
            wait(900)
            sampAddChatMessage('/me закрыл рюкзак и повесил его обратно на плечи', -1)
        else
            sampAddChatMessage('Игрок с ID ' .. id .. ' не найден.', -1)
        end
    else
        sampAddChatMessage('Использование: /invite [id]', -1)
    end
end

function cmd_changeskin(args)
    local id = args:match("^(%S+)$")
    local nickname = sampGetPlayerNickname(tonumber(id))
    if id then
        if nickname then
            nickname = nickname:gsub("_", " ")
            sampAddChatMessage('/do На плечах висит рюкзак.', -1)
            wait(900)
            sampAddChatMessage('/me снял рюкзак, открыл его и достал форму и бейджик', -1)
            wait(900)
            sampAddChatMessage('/me передал вещи ' .. nickname, -1)
            wait(900)
            sampAddChatMessage('/changeskin ' .. id, -1)
            wait(900)
            sampAddChatMessage('/me закрыл рюкзак и повесил его обратно на плечи', -1)
        else
            sampAddChatMessage('Игрок с ID ' .. id .. ' не найден.', -1)
        end
    else
        sampAddChatMessage('Использование: /invite [id]', -1)
    end
end

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

    sampRegisterChatCommand('test', function()
        window[0] = not window[0]
    end)

    sampRegisterChatCommand('1p', function()
        lua_thread.create(function()
            autoAnswer()
        end)
    end)

    sampRegisterChatCommand('1uninvite', function(args)
        lua_thread.create(function()
            cmd_uninvite(args)
        end)
    end)

    sampRegisterChatCommand('1invite', function(args)
        lua_thread.create(function()
            cmd_invite(args)
        end)
    end)

    sampRegisterChatCommand('1changeskin', function(args)
        lua_thread.create(function()
            cmd_changeskin(args)
        end)
    end)

    wait(-1)
end
В чем проблема и как мне избежать ошибки "Script terminated" в консоли при перезагрузки скриптов?
 
  • Ха-ха
Реакции: Python_Fanat