Вопросы по 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
 
Последнее редактирование:

chapo

чопа сребдс // @moujeek
Модератор
8,945
11,710
Как поместить Text, Ques и ToggleButton в одну строчку?
Посмотреть вложение 112650
Lua:
imgui.Text('RP guns '); imgui.SameLine()
imgui.Ques('Автоматическая RP отыгровка оружия.')
imgui.ToggleButton("RP guns", ToggleButton1)
Lua:
imgui.Text('RP guns '); imgui.SameLine() imgui.ToggleButton("##RP guns", ToggleButton1) imgui.SameLine() imgui.Ques('Автоматическая RP отыгровка оружия.')
Я так понял функция sampSendChat(string text) не работает с командами активации скрипта или работает?
что бы скрипты видели команду юзай
Lua:
sampProcessChatInput('')
 
  • Нравится
Реакции: Biuti

Shepi

Активный
178
37
Lua:
imgui.Text('RP guns '); imgui.SameLine() imgui.ToggleButton("##RP guns", ToggleButton1) imgui.SameLine() imgui.Ques('Автоматическая RP отыгровка оружия.')

что бы скрипты видели команду юзай
Lua:
sampProcessChatInput('')
как сделать подсказку в имгуи? знак ? и пояснение функции при наводке курсора
 

chapo

чопа сребдс // @moujeek
Модератор
8,945
11,710
как сделать подсказку в имгуи? знак ? и пояснение функции при наводке курсора
Lua:
function imgui.TextQuestion(text)
    imgui.SameLine()
    imgui.TextDisabled('?')
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end
 

barjik

Известный
462
192
Lua:
imgui.Text('RP guns '); imgui.SameLine() imgui.ToggleButton("##RP guns", ToggleButton1) imgui.SameLine() imgui.Ques('Автоматическая RP отыгровка оружия.')
У меня после "imgui.ToggleButton" стоит "if"
Можно как то исправить?
Lua:
imgui.Text('RP guns '); imgui.SameLine()
imgui.Ques('Автоматическая RP отыгровка оружия.')
if imgui.ToggleButton("RP guns", ToggleButton1) then
 

William_Roses

Активный
260
26
У меня после "imgui.ToggleButton" стоит "if"
Можно как то исправить?
Lua:
imgui.Text('RP guns '); imgui.SameLine()
imgui.Ques('Автоматическая RP отыгровка оружия.')
if imgui.ToggleButton("RP guns", ToggleButton1) then
Lua:
imgui.Text('RP guns ')
imgui.SameLine()
imgui.Ques('Автоматическая RP отыгровка оружия.')
imgui.SameLine()
if imgui.ToggleButton("RP guns", ToggleButton1) then
    --code
end
ну или как изначально у тебя было:
Lua:
imgui.Text('RP guns ')

imgui.SameLine()

imgui.Ques('Автоматическая RP отыгровка оружия.')

imgui.SameLine()

imgui.ToggleButton("RP guns", ToggleButton1)

-- можно запихать samline в одну и ту же строку, но лично я предпочитаю делать так
 

barjik

Известный
462
192
Lua:
imgui.Text('RP guns ')
imgui.SameLine()
imgui.Ques('Автоматическая RP отыгровка оружия.')
imgui.SameLine()
if imgui.ToggleButton("RP guns", ToggleButton1) then
    --code
end
ну или как изначально у тебя было:
Lua:
imgui.Text('RP guns ')

imgui.SameLine()

imgui.Ques('Автоматическая RP отыгровка оружия.')

imgui.SameLine()

imgui.ToggleButton("RP guns", ToggleButton1)

-- можно запихать samline в одну и ту же строку, но лично я предпочитаю делать так
Спасибо, но мне нужно чтоб подсказка появлялась в конце, а не по середине
Screenshot_1.png
 

Sanchez.

Известный
705
188
  • Нравится
Реакции: barjik

abnomegd

Активный
335
35
Как пофиксить/сделать чтобы когда выбирал Историю ников то срабатывало команда /history и ник человека напротив, но это работает и на остальных что ниже((надо чтобы не срабатывало))
Вот код
scriptы:
require "lib.moonloader" -- подключение библиотеки
local color_dialog = 0xDEB887

