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

ImPasha

Software Developer & System Administrator
Друг
1,789
2,141
Всем привет. Как зажать (именно чтобы он зажал и не отпускал) пробел?
setVirtualKeyDown(VK_SPACE, true)
Как считать определенную строку с txt файла, к примеру вторую, в переменную?
В цикле строчки перебирать.
Lua:
for lines in file:lines() do

end
Каким образом делаются отступы сверху в ImGui ? Ото чувствую я, что забивать место блоками текста неверный вариант.
imgui.NewLine()
 
  • Нравится
Реакции: ШPEK и atizoff

wD.D159

Известный
Друг
446
480
Ребята, можно пару примеров с использованием isObjectInArea2d привести? А то делаю проверку, и не получается ничего, ругается на эту строку.

Lua:
bool result = isObjectInArea2d(int object, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere) -- 04E9
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,760
5,367
Ребята, можно пару примеров с использованием isObjectInArea2d привести? А то делаю проверку, и не получается ничего, ругается на эту строку.

Lua:
bool result = isObjectInArea2d(int object, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere) -- 04E9
проверку на валидность объекта ставил? больше кода. ошибку скинь.
 

ШPEK

Известный
1,474
525
чекай адреса памяти.
readMemory(getCarPointer(storeCarCharIsInNoSave(PLAYER_PED)) + 0x428, 1)
Вот флаги
Код:
[LIST]
[*]2 = Полицейский транспорт
[*]4 = Медицинский транспорт
[*]8 = Транспорт пожарной службы
[*]16 = Двигатель включен
[*]32 = Используется ручной тормоз, либо в транспорте нет водителя
[*]64 = Включены фары (за исключением стоп-сигналов автомобиля)
[/LIST]
 

wD.D159

Известный
Друг
446
480
Крашит игру, в чем проблема?

Lua:
script_properties('work-in-pause')

local myObjsModel = {19320, 770, 12961, 3525, 9114, 3092, 19339, 2907, 2908, 3524, 2589, 19126, 1736, 3594, 849, 4988, 2906, 12957, 2953, 1369, 16410, 853, 18725, 735, 3437, 1251, 3096, 1568, 19425, 19465, 1492, 19377, 19464, 19355, 1723, 1256, 19353, 19445, 11472, 19362, 14387, 1494, 19383, 19176, 19454, 19447, 7313, 751, 750, 7588, 3362, 1260, 4729, 970, 19121, 19295, 748, 16121, 5992, 18714, 8483, 649, 691, 2587, 8397, 3660, 3361, 1476, 970, 2886, 8657, 1472, 3050, 19641, 1422, 3578, 1293, 1255, 642, 1223, 2773, 1570, 358, 645, 792, 3374, 17037, 619, 629, 1280, 4597, 9241, 1597, 1825, 11496, 955, 805, 3884, 19853, 3593, 8407, 749, 1482, 2973, 3277, 7494, 19852, 3522, 1216, 639, 1841, 640, 1432, 3606, 1481, 3066, 1724, 3794, 19166, 11292, 19544, 1461, 1612, 968, 964, 2111, 3795, 1431, 3797, 360, 353, 19296, 362, 321, 2810, 3515, 2779, 2681, 1212, 1824, 1978, 2188, 2898, 14872, 1827, 356, 349, 355, 2232, 2104, 2630, 2628, 2627, 1360, 2744, 9958, 1215, 1305, 758, 878, 14467, 1278, 653}

function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
   
    while true do wait(0)
        local ob = getAllObjects()
        for i = 1, #ob do
            local v = ob[i]
            if doesObjectExist(v) then
                local model = getObjectModel(v)
                if isObjectInArea2d(v, -152.0783, 1247.5969, -1348.4775, 2157.8174, true) then
                    for t = 1, #myObjsModel do
                        if model == myObjsModel[t] then
                            deleteObject(v)
                        end
                    end
                end
            end
        end
    end
end
 

MrCold

Активный
364
118
Что не так? Должен флудить в чат при зажатии клавиши
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    while true do
        wait(0)
    end
    if isKeyDown(VK_K) then
        sampAddChatMessage("Вы зажали клавишу!", -1)
    end
end
 

Aniki

🐰
Администратор
1,228
1,554
Что не так? Должен флудить в чат при зажатии клавиши
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    while true do
        wait(0)
    end
    if isKeyDown(VK_K) then
        sampAddChatMessage("Вы зажали клавишу!", -1)
    end
end
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    while true do
        wait(0)
        if isKeyDown(VK_K) then
            sampAddChatMessage("Вы зажали клавишу!", -1)
        end
    end
