Вопросы по Lua скриптингу

Общая тема для вопросов по разработке скриптов на языке программирования Lua, в частности под MoonLoader.
  • Задавая вопрос, убедитесь, что его нет в списке частых вопросов и что на него ещё не отвечали (воспользуйтесь поиском).
  • Поищите ответ в теме посвященной разработке Lua скриптов в MoonLoader
  • Отвечая, убедитесь, что ваш ответ корректен.
  • Старайтесь как можно точнее выразить мысль, а если проблема связана с кодом, то обязательно прикрепите его к сообщению, используя блок [code=lua]здесь мог бы быть ваш код[/code].
  • Если вопрос связан с MoonLoader-ом первым делом желательно поискать решение на wiki.

Частые вопросы

Как научиться писать скрипты? С чего начать?
Информация - Гайд - Всё о Lua скриптинге для MoonLoader(https://blast.hk/threads/22707/)
Как вывести текст на русском? Вместо русского текста у меня какие-то каракули.
Изменить кодировку файла скрипта на Windows-1251. В Atom: комбинация клавиш Ctrl+Shift+U, в Notepad++: меню Кодировки -> Кодировки -> Кириллица -> Windows-1251.
Как получить транспорт, в котором сидит игрок?
Lua:
local veh = storeCarCharIsInNoSave(PLAYER_PED)
Как получить свой id или id другого игрока?
Lua:
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
local _, id = sampGetPlayerIdByCharHandle(ped) -- получить ид другого игрока. ped - это хендл персонажа
Как проверить, что строка содержит какой-то текст?
Lua:
if string.find(str, 'текст', 1, true) then
-- строка str содержит "текст"
end
Как эмулировать нажатие игровой клавиши?
Lua:
local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
Все иды клавиш находятся в файле moonloader/lib/game/keys.lua.
Подробнее о функции setGameKeyState здесь: lua - setgamekeystate | BlastHack — DEV_WIKI(https://www.blast.hk/wiki/lua:setgamekeystate)
Как получить id другого игрока, в которого целюсь я?
Lua:
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
  local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
  if result then -- проверить, прошло ли получение ида успешно
    -- здесь любые действия с полученным идом игрока
  end
end
Как зарегистрировать команду чата SAMP?
Lua:
-- До бесконечного цикла/задержки
sampRegisterChatCommand("mycommand", function (param)
     -- param будет содержать весь текст введенный после команды, чтобы разделить его на аргументы используйте string.match()
    sampAddChatMessage("MyCMD", -1)
end)
Крашит игру при вызове sampSendChat. Как это исправить?
Это происходит из-за бага в SAMPFUNCS, когда производится попытка отправки пакета определенными функциями изнутри события исходящих RPC и пакетов. Исправления для этого бага нет, но есть способ не провоцировать его. Вызов sampSendChat изнутри обработчика исходящих RPC/пакетов нужно обернуть в скриптовый поток с нулевой задержкой:
Lua:
function onSendRpc(id)
  -- крашит:
  -- sampSendChat('Send RPC: ' .. id)

  -- норм:
  lua_thread.create(function()
    wait(0)
    sampSendChat('Send RPC: ' .. id)
  end)
end
 
Последнее редактирование:

aaaaaaaaaaaaaaaaaaa293

Новичок
2
0
как сделать так, чтобы с открытым чатом не работала команда, при нажатии на клавишу, на которую забинжена эта команда?

и еще, как сделать так, чтобы при зажатии, допустим, "пкм" и нажатии клавиши "2" выводилась команда?
 

Corrygаn

Участник
225
6
Можно ли такие же штучки в imgui сделать?
Screenshot_41.png
 

blame

Участник
46
12
Можно ли такие же штучки в imgui сделать?Посмотреть вложение 91792
Да можно, но понадобится библиотека imgui.addons
Подключаешь библиотеку, перед OnDrawFrame вставляешь вот это как для теста:
Код:
local imBool = imgui.ImBool(false)
А в OnDrawFrame вот это:
Код:
imgui.ToggleButton("Test", imBool)
 

Nelit

Потрачен
252
38
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

NOWLEX

Участник
41
3
Подскажите пожалуйста, можно ли как то изменить флаг оружия? Например что бы м4 считалась тяжелым оружием(нельзя бегать и прыгать).
 

Nelit

Потрачен
252
38
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Подскажите пожалуйста, можно ли как то изменить флаг оружия? Например что бы м4 считалась тяжелым оружием(нельзя бегать и прыгать).
Лезть в код движка игры. Или же визуально сделать.
 

copypaste_scripter

Известный
1,218
223
Lua:
lua_thread.create(function()
    if text:find("чтобы закрыть организационный транспорт") and not isCarEngineOn(played_ped) then
    wait (500)
    sampSendChat("/engine")
    else return false
    end
end)

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

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,771
11,214
Lua:
lua_thread.create(function()
    if text:find("чтобы закрыть организационный транспорт") and not isCarEngineOn(played_ped) then
    wait (500)
    sampSendChat("/engine")
    else return false
    end
end)

как сделать, чтобы при укащанного текста проверил заведен ли двигатель машины в котором сижу водителем, а если не заведен чтобы завелся командой?
вроде как-то так:
Lua:
lua_thread.create(function()
    if text:find("чтобы закрыть организационный транспорт") and getDriverOfCar(storeCarCharIsInNoSave(PLAYER_PED)) == PLAYER_PED then
        wait(500)
        engineState = isCarEngineOn(storeCarCharIsInNoSave(PLAYER_PED))
        if engineState == 0 then sampSendChat('/engine') end
    else
        return false
    end
end)
 
  • Нравится
Реакции: copypaste_scripter

Vabots

Участник
62
0
Ребят, хочу создать вот такую функцию:


Но чтобы например там был маленький знак вопросика, ан которой можно было бы навестись и посмотреть информации.

Может у вас есть примеры какие-то? Какие-то ключевые команды, чтобы я смог дальше поискать. А то никак адекватно вопрос задать не могую
 

bottom_text

Известный
675
318
Ребят, хочу создать вот такую функцию:


Но чтобы например там был маленький знак вопросика, ан которой можно было бы навестись и посмотреть информации.

Может у вас есть примеры какие-то? Какие-то ключевые команды, чтобы я смог дальше поискать. А то никак адекватно вопрос задать не могую
1617447528845.png


https://www.blast.hk/threads/64892/ тут есть пример
 
  • Нравится
Реакции: Vabots

Snoopcheg

Известный
151
82
Ребят, хочу создать вот такую функцию:


Но чтобы например там был маленький знак вопросика, ан которой можно было бы навестись и посмотреть информации.

Может у вас есть примеры какие-то? Какие-то ключевые команды, чтобы я смог дальше поискать. А то никак адекватно вопрос задать не могую
Lua:
function imgui.Question(...)
    imgui.SameLine()
    imgui.TextDisabled('(?)')
    local id = imgui.GetCursorPos()
    imgui.Hint(...)
end

function imgui.Hint(str_id, hint, delay)
    local hovered = imgui.IsItemHovered()
    local col = imgui.GetStyle().Colors[imgui.Col.ButtonHovered]
    local animTime = 0.2
    local delay = delay or 0.00
    local show = true

    if not allHints then allHints = {} end
    if not allHints[str_id] then
        allHints[str_id] = {
            status = false,
            timer = 0
        }
    end

    if hovered then
        for k, v in pairs(allHints) do
            if k ~= str_id and os.clock() - v.timer <= animTime  then
                show = false
            end
        end
    end

    if show and allHints[str_id].status ~= hovered then
        allHints[str_id].status = hovered
        allHints[str_id].timer = os.clock() + delay
    end

    local showHint = function(text, alpha)
        imgui.PushStyleVarFloat(imgui.StyleVar.Alpha, alpha)
        imgui.PushStyleVarFloat(imgui.StyleVar.WindowRounding, 5)
        imgui.BeginTooltip()
            --imgui.TextColored(imgui.ImVec4(col.x, col.y, col.z, 1.00), u8'Подсказка:')
            imgui.PushStyleVarVec2(imgui.StyleVar.ItemSpacing, imgui.ImVec2(0, 0))
            imgui.TextColoredRGB(text, false, true)
            imgui.PopStyleVar()
        imgui.EndTooltip()
        imgui.PopStyleVar(2)
    end

    if show then
        local btw = os.clock() - allHints[str_id].timer
        if btw <= animTime then
            local s = function(f)
                return f < 0.0 and 0.0 or (f > 1.0 and 1.0 or f)
            end
            local alpha = hovered and s(btw / animTime) or s(1.00 - btw / animTime)
            showHint(hint, alpha)
        elseif hovered then
            showHint(hint, 1.00)
        end
    end
end

function imgui.TextColoredRGB(text, shadow, wrapped)
    local style = imgui.GetStyle()
    local colors = style.Colors

    local designText = function(text)
        local pos = imgui.GetCursorPos()
        for i = 1, 1 do
            imgui.SetCursorPos(imgui.ImVec2(pos.x + i, pos.y))
            imgui.TextColored(imgui.ImVec4(0, 0, 0, 1), text)
            imgui.SetCursorPos(imgui.ImVec2(pos.x - i, pos.y))
            imgui.TextColored(imgui.ImVec4(0, 0, 0, 1), text)
            imgui.SetCursorPos(imgui.ImVec2(pos.x, pos.y + i))
            imgui.TextColored(imgui.ImVec4(0, 0, 0, 1), text)
            imgui.SetCursorPos(imgui.ImVec2(pos.x, pos.y - i))
            imgui.TextColored(imgui.ImVec4(0, 0, 0, 1), text)
        end
        imgui.SetCursorPos(pos)
    end

    text = text:gsub('{(%x%x%x%x%x%x)}', '{%1FF}')
    local render_func = wrapped and imgui_text_wrapped or function(clr, text)
        if clr then imgui.PushStyleColor(ffi.C.ImGuiCol_Text, clr) end
        if shadow then designText(text) end
        imgui.TextUnformatted(text)
        if clr then imgui.PopStyleColor() end
    end

    local split = function(str, delim, plain)
        local tokens, pos, i, plain = {}, 1, 1, not (plain == false)
        repeat
            local npos, epos = string.find(str, delim, pos, plain)
            tokens[i] = string.sub(str, pos, npos and npos - 1)
            pos = epos and epos + 1
            i = i + 1
        until not pos
        return tokens
    end

    local color = colors[ffi.C.ImGuiCol_Text]
    for _, w in ipairs(split(text, '\n')) do
        local start = 1
        local a, b = w:find('{........}', start)
        while a do
            local t = w:sub(start, a - 1)
            if #t > 0 then
                render_func(color, t)
                imgui.SameLine(nil, 0)
            end

            local clr = w:sub(a + 1, b - 1)
            if clr:upper() == 'STANDART' then color = colors[ffi.C.ImGuiCol_Text]
            else
                clr = tonumber(clr, 16)
                if clr then
                    local r = bit.band(bit.rshift(clr, 24), 0xFF)
                    local g = bit.band(bit.rshift(clr, 16), 0xFF)
                    local b = bit.band(bit.rshift(clr, 8), 0xFF)
                    local a = bit.band(clr, 0xFF)
                    color = imgui.ImVec4(r / 255, g / 255, b / 255, a / 255)
                end
            end

            start = b + 1
            a, b = w:find('{........}', start)
        end
        imgui.NewLine()
        if #w >= start then
            imgui.SameLine(nil, 0)
            render_func(color, w:sub(start))
        end
    end
end
 
  • Нравится
Реакции: Vabots

Licht

Известный
238
32
Что не так делаю?
attempt to concatenate global 'name' (a nil value)
На что агр выделено

Lua:
function database_wanted()

local wantedlistt = getwantedwrt()

            imgui.BeginChild('##lefto', imgui.ImVec2(350, 0), true)

            for num, name in pairs(wantedlistt) do

                local name = name:gsub('.txt', '')

                if imgui.Selectable(u8(name), false) then selected34 = num end

            end

            imgui.EndChild()

            imgui.SameLine()

imgui.BeginChild('#MM2', imgui.ImVec2(705, 0), true)

imgui.CenterTextColoredRGB(tostring'{0088ff}Розыск ')

    for num, name in pairs(wantedlistt) do

        if num == selected34 then

            local namech = name:gsub('.txt', '')

            imgui.SetCursorPosX((imgui.GetWindowWidth() - 200) / 2)

            imgui.PushItemWidth(200)

            imgui.PushAllowKeyboardFocus(false)

            imgui.InputText("##search_wd", search_wd, imgui.InputTextFlags.EnterReturnsTrue)

            imgui.PopAllowKeyboardFocus()

            imgui.PopItemWidth()

            if not imgui.IsItemActive() and #search_wd.v == 0 then

                imgui.SameLine((imgui.GetWindowWidth() - imgui.CalcTextSize(fa.ICON_SEARCH..u8(' Поиск ')).x) / 2)

                imgui.TextColored(imgui.ImVec4(0.5, 0.5, 0.5, 1), fa.ICON_SEARCH..u8(' Поиск '))

            end

            imgui.CenterTextColoredRGB('{868686}Двойной клик по строке, скопирует строчку в буфер')

            imgui.Separator()

            local rrd12 = io.open(getWorkingDirectory() .. "\\base logs\\"..name)

            for line in rfds:lines() do

                if #search_wd.v < 1 then

                    imgui.TextWrapped(u8(line))

                    imgui.Hint(u8'Кликните дважды, что бы скопировать строку в буфер', 1)

                    if imgui.IsItemHovered() and imgui.IsMouseDoubleClicked(0) then

                        setClipboardText(text)

                    end

                else

                    if string.rlower(line):find(string.rlower(u8:decode(search_wd.v))) then

                        imgui.TextWrapped(u8(line))

                        imgui.Hint(u8'Кликните дважды, что бы скопировать строку в буфер', 1)

                        if imgui.IsItemHovered() and imgui.IsMouseDoubleClicked(0) then

                            sampSetChatInputEnabled(true)

                            sampSetChatInputText(line)

                        end

                    end

                end

            end

        end

    end

    imgui.EndChild()

end
В 55 строке юзал что lanes() что
gmatch('[^\r\n]+')
Одна песня
 

Fott

Простреленный
3,431
2,270
Что не так делаю?
attempt to concatenate global 'name' (a nil value)
На что агр выделено

Lua:
function database_wanted()

local wantedlistt = getwantedwrt()

            imgui.BeginChild('##lefto', imgui.ImVec2(350, 0), true)

            for num, name in pairs(wantedlistt) do

                local name = name:gsub('.txt', '')

                if imgui.Selectable(u8(name), false) then selected34 = num end

            end

            imgui.EndChild()

            imgui.SameLine()

imgui.BeginChild('#MM2', imgui.ImVec2(705, 0), true)

imgui.CenterTextColoredRGB(tostring'{0088ff}Розыск ')

    for num, name in pairs(wantedlistt) do

        if num == selected34 then

            local namech = name:gsub('.txt', '')

            imgui.SetCursorPosX((imgui.GetWindowWidth() - 200) / 2)

            imgui.PushItemWidth(200)

            imgui.PushAllowKeyboardFocus(false)

            imgui.InputText("##search_wd", search_wd, imgui.InputTextFlags.EnterReturnsTrue)

            imgui.PopAllowKeyboardFocus()

            imgui.PopItemWidth()

            if not imgui.IsItemActive() and #search_wd.v == 0 then

                imgui.SameLine((imgui.GetWindowWidth() - imgui.CalcTextSize(fa.ICON_SEARCH..u8(' Поиск ')).x) / 2)

                imgui.TextColored(imgui.ImVec4(0.5, 0.5, 0.5, 1), fa.ICON_SEARCH..u8(' Поиск '))

            end

            imgui.CenterTextColoredRGB('{868686}Двойной клик по строке, скопирует строчку в буфер')

            imgui.Separator()

            local rrd12 = io.open(getWorkingDirectory() .. "\\base logs\\"..name)

            for line in rfds:lines() do

                if #search_wd.v < 1 then

                    imgui.TextWrapped(u8(line))

                    imgui.Hint(u8'Кликните дважды, что бы скопировать строку в буфер', 1)

                    if imgui.IsItemHovered() and imgui.IsMouseDoubleClicked(0) then

                        setClipboardText(text)

                    end

                else

                    if string.rlower(line):find(string.rlower(u8:decode(search_wd.v))) then

                        imgui.TextWrapped(u8(line))

                        imgui.Hint(u8'Кликните дважды, что бы скопировать строку в буфер', 1)

                        if imgui.IsItemHovered() and imgui.IsMouseDoubleClicked(0) then

                            sampSetChatInputEnabled(true)

                            sampSetChatInputText(line)

                        end

                    end

                end

            end

        end

    end

    imgui.EndChild()

end
В 55 строке юзал что lanes() что
gmatch('[^\r\n]+')
Одна песня
че за rfds? какая строка именно крашит? Ты вообще понимаешь что делаешь? Ты вообще знаешь что делает библиотека lanes?