attempt to concatenate global 'id' (a nil value) stack traceback:

$Mr.R1ch$

Участник
Автор темы
90
23
Версия MoonLoader
.027.0-preview
Короче проблема. Пытаюсь в скрипте сделать хрень по типу умного выдачи розыска. Как работает: пишем команду /su [ID игрока], открылось окно, выбираем пункт и должно выдаваться, но вот когда идёт строка с командой sampSendChat('/su ..'id..' ') то скрипт вылетает и даёт ошибку, может это я еблан и не могу найти ошибку или что, помогите.

Говнокод:
script_name 'Window_SU'
local imgui = require 'mimgui'
local new = imgui.new

local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local faicons = require('fAwesome6')
local ffi = require 'ffi'

local search = imgui.new.char[128]()

local commands = {'1'}

local tag = "{00BFFF}[MVDHELPER SUSPECT]:{ffffff}"

local WinState = new.bool(false) -- Исправлено добавлением начального значения для WinState
local MainWindow = new.bool(false)

function main()

    while not isSampAvailable() do
        wait(100)
    end
    wait(500)
end
imgui.OnFrame(function()
  return WinState[0]
end, function(player)
  imgui.SetNextWindowPos(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
  imgui.SetNextWindowSize(imgui.ImVec2(800, 700), imgui.Cond.Always)
  imgui.Begin(u8'Умная выдача розыска', WinState, imgui.WindowFlags.NoResize)
  imgui.InputTextWithHint('##Search',u8'Поиск',search,256)
  imgui.SameLine()
    if imgui.Button(u8'Очистить') then
        imgui.StrCopy(search,'')   
        else
        imgui.SetCursorPos(imgui.ImVec2(745, 39))
     if imgui.Button(faicons('gear'), imgui.ImVec2(50, 50)) then
     MainWindow[0] = not MainWindow[0]
 end
 for k,v in pairs(commands) do -- парсим таблицу с текстом
        if u8(v):find(ffi.string(search)) then -- если значение с таблицы u8(v) совпадает со значением инпута ffi.string(search), то
            imgui.Text(u8(v)) -- отображаем текст
        end
end
 
if imgui.CollapsingHeader(u8'Глава 1. Нанесение телесных повреждений.') then
    imgui.TextWrapped(u8'Статья 1.1 | Нанесение телесных повреждений по неосторожности гражданскому лицу  | 1*.')
    if imgui.Button(u8'Выдать') then
        lua_thread.create(function()
            sampSendChat('/me зажал кнопку на опции и сообщил диспетчеру приметы подозреваемого')
            wait(1200)
            sampSendChat('/do Преступник занесен в базу данных.')
            wait(1200)
            sampSendChat('/su '..id..' ')
            wait(1200)
        end)
    end
    imgui.TextWrapped(u8'Статья 1.2 | Умышленное нанесение телесных повреждений гражданскому | 2*.')
    imgui.Separator()
    imgui.TextWrapped(u8'Статья 1.3 | Нанесение телесных повреждений по неосторожности государственному служащему при исполнении | 3*.')
    imgui.Separator()
    imgui.TextWrapped(u8'Статья 1.4 | Умышленное нанесение телесных повреждений государственному служащему при исполнении | 4*.')
    imgui.Separator()
end
if imgui.CollapsingHeader(u8'Глава 2. Вооруженное нападение.') then
    imgui.TextWrapped(u8'Статья 2.1 | Вооруженное нападение на гражданское лицо | 5*.')
    imgui.Separator()
    imgui.TextWrapped(u8'Статья 2.2 | Вооруженное нападение на государственного служащего при исполнении | 6*.')
    imgui.Separator()
    imgui.TextWrapped(u8'Статья 2.3 | Вооруженное нападение на гражданское лицо либо на государственного служащего при исполнении в центре опасного района(гетто) | 6*.')
    imgui.Separator()
end
if imgui.CollapsingHeader(u8'Глава 3. Разрушение целостности штата, его законов и захват власти силовым путем.') then
    imgui.TextWrapped(u8'Статья 3.1 | Попытка разрушения целостности штата | (лишение всех лицензий и ЧС гос) 6*.')
    imgui.Separator()
    imgui.TextWrapped(u8'Статья 3.2 | Разрушение целостности штата | (лишение всех лицензий и ЧС гос) 6*.')
    imgui.Separator()
    imgui.TextWrapped(u8'Статья 3.3 | Попытка захвата власти штата Уинслоу | (лишение всех лицензий и ЧС гос) 6*.')
    imgui.Separator()
    imgui.TextWrapped(u8'Статья 3.4 | Захват власти штата Уинслоу | (лишение всех лицензий и ЧС гос) 6*.')
    imgui.Separator()
end
if imgui.CollapsingHeader(u8'Глава 4. Соучастие в преступлении.') then
    imgui.TextWrapped(u8'Статья 4.1 | Соучастие в преступлении, гражданин понесет такое же наказание, какое и лицо совершившее его.')
    imgui.Separator()
end
if imgui.CollapsingHeader(u8'Глава 5. Ношение оружия.') then
   imgui.TextWrapped(u8'Статья 5.1 | Ношение огнестрельного оружия в открытом виде | (лишение лицензии) 2*.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 5.2 | Ношение огнестрельного оружия без наличия при себе лицензии на его использование | 3*.')
   imgui.Separator()
end
if imgui.CollapsingHeader(u8'Глава 6. Нелегальная деятельность.') then
   imgui.TextWrapped(u8'Статья 6.1 | Употребление наркотических веществ | 1*.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 6.2 | Незаконное приобретение, хранение, перевозку, изготовление, сбыт и посев, наркотических веществ, а также галлюциногенных растений и их семян - 6 Степень розыска.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 6.3 | Приобретение, хранение, перевозку, сбыт, отмычек от тюремной двери, либо отмычек для вскрытия машин | 4*.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 6.4 | Сбыт либо приобретение поддельных документов(новые документы) - 6 Степень розыска.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 6.5 | Покупка, создание, или же продажу огнестрельного оружия вне официальных аммунаций | 6*')
   imgui.Separator()
end
if imgui.CollapsingHeader(u8'Глава 7. Оскорбление и неадекватное поведение.') then
   imgui.TextWrapped(u8'Статья 7.1 | Oскорбление или неадекватное поведение в сторону гражданина | 2* или 250.000$ штрафа.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 7.2 | Oскорбление или неадекватное поведение в сторону государственного служащего при исполнении | 3* или 500.000$ штрафа.')
   imgui.Separator()
end
if imgui.CollapsingHeader(u8'Глава 8. Несанкционированный митинг.') then
    imgui.TextWrapped(u8'Статья 8.1 | Участие в несанкционированном митинге | 3*.')
    imgui.Separator()
    imgui.TextWrapped(u8'Статья 8.2 | Вооружённый несанкционированный митинг | 6*.')
    imgui.Separator()
    imgui.TextWrapped(u8'Статья 8.3 | Bозглавление несанкционированных митингов/митинга | 6*.')
    imgui.Separator()
end
if imgui.CollapsingHeader(u8'Глава 9. Угрозы.') then
   imgui.TextWrapped(u8'Статья 9.1 | Угрозы в любой форме в сторону гражданина | 2*.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 9.2 | Угрозы в любой форме в сторону государственного служащего при исполнении | 3*.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 9.3 | Угрозы в любой форме на покушение на жизнь и здоровье гражданина | 5*.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 9.4 | Угрозы в любой форме на покушение жизни и здоровью в сторону государственного служащего при исполнении | 6*.')
   imgui.Separator()
end
if imgui.CollapsingHeader(u8'Глава 10. Террористическая деятельность.') then
   imgui.TextWrapped(u8'Статья 10.1 | Кража или попытка кражи боеприпасов с военных объектов | 5*.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 10.2 | Организация или участие в теракте | (лишение лицензий) 6*.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 10.3 | Захват государственных учреждений | (лишение лицензий) 6*.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 10.4 | Взятие граждан в заложники или их похищение, в дальнейшем взятие в заложники | 6*.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 10.5 | Посягательство на свободу, принуждения к чему либо | 6*.')
   imgui.Separator()
end
if imgui.CollapsingHeader(u8'Глава 11. Государственная измена.') then
   imgui.TextWrapped(u8'Статья 11.1 | Нарушение статей относящихся к государственной измене Конституции штата Уинслоу | 6* (изъятие лицензий и ЧС гос.)')
   imgui.Separator()
end
if imgui.CollapsingHeader(u8'Глава 12. Физические, моральные, психологические увечья.') then
   imgui.TextWrapped(u8'Статья 12.1 | Проституция | 3*.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 12.2 | Изнасилование| 4*.')
   imgui.Separator()
   imgui.TextWrapped(u8'Статья 12.3 | Вовлечения занятием проституцией или принуждение занятия проституцией | 6*.')
   imgui.Separator()
end
imgui.End()
end)

 
function cmd_su(id)

    if id == "" then
    sampAddChatMessage(tag.. 'Введите /su [ID] для выдачи умного розыска', -1)
    else
    
        lua_thread.create(function()
            WinState[0] = not WinState[0]
        end)
    end
end

function main()
    sampRegisterChatCommand("su",cmd_su)
    wait(-1)
end


imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
    local config = imgui.ImFontConfig()
    config.MergeMode = true
    config.PixelSnapH = true
    iconRanges = imgui.new.ImWchar[3](faicons.min_range, faicons.max_range, 0)
    imgui.GetIO().Fonts:AddFontFromMemoryCompressedBase85TTF(faicons.get_font_data_base85('solid'), 30, config, iconRanges)
end)