-- Для диалога с ID 12
local dialogArr = {"История ников", "Добавить в записную книгу", "Показать документы", "Действия", "Имущество"}
local dialogStr = ""

for _, str in ipairs(dialogArr) do
    dialogStr = dialogStr .. str .. "\n"
end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("dialog", cmd_dialog)
    while true do
        wait(0)
        -- Блок выполняющийся бесконечно (пока самп активен)
        local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
        if valid and doesCharExist(ped) then
            local result, id = sampGetPlayerIdByCharHandle(ped)
            if result and isKeyJustPressed(VK_X) then
                playerid = id
                cmd_dialog(2)
            end
        end

        local result, button, list, input = sampHasDialogRespond(11) -- /dialog1 (InputBox)
        if result then -- если диалог открыт
            if button == 1 then -- если нажата первая кнопка (Выбрать)
      
            end
        end

        local result, button, list, input = sampHasDialogRespond(12) -- /dialog2 (ListBox)
        if result then -- если диалог открыт
            if button == 1 then -- если нажата первая кнопка (Выбрать)
                    sampSendChat("/history "..sampGetPlayerNickname(tostring(playerid)))
                if list == 0 then
                elseif list == 1 then
                elseif list == 2 then
                elseif list == 3 then
                end
            end
        end
    end
end

function cmd_dialog(arg)
    if tonumber(arg) == 1 then
        sampShowDialog(11, "Диалог с типом ID 1 (InputBox)", "Введите какую-либо строку", "Выбрать", "Закрыть", 1)
    elseif tonumber(arg) == 2 then
        sampShowDialog(12, "Меню взаимодействия с игроком", dialogStr, "Выбрать", "Закрыть", 2)
    end
end

И за что отвечает вот эти функции в диалоговом окне:

figznaet:
   if list == 0 then

                elseif list == 1 then

                elseif list == 2 then

                elseif list == 3 then
 
Последнее редактирование:

#SameLine

Активный
421
38
Не умею делать цвета для окон imgui, нужен прозрачный chiled, без цвета, кому не лень киньте плиз
 

madrasso

Потрачен
883
325
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как пофиксить/сделать чтобы когда выбирал Историю ников то срабатывало команда /history и ник человека напротив, но это работает и на остальных что ниже((надо чтобы не срабатывало))
Вот код
scriptы:
require "lib.moonloader" -- подключение библиотеки
local color_dialog = 0xDEB887

-- Для диалога с ID 12
local dialogArr = {"История ников", "Добавить в записную книгу", "Показать документы", "Действия", "Имущество"}
local dialogStr = ""

for _, str in ipairs(dialogArr) do
    dialogStr = dialogStr .. str .. "\n"
end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("dialog", cmd_dialog)
    while true do
        wait(0)
        -- Блок выполняющийся бесконечно (пока самп активен)
        local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
        if valid and doesCharExist(ped) then
            local result, id = sampGetPlayerIdByCharHandle(ped)
            if result and isKeyJustPressed(VK_X) then
                playerid = id
                cmd_dialog(2)
            end
        end

        local result, button, list, input = sampHasDialogRespond(11) -- /dialog1 (InputBox)
        if result then -- если диалог открыт
            if button == 1 then -- если нажата первая кнопка (Выбрать)
    
            end
        end

        local result, button, list, input = sampHasDialogRespond(12) -- /dialog2 (ListBox)
        if result then -- если диалог открыт
            if button == 1 then -- если нажата первая кнопка (Выбрать)
                    sampSendChat("/history "..sampGetPlayerNickname(tostring(playerid)))
                if list == 0 then
                elseif list == 1 then
                elseif list == 2 then
                elseif list == 3 then
                end
            end
        end
    end
end

function cmd_dialog(arg)
    if tonumber(arg) == 1 then
        sampShowDialog(11, "Диалог с типом ID 1 (InputBox)", "Введите какую-либо строку", "Выбрать", "Закрыть", 1)
    elseif tonumber(arg) == 2 then
        sampShowDialog(12, "Меню взаимодействия с игроком", dialogStr, "Выбрать", "Закрыть", 2)
    end
