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

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,798
2,659
Как в чекбоксе сделать цикл с проверкой?

Lua:
            if imgui.Checkbox(u8'test', test) then
                runToPoint:run(2480, -1668)
                local tx, ty = 2480, -1668
                if (getDistanceBetweenCoords2d(tx, ty, getCharCoordinates(PLAYER_PED)) < 1) then
                    runToPoint:run(2452, -1667)
                end
            end
можно так, но я подозреваю, что в твоем случае лучше использовать другое
Lua:
if imgui.Checkbox(u8'test', test) then
    lua_thread.create(function()
        local rand = 0
        while (rand ~= 4) do
            rand = math.random(0, 10)
        end
        print("end")
    )
end
 
  • Нравится
Реакции: goodflex

XRLM

Против ветра рождённый
Проверенный
1,516
1,107
Как получить текст который ввёл игрок в поле ввода в диалоге, без использования samp events?
хук onSendDialogResponse

можно так, но я подозреваю, что в твоем случае лучше использовать другое
Lua:
if imgui.Checkbox(u8'test', test) then
    lua_thread.create(function()
        local rand = 0
        while (rand ~= 4) do
            rand = math.random(0, 10)
        end
        print("end")
    )
end
вроде как создавать треад не обязательно во фрейме
 
  • Вау
Реакции: whyega52

chromiusj

Известный
Модератор
5,651
3,954
как получить смещение от координат на функции getCharCoordinates()?
возможно долбаебский вопрос,допустим если X отклонилась на 1 координату,то вызвался бы там синий экран смерти,или просто написало,что отклонилось на 1 координату
 

XRLM

Против ветра рождённый
Проверенный
1,516
1,107
как получить смещение от координат на функции getCharCoordinates()?
возможно долбаебский вопрос,допустим если X отклонилась на 1 координату,то вызвался бы там синий экран смерти,или просто написало,что отклонилось на 1 координату
типо расстояние от первой точки до точки смещения или прям сколько сместилось по x, по y, по z?
 

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,798
2,659
как получить смещение от координат на функции getCharCoordinates()?
возможно долбаебский вопрос,допустим если X отклонилась на 1 координату,то вызвался бы там синий экран смерти,или просто написало,что отклонилось на 1 координату
 

chromiusj

Известный
Модератор
5,651
3,954
типо расстояние от первой точки до точки смещения или прям сколько сместилось по x, по y, по z?
Код:
        local X, Y, Z = getCharCoordinates(PLAYER_PED)
        if X == math.floor(X + 1) or X == math.floor(X - 1) then
        sampAddChatMessage('блядь я отошел', -1)
вот так типо
не то
 
  • Вау
  • Bug
Реакции: DZONE и qdIbp

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,798
2,659
Он зависим от библиотеки samp events
Мне кажется нету смысла самостоятельно хукать то, что есть в самп евентсе, это стоит делать только для практики и понимания того, как устроена эта либа.
 

Макс | Lycorn

Участник
166
13
Подскажите, как делается биндер? Мне нужно, что-бы текст который написали в InputTextMultiline отправлялся в чат по кмд/кнопке которую указали, и с задержкой так же.
Lua:
local bindersettings = {
    commands = {
        bindercmd1 = imgui.ImBuffer(256)
    },
    hotkeys = {
        binderhotkey1 = imgui.ImBuffer(256)
    },
    delay = {
        binderdelay1 = imgui.ImInt(1000)
    },
    text = {
        bindertext1 = imgui.ImBuffer(256)
    }
}
               


imgui.BeginChild('##bindertext', imgui.ImVec2(620, 387), true)
            imgui.Text(u8'Введите команду:')
            imgui.SameLine()
            imgui.PushItemWidth(150)
            imgui.InputText(u8'##bindercmd', bindersettings.commands.bindercmd1)
            imgui.PopItemWidth()
            imgui.Text(u8'Введите кнопку:')
            imgui.SameLine()
            imgui.PushItemWidth(150)
            imgui.InputText(u8'##binderhotkey', bindersettings.hotkeys.binderhotkey1)
            imgui.PopItemWidth()
            imgui.Text(u8'Введите задержку в секундах')
            imgui.SameLine()
            imgui.PushItemWidth(150)
            imgui.InputInt(u8'##binderdelay', bindersettings.delay.binderdelay1)
            imgui.PopItemWidth()
            imgui.BeginChild('##textbinder', imgui.ImVec2(605,30), true)
            imgui.CenterText(u8'Введите текст')
            imgui.EndChild()
            imgui.InputTextMultiline(u8"##", bindersettings.text.bindertext1, imgui.ImVec2(605,265))
            imgui.EndChild()
 

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,798
2,659
Подскажите, как делается биндер? Мне нужно, что-бы текст который написали в InputTextMultiline отправлялся в чат по кмд/кнопке которую указали, и с задержкой так же.
Lua:
local bindersettings = {
    commands = {
        bindercmd1 = imgui.ImBuffer(256)
    },
    hotkeys = {
        binderhotkey1 = imgui.ImBuffer(256)
    },
    delay = {
        binderdelay1 = imgui.ImInt(1000)
    },
    text = {
        bindertext1 = imgui.ImBuffer(256)
    }
}
              