Это мимгуи если шо, не имгуи
 
Решение
С телефона немного сложновато что-то понять, ибо привык с компьютера, но я надеюсь, что тебе это поможет.

Во-первых, я немного не понял, почему у тебя 2 функции main() на 20 и 171 строке. Удали ту, что на 20. Или на 171, но перенеси оттуда команду в ту, что на 20 строке. И wait(500) измени на wait(-1)

Во-вторых, у тебя id - локальная переменная (ну, аргумент функции) и она не выходит за функцию cmd_su, поэтому в OnFrame её не видно.

Где-то в начале кода (можешь под local tag) объяви переменную:
local pID = -1, а в функции cmd_su, где у тебя else, пропиши после lua_thread.create(function(), вот эту строчечку:
pID = id - так ты запишешь введённый ID в...

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
С телефона немного сложновато что-то понять, ибо привык с компьютера, но я надеюсь, что тебе это поможет.

Во-первых, я немного не понял, почему у тебя 2 функции main() на 20 и 171 строке. Удали ту, что на 20. Или на 171, но перенеси оттуда команду в ту, что на 20 строке. И wait(500) измени на wait(-1)

Во-вторых, у тебя id - локальная переменная (ну, аргумент функции) и она не выходит за функцию cmd_su, поэтому в OnFrame её не видно.

Где-то в начале кода (можешь под local tag) объяви переменную:
local pID = -1, а в функции cmd_su, где у тебя else, пропиши после lua_thread.create(function(), вот эту строчечку:
pID = id - так ты запишешь введённый ID в /su в другую переменную.

Теперь в OnFrame, где у тебя отыгровка РПшки, сделай условие, что у тебя pID не равно -1, чтобы ты случайно "никого" в розыск не попытался объявить.
Lua:
if imgui.Button(u8'Выдать') then
    if pID ~= -1 then
        lua_thread.create(function()
            sampSendChat('/me зажал кнопку на опции и сообщил диспетчеру приметы подозреваемого')
            wait(1200)
            sampSendChat('/do Преступник занесен в базу данных.')
            wait(1200)
            sampSendChat('/su '..pID..' ')
            wait(1200)
        end)
    end
end
Также, надо заменить id на pID, так как теперь твой ID с команды /su хранится там.
 
Последнее редактирование:

$Mr.R1ch$

Участник
Автор темы
90
23
С телефона немного сложновато что-то понять, ибо привык с телефона, но я надеюсь, что тебе это поможет.

Во-первых, я немного не понял, почему у тебя 2 функции main() на 20 и 171 строке. Удали ту, что на 20. Или на 171, но перенеси оттуда команду в ту, что на 20 строке. И wait(500) измени на wait(-1)

Во-вторых, у тебя id - локальная переменная (ну, аргумент функции) и она не выходит за функцию cmd_su, поэтому в OnFrame её не видно.

Где-то в начале кода (можешь под local tag) объяви переменную:
local pID = -1, а в функции cmd_su, где у тебя else, пропиши после lua_thread.create(function(), вот эту строчечку:
pID = id - так ты запишешь введённый ID в /su в другую переменную.

Теперь в OnFrame, где у тебя отыгровка РПшки, сделай условие, что у тебя pID не равно -1, чтобы ты случайно "никого" в розыск не попытался объявить.
Lua:
if imgui.Button(u8'Выдать') then
    if pID ~= -1 then
        lua_thread.create(function()
            sampSendChat('/me зажал кнопку на опции и сообщил диспетчеру приметы подозреваемого')
            wait(1200)
            sampSendChat('/do Преступник занесен в базу данных.')
            wait(1200)
            sampSendChat('/su '..pID..' ')
            wait(1200)
        end)
    end
end
Также, надо заменить id на pID, так как теперь твой ID с команды /su хранится там.
Спасибо, все работает. Понял теперь как это использовать на будущее, 4 часа сидел пытался сделать... Спасибо огромное!