end

И за что отвечает вот эти функции в диалоговом окне:

figznaet:
   if list == 0 then

                elseif list == 1 then

                elseif list == 2 then

                elseif list == 3 then
Lua:
-- list - переменная содержащая порядковый ид нажатой в диалоге кнопки (listbox), счёт начинается с 0.
if list == 0 then -- если нажато "История ников"
    sampSendChat("/history "..sampGetPlayerNickname(tonumber(playerid)))
elseif list == 1 then -- "Добавить в записную книгу"
elseif list == 2 then -- "Показать документы"
elseif list == 3 then -- "Действия"
elseif list == 4 then -- "Имущество"
end
 

Вложения

  • script.lua
    2.3 KB · Просмотры: 3
  • Нравится
Реакции: abnomegd

Biuti

Участник
165
8
как исправит ошибку?
: attempt to perform arithmetic on upvalue 'input' (a userdata value)
stack traceback:
 
Последнее редактирование:

abnomegd

Активный
335
35
При выборе "Показать документы" должно явится точно такое же диалоговое окно (и там чтобы мог выбирать там например Паспорт, Лицензии, Повестка в армию и т.д)
dialogscript:
require "lib.moonloader" -- подключение библиотеки
local color_dialog = 0xDEB887

-- Для диалога с ID 12
local dialogArr = {"История ников", "Добавить в записную книгу", "Показать документы", "Действия", "Имущество"};
local dialogStr = ""

for _, str in ipairs(dialogArr) do
    dialogStr = dialogStr .. str .. "\n"
end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("dialog", cmd_dialog)
    while true do
        wait(0)
        -- Блок выполняющийся бесконечно (пока самп активен)
        local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
        if valid and doesCharExist(ped) then
            local result, id = sampGetPlayerIdByCharHandle(ped)
            if result and isKeyJustPressed(VK_X) then
                playerid = id
                cmd_dialog(2)
            end
        end

        local result, button, list, input = sampHasDialogRespond(11) -- /dialog1 (InputBox)
        if result then -- если диалог открыт
            if button == 1 then -- если нажата первая кнопка (Выбрать)
      
            end
        end

        local result, button, list, input = sampHasDialogRespond(12) -- /dialog2 (ListBox)
        if result then -- если диалог открыт
            if button == 1 then -- если нажата первая кнопка (Выбрать)
                -- list - переменная содержащая порядковый ид нажатой в диалоге кнопки (listbox), счёт начинается с 0.
                if list == 0 then -- если нажато "История ников"
                    sampSendChat("/history "..sampGetPlayerNickname(tonumber(playerid)))
                elseif list == 1 then -- "Добавить в записную книгу"
                    sampSendChat("/add "..tostring(playerid))
                elseif list == 2 then -- "Показать документы"
                    sampShowDialog(20, "Показать документы", "Выбрать", "Закрыть", 3)
                elseif list == 3 then -- "Действия"
                elseif list == 4 then -- "Имущество"
                end
            end
        end
    end

local result, button, list, input = sampHasDialogRespond(20) -- /dialog3 (ListBox)

if result then -- если диалог открыт
    if button == 1 then -- если нажата первая кнопка (Выбрать)
        if list == 0 then
        elseif list == 1 then
        elseif list == 2 then
        elseif list == 3 then
        end
    else -- если нажата вторая кнопка (Закрыть)
    end
end
end


function cmd_dialog(arg)
    if tonumber(arg) == 1 then
        sampShowDialog(11, "Диалог с типом ID 1 (InputBox)", "Введите какую-либо строку", "Выбрать", "Закрыть", 1)
    elseif tonumber(arg) == 2 then
        sampShowDialog(12, "{00ff00}Меню взаимодействия с игроком", dialogStr, "Выбрать", "Закрыть", 2)
    elseif tonumber(arg) == 3 then
        sampShowDialog(20, "{00ff00}Показать документы", dialogTabStr, "Выбрать", "Закрыть", 3)
    end
end
.
 
Последнее редактирование: