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

Samohvaov

Известный
13
5
Существует ли функция или способ для нажатия кнопок выбора скина внизу по центру при регистрации (влево вправо и SPAWN). Спасибо за помощь.
 

h3ronwater

Новичок
24
1
как рендерить на самолете расстояние до земли(высота), и как делать определенное действие при определенной высоте
 

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,800
2,665
Существует ли функция или способ для нажатия кнопок выбора скина внизу по центру при регистрации (влево вправо и SPAWN). Спасибо за помощь.

как рендерить на самолете расстояние до земли(высота), и как делать определенное действие при определенной высоте
 

oliburn

Известный
312
112
Учу lua, захотелось как первый скрипт попробовать сделать реконнект с приколами, но обычные реконнекты багают текстуры, а у аира с этим проблем нету, как мне реализовать грамотный реконнект на луа без бага текстур?
 

Corrygan228

Участник
132
9
как сделать скролл бар закруглённый с двух сторон, а не с одной?
1689535271045.png
 

chromiusj

Известный
Модератор
5,661
3,961
Lua:
    printStringNow('Poti da gethit in: 05:00', 1000)
    printStringNow('Poti da gethit in: 04:59', 1000)
    printStringNow('Poti da gethit in: 04:58', 1000)
    printStringNow('Poti da gethit in: 04:57', 1000)
    printStringNow('Poti da gethit in: 04:56', 1000)
    printStringNow('Poti da gethit in: 04:55', 1000)
    printStringNow('Poti da gethit in: 04:54', 1000)
    printStringNow('Poti da gethit in: 04:53', 1000)
    printStringNow('Poti da gethit in: 04:52', 1000)
    printStringNow('Poti da gethit in: 04:51', 1000)
...
    printStringNow('Poti da gethit in: 00:00', 1000)
Как это упростить?
Lua:
for i = 300, 0, -1 do
    printStringNow('Poti da gethit in: ' .. string.format("%02d:%02d", math.floor(i / 60), i % 60), 1000)
end
 
  • Нравится
Реакции: xColorized

chromiusj

Известный
Модератор
5,661
3,961
Когда таймер истечет, как отобразить сообщение в чате? (обнаружение таймера)
Lua:
for i = 300, 0, -1 do
    if i == 0 then
        sampAddChatMessage('Время истекло!',-1)
    else
        printStringNow('Poti da gethit in: ' .. string.format("%02d:%02d", math.floor(i / 60), i % 60), 1000)
    end
end
 

chromiusj

Известный
Модератор
5,661
3,961
Lua:
for i = 300, 0, -1 do
    if i == 0 then
        sampAddChatMessage('[Hitmen Helper] TEST',-1)
        break
    else
        printStringNow('Poti da gethit in:~r~ ' .. string.format("%02d:%02d", math.floor(i / 60), i % 60), 1000)
        wait(1000)
    end
end
То же самое, таймер продолжает работать на других.
Ну сделай переменную которая при окончании таймера делает ее false
Lua:
if mainIni.config.hitcooldown then
    if text:find("<< Asasinul (.+) a finalizat contractul pe (.+) de la (.+)m si a obtinut (.+)%$>>") then
        lua_thread.create(function()
            wait(50)
            local name, target, distance, money = text:match("<< Asasinul (.+) a finalizat contractul pe (.+) de la (.+)m si a obtinut (.+)%$>>")

            if name == sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) then
                if tonumber(distance) > 299.9 then
                    printStringNow('Poti procura un contract.', 2000)
                end
            end
        end)
    end

    if text:find("<< Asasinul (.+) a finalizat contractul pe (.+) de la (.+)m si a obtinut (.+)%$>>") then
        lua_thread.create(function()
            wait(50)
            local name, target, distance, money = text:match("<< Asasinul (.+) a finalizat contractul pe (.+) de la (.+)m si a obtinut (.+)%$>>")

            if name == sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) then
                if tonumber(distance) < 300 then
                    for i = 300, 0, -1 do
                        if i == 0 then
                            sampAddChatMessage('[Hitmen Helper] TEST', -1)
                        else
                            printStringNow('Poti da gethit in:~r~ ' .. string.format("%02d:%02d", math.floor(i / 60), i % 60), 1000)
                            wait(1000)
                        end
                    end
                end
            end
        end)
    end

    if text:find("<< Asasinul (.+) a finalizat contractul pe (.+) de la (.+)m si a obtinut (.+)%$>>") then
        lua_thread.create(function()
            wait(50)
            local name, target, distance, money = text:match("<< Asasinul (.+) a finalizat contractul pe (.+) de la (.+)m si a obtinut (.+)%$>>")

            if name == sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) then
                if tonumber(distance) < 250 then
                    for i = 300, 0, -1 do
                        if i == 0 then
                            sampAddChatMessage('[Hitmen Helper] TEST', -1)
                        else
                            printStringNow('Poti da gethit in:~r~ ' .. string.format("%02d:%02d", math.floor(i / 60), i % 60), 1000)
                            wait(1000)
                        end
                    end
                end
            end
        end)
    end

    if text:find("<< Asasinul (.+) a finalizat contractul pe (.+) de la (.+)m si a obtinut (.+)%$>>") then
        lua_thread.create(function()
            wait(50)
            local name, target, distance, money = text:match("<< Asasinul (.+) a finalizat contractul pe (.+) de la (.+)m si a obtinut (.+)%$>>")
            if name == sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) then
                if tonumber(distance) < 200 then
                    for i = 10, 0, -1 do
                        if i == 0 then
                            sampAddChatMessage('[Hitmen Helper] TEST', -1)
                        else
                            printStringNow('Poti da gethit in:~r~ ' .. string.format("%02d:%02d", math.floor(i / 60), i % 60), 1000)
                            wait(1000)
                        end
                    end
                end
            end
        end)
    end
end
 

Дядя Энрик.

Активный
338
81
как сделать проверку окон в mimgui чтоб оно проверяло сидит ли персонаж в машине или он стоит на ногах и включало своё окно
1 окно - local plState = (isCharOnFoot(target) and "onfoot")
2 окно - local plState = (isCharInAnyCar(target) and "vehicle")
название окон
1 окно
Lua:
imgui.OnFrame(function() return keysync1[0] and not isPauseMenuActive() and not sampIsScoreboardOpen() end,
function()
2 окно
Lua:
imgui.OnFrame(function() return keysync2[0] and not isPauseMenuActive() and not sampIsScoreboardOpen() end,
function()

есть такой вариант:
Lua:
imgui.OnFrame(function() return keysync2[0] and not isPauseMenuActive() and not sampIsScoreboardOpen() and not keysync1[0] end,
function()
но здесь я теряю одно окно, отображается только одно и не зависимо где игрок
 
Последнее редактирование:

Corrygan228

Участник
132
9
как добавить условие для этих кнопок?
куда именно писать if?
Lua:
local binds_arr = {
    u8'Приветствие'
}

--фрейм
imgui.SetColumnWidth(-1, 200)

imgui.BeginChild('##binds_first_column', imgui.ImVec2(186, 250), false)

    for k, v in ipairs(binds_arr) do
        imgui.ButtonClickable(true, v, imgui.ImVec2(170, 20))
    end

    imgui.SetCursorPosX(7.3)
    if imgui.Button(u8'Добавить', imgui.ImVec2(74, 24)) then
        table.insert(binds_arr, u8'Бинд ' .. #binds_arr + 1)
    end

    imgui.SameLine()

    imgui.SetCursorPosX(88.6)
    if imgui.Button(u8'Удалить', imgui.ImVec2(74, 24)) then
        table.remove(binds_arr)
    end

imgui.EndChild()

imgui.NextColumn()

imgui.BeginChild('##binds_second_column', imgui.ImVec2(348, 250), false)

--

imgui.EndChild()

imgui.Columns(1)
1689572077029.png
 

XRLM

Против ветра рождённый
Модератор
1,516
1,105
как добавить условие для этих кнопок?
куда именно писать if?
Lua:
local binds_arr = {
    u8'Приветствие'
}

--фрейм
imgui.SetColumnWidth(-1, 200)

imgui.BeginChild('##binds_first_column', imgui.ImVec2(186, 250), false)

    for k, v in ipairs(binds_arr) do
        imgui.ButtonClickable(true, v, imgui.ImVec2(170, 20))
    end

    imgui.SetCursorPosX(7.3)
    if imgui.Button(u8'Добавить', imgui.ImVec2(74, 24)) then
        table.insert(binds_arr, u8'Бинд ' .. #binds_arr + 1)
    end

    imgui.SameLine()

    imgui.SetCursorPosX(88.6)
    if imgui.Button(u8'Удалить', imgui.ImVec2(74, 24)) then
        table.remove(binds_arr)
    end

imgui.EndChild()

imgui.NextColumn()

imgui.BeginChild('##binds_second_column', imgui.ImVec2(348, 250), false)

--

imgui.EndChild()

imgui.Columns(1)
Посмотреть вложение 208228
11 строка
 
  • Нравится
  • Клоун
Реакции: Air_Official и Corrygan228
D

deleted-user-139653

Гость
вечная проблема декодинга, в чем проблема?
Должно скопировать "Привет", а копирует ïðèâåò
Может есть другой метод копировать текст в буфер обмена? а не функцией setClipboardText

Lua:
for i, question in ipairs(questionsArray) do
        if imgui.InputText(u8("Вопрос №" .. i), question, 512) then
            local decodedQuestion = u8:decode(ffi.string(question))
            ini.questions["question" .. i] = decodedQuestion
            inicfg.save(ini, path)
        end
    
        if imgui.Button("Копировать##" .. i) then
            local decodedQuestion = u8:decode(ffi.string(question))
            local copied = setClipboardText(decodedQuestion)
        end
    end