end
Надо проверку внутри тела цикла делать
 

ImPasha

Software Developer & System Administrator
Друг
1,789
2,141
Крашит игру, в чем проблема?

Lua:
script_properties('work-in-pause')

local myObjsModel = {19320, 770, 12961, 3525, 9114, 3092, 19339, 2907, 2908, 3524, 2589, 19126, 1736, 3594, 849, 4988, 2906, 12957, 2953, 1369, 16410, 853, 18725, 735, 3437, 1251, 3096, 1568, 19425, 19465, 1492, 19377, 19464, 19355, 1723, 1256, 19353, 19445, 11472, 19362, 14387, 1494, 19383, 19176, 19454, 19447, 7313, 751, 750, 7588, 3362, 1260, 4729, 970, 19121, 19295, 748, 16121, 5992, 18714, 8483, 649, 691, 2587, 8397, 3660, 3361, 1476, 970, 2886, 8657, 1472, 3050, 19641, 1422, 3578, 1293, 1255, 642, 1223, 2773, 1570, 358, 645, 792, 3374, 17037, 619, 629, 1280, 4597, 9241, 1597, 1825, 11496, 955, 805, 3884, 19853, 3593, 8407, 749, 1482, 2973, 3277, 7494, 19852, 3522, 1216, 639, 1841, 640, 1432, 3606, 1481, 3066, 1724, 3794, 19166, 11292, 19544, 1461, 1612, 968, 964, 2111, 3795, 1431, 3797, 360, 353, 19296, 362, 321, 2810, 3515, 2779, 2681, 1212, 1824, 1978, 2188, 2898, 14872, 1827, 356, 349, 355, 2232, 2104, 2630, 2628, 2627, 1360, 2744, 9958, 1215, 1305, 758, 878, 14467, 1278, 653}

function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
  
    while true do wait(0)
        local ob = getAllObjects()
        for i = 1, #ob do
            local v = ob[i]
            if doesObjectExist(v) then
                local model = getObjectModel(v)
                if isObjectInArea2d(v, -152.0783, 1247.5969, -1348.4775, 2157.8174, true) then
                    for t = 1, #myObjsModel do
                        if model == myObjsModel[t] then
                            deleteObject(v)
                        end
                    end
                end
            end
        end
    end
end
Нельзя так часто удалять объекты, не успевают обновляться и игра вылетает.
 

Harryss

Участник
233
26
Как избавиться от проблемы с кодировкой в ImGui? Нужно выводить русский текст из .ini файла, вместо текста получаю кучу вопросов.
Lua:
if imgui.InputText(u8'', moonimgui_text_buffer) then
    anotherIni.data.player_accent = u8:decode(moonimgui_text_buffer.v)
    inicfg.save(anotherIni, "..\\[INI] File")
end

--этот код в функции main, берет из ini файла текст и назначает его в buffer при загрузке игры, однако происходит ошибка с кодировкой
moonimgui_text_buffer.v = anotherIni.data.player_accent
 

ШPEK

Известный
1,474
525
Крашит игру, в чем проблема?

Lua:
script_properties('work-in-pause')

local myObjsModel = {19320, 770, 12961, 3525, 9114, 3092, 19339, 2907, 2908, 3524, 2589, 19126, 1736, 3594, 849, 4988, 2906, 12957, 2953, 1369, 16410, 853, 18725, 735, 3437, 1251, 3096, 1568, 19425, 19465, 1492, 19377, 19464, 19355, 1723, 1256, 19353, 19445, 11472, 19362, 14387, 1494, 19383, 19176, 19454, 19447, 7313, 751, 750, 7588, 3362, 1260, 4729, 970, 19121, 19295, 748, 16121, 5992, 18714, 8483, 649, 691, 2587, 8397, 3660, 3361, 1476, 970, 2886, 8657, 1472, 3050, 19641, 1422, 3578, 1293, 1255, 642, 1223, 2773, 1570, 358, 645, 792, 3374, 17037, 619, 629, 1280, 4597, 9241, 1597, 1825, 11496, 955, 805, 3884, 19853, 3593, 8407, 749, 1482, 2973, 3277, 7494, 19852, 3522, 1216, 639, 1841, 640, 1432, 3606, 1481, 3066, 1724, 3794, 19166, 11292, 19544, 1461, 1612, 968, 964, 2111, 3795, 1431, 3797, 360, 353, 19296, 362, 321, 2810, 3515, 2779, 2681, 1212, 1824, 1978, 2188, 2898, 14872, 1827, 356, 349, 355, 2232, 2104, 2630, 2628, 2627, 1360, 2744, 9958, 1215, 1305, 758, 878, 14467, 1278, 653}

function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
 
    while true do wait(0)
        local ob = getAllObjects()
        for i = 1, #ob do
            local v = ob[i]
            if doesObjectExist(v) then
                local model = getObjectModel(v)
                if isObjectInArea2d(v, -152.0783, 1247.5969, -1348.4775, 2157.8174, true) then
                    for t = 1, #myObjsModel do
                        if model == myObjsModel[t] then
                            deleteObject(v)
                        end
                    end
                end
            end
        end
    end
end
Не крашит
Lua:
script_properties('work-in-pause')

local myObjsModel = {19320, 770, 12961, 3525, 9114, 3092, 19339, 2907, 2908, 3524, 2589, 19126, 1736, 3594, 849, 4988, 2906, 12957, 2953, 1369, 16410, 853, 18725, 735, 3437, 1251, 3096, 1568, 19425, 19465, 1492, 19377, 19464, 19355, 1723, 1256, 19353, 19445, 11472, 19362, 14387, 1494, 19383, 19176, 19454, 19447, 7313, 751, 750, 7588, 3362, 1260, 4729, 970, 19121, 19295, 748, 16121, 5992, 18714, 8483, 649, 691, 2587, 8397, 3660, 3361, 1476, 970, 2886, 8657, 1472, 3050, 19641, 1422, 3578, 1293, 1255, 642, 1223, 2773, 1570, 358, 645, 792, 3374, 17037, 619, 629, 1280, 4597, 9241, 1597, 1825, 11496, 955, 805, 3884, 19853, 3593, 8407, 749, 1482, 2973, 3277, 7494, 19852, 3522, 1216, 639, 1841, 640, 1432, 3606, 1481, 3066, 1724, 3794, 19166, 11292, 19544, 1461, 1612, 968, 964, 2111, 3795, 1431, 3797, 360, 353, 19296, 362, 321, 2810, 3515, 2779, 2681, 1212, 1824, 1978, 2188, 2898, 14872, 1827, 356, 349, 355, 2232, 2104, 2630, 2628, 2627, 1360, 2744, 9958, 1215, 1305, 758, 878, 14467, 1278, 653}

function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        for i,v in ipairs(getAllObjects()) do
            if doesObjectExist(v) and isObjectInArea2d(v, -152.0783, 1247.5969, -1348.4775, 2157.8174, true) then
                local model = getObjectModel(v)
                for i1, v1 in ipairs(myObjsModel) do
                    if model == v1 then
                        deleteObject(v)
                    end
                end
            end
        end
    end
end
 

SanyaVersus

Участник
65
1
Привет, нужна помощь. Вообще не шарю в скриптинге.
Решил сделать бинд на /healme. Самый простой бинд, скрипт в несколько строк.
Бинд то я сделал, но появилась проблема. Бинд юзается даже во время чата, решил это исправить, но понятия вообще не имею как это сделать.
Сам скрипт:
require "lib.moonloader"

function main()
if not isSampfuncsLoaded() or not isSampLoaded() then return end
while not isSampAvailable() do wait(100) end
while true do
wait(0)
if bool result = sampIsChatInputActive()
bool result == false then
if isKeyJustPressed(VK_R) then
sampSendChat("/healme")
end
end
end
end



PS: соре, хз как вставлять не по рукожопски скрипт
напиши я це делать
 
D

deleted-user-161097

Гость
Пытаюсь сделать замену текста отправленного игроком, суть проблемы в return. Когда делаю просто return 'txt' - все ок, а когда делаю так(спойлер)
Lua:
function event.onSendChat(message)
if thccfg.settings.togtag then
    if message:sub(str, 1,3) == '/tr'     then
        submes = message:sub(str, 4,message:len)
        message = string.format('/tr [%s]%s',thccfg.settings.tag,submes)
        return message
    end
end
end
Выводит ошибку: : function arguments expected near ')'. Как исправить?

Привет, нужна помощь. Вообще не шарю в скриптинге.
Решил сделать бинд на /healme. Самый простой бинд, скрипт в несколько строк.
Бинд то я сделал, но появилась проблема. Бинд юзается даже во время чата, решил это исправить, но понятия вообще не имею как это сделать.
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
    wait(0)
        if bool result = sampIsChatInputActive()
        bool result == false then
      if isKeyJustPressed(VK_R) and not sampIsChatInputActive then
      sampSendChat("/healme")    
      end
        end
    end
end