imgui.BeginChild('##bindertext', imgui.ImVec2(620, 387), true)
            imgui.Text(u8'Введите команду:')
            imgui.SameLine()
            imgui.PushItemWidth(150)
            imgui.InputText(u8'##bindercmd', bindersettings.commands.bindercmd1)
            imgui.PopItemWidth()
            imgui.Text(u8'Введите кнопку:')
            imgui.SameLine()
            imgui.PushItemWidth(150)
            imgui.InputText(u8'##binderhotkey', bindersettings.hotkeys.binderhotkey1)
            imgui.PopItemWidth()
            imgui.Text(u8'Введите задержку в секундах')
            imgui.SameLine()
            imgui.PushItemWidth(150)
            imgui.InputInt(u8'##binderdelay', bindersettings.delay.binderdelay1)
            imgui.PopItemWidth()
            imgui.BeginChild('##textbinder', imgui.ImVec2(605,30), true)
            imgui.CenterText(u8'Введите текст')
            imgui.EndChild()
            imgui.InputTextMultiline(u8"##", bindersettings.text.bindertext1, imgui.ImVec2(605,265))
            imgui.EndChild()
Lua:
if imgui.Button("Send") then
    sampSendChat(u8:decode(bindersettings.text.bindertext1.v))
end
 

kyrtion

Известный
975
354
Подскажите, как делается биндер? Мне нужно, что-бы текст который написали в InputTextMultiline отправлялся в чат по кмд/кнопке которую указали, и с задержкой так же.
Lua:
local bindersettings = {
    commands = {
        bindercmd1 = imgui.ImBuffer(256)
    },
    hotkeys = {
        binderhotkey1 = imgui.ImBuffer(256)
    },
    delay = {
        binderdelay1 = imgui.ImInt(1000)
    },
    text = {
        bindertext1 = imgui.ImBuffer(256)
    }
}
              


imgui.BeginChild('##bindertext', imgui.ImVec2(620, 387), true)
            imgui.Text(u8'Введите команду:')
            imgui.SameLine()
            imgui.PushItemWidth(150)
            imgui.InputText(u8'##bindercmd', bindersettings.commands.bindercmd1)
            imgui.PopItemWidth()
            imgui.Text(u8'Введите кнопку:')
            imgui.SameLine()
            imgui.PushItemWidth(150)
            imgui.InputText(u8'##binderhotkey', bindersettings.hotkeys.binderhotkey1)
            imgui.PopItemWidth()
            imgui.Text(u8'Введите задержку в секундах')
            imgui.SameLine()
            imgui.PushItemWidth(150)
            imgui.InputInt(u8'##binderdelay', bindersettings.delay.binderdelay1)
            imgui.PopItemWidth()
            imgui.BeginChild('##textbinder', imgui.ImVec2(605,30), true)
            imgui.CenterText(u8'Введите текст')
            imgui.EndChild()
            imgui.InputTextMultiline(u8"##", bindersettings.text.bindertext1, imgui.ImVec2(605,265))
            imgui.EndChild()
вам следует поиграть с значением. Почему именно .v? а почему его нельзя убрать, как наоборот сделать, и так далее
 

Макс | Lycorn

Участник
166
13
Lua:
if imgui.Button("Send") then
    sampSendChat(u8:decode(bindersettings.text.bindertext1.v))
end
А как это реализовать по кмд/кнопке, которую ввел игрок? и + с задержкой

вам следует поиграть с значением. Почему именно .v? а почему его нельзя убрать, как наоборот сделать, и так далее
Щас вообще не понял :) К чему это
 

Revavi

Участник
101
24
не могу понять, как работает sampCloseCurrentDialogWithButton(btn_id)? При запуске игры - не закрывается окно автоматом, а при перезапуске скрипта - вообще крашит.
пытался закрывать окно через return false, но тогда почему то перестают реагировать текстдравы до момента открытия любого диалога
пытаюсь закрывать /stats, если это важно
 
Последнее редактирование:
D

deleted-user-139653

Гость
не могу понять, как работает sampCloseCurrentDialogWithButton(btn_id)? При запуске игры - не закрывается окно автоматом, а при перезапуске скрипта - вообще крашит.
пытался закрывать окно через return false, но тогда почему то перестают реагировать текстдравы до момента открытия любого диалога
пытаюсь закрывать /stats, если это важно
Возможно ставишь return false не в том месте