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

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,283
как через рендер нарисовать круг?
renderDrawPolygon(float posX, float posY, float sizeX, float sizeY, int corners, float rotation, uint color)
int corners - количество вершин, +-12 - круг, чем больше вершин, тем круглее будет фигура
 
  • Нравится
Реакции: Rei

HarlyCloud

Потрачен
238
67
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
делал, NUMPAD_LEFT образно выразился, LEFT юзал, идшник не помогает, нум пад 4 нажимает

Вот не мучайся и не делай отдельные функи, так-же арг откуда-то брать надо, думаю там уже сам разберешь что тебе надо
Lua:
 if imgui.Button(u8"Выгнать", imgui.ImVec2(95, 25)) then
     lua_thread.create(function()
         sampSendChat("/do Человек лежит на полу.")
         wait(2000)
         sampSendChat("/me заломал руки и ведёт к двери")
         wait(2000)
         sampSendChat("/me открыл дверь и вывел человека")
         wait(2000)
         sampSendChat("/me закрыл дверь")
         wait(2000)
         sampSendChat("/expel " .. тут доставай идшник, хз где у тебя будет)
    end)
end
Спасибо, слушай а как мне сделать так что ид будет братся от человека который выделен? Это как то через хендл или пед, я хз прост чё эт такое)
 

HarlyCloud

Потрачен
238
67
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
в смысле выделен? Сразу по прямой говори
Lua:
    result, ped = getCharPlayerIsTargeting(Player player)
    if isKeyJustPressed(VK_Q) and result then
        menu_player_window.v = not menu_player_window.v
    end
Вот так у меня сделанно, типо таргет, взять ид чела
 

xfadcs

Новичок
27
5
Как получить ID с чата. К примеру, вызывают такси (Pipka_Pip[228] вызывает такси с города "Los-Santos"....), мне нужен его id. Как? Спасибо.
 

HarlyCloud

Потрачен
238
67
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Что тут не так? не работает менюшка, тоесть целюсь на человека и нажимаю на Q и не открывается
Lua:
while true do

        wait(150)

    result, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)

    if isKeyJustPressed(51) and result then

    menu_player_window.v = not menu_player_window.v

    _, idp = sampGetPlayerIdByCharHandle(ped)

    end

    end



    if menu_player_window then

    imgui.SetNextWindowSize(imgui.ImVec2(470, 295), imgui.Cond.FirstUseEver)

    imgui.Begin(u8'Central Bank Helper | Player', menu_player_window, 2)

    imgui.NewLine() imgui.NewLine()

     if imgui.Button(u8"Выгнать", imgui.ImVec2(95, 25)) then

         lua_thread.create(function()

             sampSendChat("/do Человек лежит на полу.")

             wait(2000)

             sampSendChat("/me заломал руки и ведёт к двери")

             wait(2000)

             sampSendChat("/me открыл дверь и вывел человека")

             wait(2000)

             sampSendChat("/me закрыл дверь")

             wait(2000)

             sampSendChat("/expel " .. id)

        end)

    end



    imgui.End()

end
Основная минюшка робит
 

xfadcs

Новичок
27
5
Почему не работает?)
Lua:
function main()
    while not isSampAvailable() do wait(100) end
    
    
    sampRegisterChatCommand("taxi", function() active =  not active
        if not active then
            sampAddChatMessage("{DF7401}[Taxi]{FFFFFF}Выключенно.", -1)
        else
            sampAddChatMessage("{DF7401}[Taxi]{FFFFFF}Поиск заказов активирован.", -1)
        end
    end)
  
    while true do
        wait(200)
        if active then
            local result, target = getCharPlayerIsTargeting(playerHandle)
            if result then
                    s = require 'lib.samp.events'
                            function s.onServerMessage(color, text)
                                if text:find('(.*)%[(%d+)%] вызывает такси с города "(.*)"') then
                                    print ('беру заказ...')
                                    nick, id = text:match('(.*)%[(%d+)%] вызывает такси с города "(.*)"')
                                    sampAddChatMessage('{DF7401}[Taxi]{FFFFFF}'..nick..' ['..id..'] вызвал такси. Беру заказ.', -1)
                                    sampSendChat('/gotaxi' ..id)
                                end
                            end
                end
            end
        end
    end
 

cheremuxa

Известный
430
202
Почему не работает?)
Lua:
function main()
    while not isSampAvailable() do wait(100) end
 
    sampRegisterChatCommand("taxi", function() active =  not active
        if not active then
            sampAddChatMessage("{DF7401}[Taxi]{FFFFFF}Выключенно.", -1)
        else
            sampAddChatMessage("{DF7401}[Taxi]{FFFFFF}Поиск заказов активирован.", -1)
        end
    end)

    while true do
        wait(200)
        if active then
            local result, target = getCharPlayerIsTargeting(playerHandle)
            if result then
                    s = require 'lib.samp.events'
                            function s.onServerMessage(color, text)
                                if text:find('(.*)%[(%d+)%] вызывает такси с города "(.*)"') then
                                    print ('беру заказ...')
                                    nick, id = text:match('(.*)%[(%d+)%] вызывает такси с города "(.*)"')
                                    sampAddChatMessage('{DF7401}[Taxi]{FFFFFF}'..nick..' ['..id..'] вызвал такси. Беру заказ.', -1)
                                    sampSendChat('/gotaxi' ..id)
                                end
                            end
                end
            end
        end
    end
потому что функцию нужно отдельно делать, если ты хочешь делать поиск, держи код:

Lua:
local s = require 'lib.samp.events'
active = false

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("taxi", function() active = not active
        if not active then
            sampAddChatMessage("{DF7401}[Taxi]{FFFFFF}Выключенно.", -1)
        else
            sampAddChatMessage("{DF7401}[Taxi]{FFFFFF}Поиск заказов активирован.", -1)
        end
    end)
    wait(-1)
 end
  
function s.onServerMessage(color, text)
if active then   
  if text:find('(.*)%[(%d+)%] вызывает такси с города "(.*)"') then
    print ('беру заказ...')
    nick, id = text:match('(.*)%[(%d+)%] вызывает такси с города "(.*)"')
    sampAddChatMessage('{DF7401}[Taxi]{FFFFFF}'..nick..' ['..id..'] вызвал такси. Беру заказ.', -1)
    sampSendChat('/gotaxi' ..id)
  end
end
end

убрал result, ибо зачем)?
 

lorgon

Известный
656
271
Приветствую. Допустим есть текст на 100 символов (количество не статичное), нужно чтоб скрипт отсчитал 30 символом, после чего отправил их в чат, далее из оставшегося текста опять отсчитал 30 и так же их отравил. И так до тех пор, пока не будет менее 30 символов в остатке (остаток так же отправляется в чат). Как реализовать подобное? Заранее спасибо =)
Я не понял, тебе нужно что-бы он отправил отсчитанные символы или текст без отсчитанных символов?
Приветствую. Допустим есть текст на 100 символов (количество не статичное), нужно чтоб скрипт отсчитал 30 символом, после чего отправил их в чат, далее из оставшегося текста опять отсчитал 30 и так же их отравил. И так до тех пор, пока не будет менее 30 символов в остатке (остаток так же отправляется в чат). Как реализовать подобное? Заранее спасибо =)
Lua:
function cutSymbols(str, i) -- говнофункция
    i = tonumber(i)
    str = tostring(str)
    local cutString = string.sub(str, 1, str:len()-i)
    local cutedSymbols = string.sub(str, str:len()+1-i, str:len()) --работает, но криво написано
    return cutString, cutedSymbols
end
local cutStr, cut = cutSymbols('anime_lua', 3)

print('cutStr: '..cutStr) -- вывод "anime_"
print('cut: '..cut) -- вывод "lua"
 
Последнее редактирование:
  • Нравится
Реакции: .Makarov.

Kolbasa241

Известный
213
57
Что тут не так? не работает менюшка, тоесть целюсь на человека и нажимаю на Q и не открывается
Lua:
while true do

        wait(150)

    result, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)

    if isKeyJustPressed(51) and result then

    menu_player_window.v = not menu_player_window.v

    _, idp = sampGetPlayerIdByCharHandle(ped)

    end

    end



    if menu_player_window then

    imgui.SetNextWindowSize(imgui.ImVec2(470, 295), imgui.Cond.FirstUseEver)

    imgui.Begin(u8'Central Bank Helper | Player', menu_player_window, 2)

    imgui.NewLine() imgui.NewLine()

     if imgui.Button(u8"Выгнать", imgui.ImVec2(95, 25)) then

         lua_thread.create(function()

             sampSendChat("/do Человек лежит на полу.")

             wait(2000)

             sampSendChat("/me заломал руки и ведёт к двери")

             wait(2000)

             sampSendChat("/me открыл дверь и вывел человека")

             wait(2000)

             sampSendChat("/me закрыл дверь")

             wait(2000)

             sampSendChat("/expel " .. id)

        end)

    end



    imgui.End()

end
Основная минюшка робит
Я чот тебя не понял, ты хочешь имгуи меню шобы открывалась в функции OnDrawFrame?
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
Что тут не так? не работает менюшка, тоесть целюсь на человека и нажимаю на Q и не открывается
Lua:
while true do

        wait(150)

    result, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)

    if isKeyJustPressed(51) and result then

    menu_player_window.v = not menu_player_window.v

    _, idp = sampGetPlayerIdByCharHandle(ped)

    end

    end



    if menu_player_window then

    imgui.SetNextWindowSize(imgui.ImVec2(470, 295), imgui.Cond.FirstUseEver)

    imgui.Begin(u8'Central Bank Helper | Player', menu_player_window, 2)

    imgui.NewLine() imgui.NewLine()

     if imgui.Button(u8"Выгнать", imgui.ImVec2(95, 25)) then

         lua_thread.create(function()

             sampSendChat("/do Человек лежит на полу.")

             wait(2000)

             sampSendChat("/me заломал руки и ведёт к двери")

             wait(2000)

             sampSendChat("/me открыл дверь и вывел человека")

             wait(2000)

             sampSendChat("/me закрыл дверь")

             wait(2000)

             sampSendChat("/expel " .. id)

        end)

    end



    imgui.End()

end
Основная минюшка робит
Я не пойму, ты хочешь взаимодействовать с игроком через ИмГуи окно или просто чтобы оно открывалось?
Если хочешь, чтобы окошко просто открылось, то вот
Lua:
-- В бесконечный цикл
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
if valid and doesCharExist(ped) then
    local result, id = sampGetPlayerIdByCharHandle(ped)
    if result and isKeyJustPressed(VK_Q) then -- На ПКМ+Q
        menu_player_window.v = not menu_player_window.v
    end
end
Если хочешь, чтобы ты взаимодействовал с его ID, Nick, то вот
Lua:
-- В самый верх, где local'ки
local playerid = -1

-- Бесконечный цикл
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
if valid and doesCharExist(ped) then
    local result, id = sampGetPlayerIdByCharHandle(ped)
    if result and isKeyJustPressed(VK_Q) then -- На ПКМ+Q
        menu_player_window.v = not menu_player_window.v
        playerid = id
    end
end


-- OnDrawFrame
-- if menu_player_window.v then
imgui.Begin(u8"Взаимодействие с "..sampGetPlayerNickname(tostring(playerid)).."["..tostring(playerid).."]", menu_player_window)
if imgui.Button(u8"Показать пасспорт") then
    sampSendChat("/pass "..tostring(playerid))
end
-- Если нужен NickName: sampGetPlayerNickname(tostring(playerid))
-- Если нужен NickName без _ : sampGetPlayerNickname(tostring(playerid)):gsub('_', ' ')
-- Если нужен ID: tostring(playerid)
 

[SA ARZ]

Известный
392
8
из-за чего может быть?

код:
[20:04:38.890991] (error)    multiahk.lua: cannot resume non-suspended coroutine
stack traceback:
    F:\Games\GTA\HelperSAMP 0.26-5\moonloader\lib\rkeys.lua: in function 'getCurrentHotKey'
    F:\Games\GTA\HelperSAMP 0.26-5\moonloader\lib\rkeys.lua:127: in function <F:\Games\GTA\HelperSAMP 0.26-5\moonloader\lib\rkeys.lua:124>
 

xfadcs

Новичок
27
5
потому что функцию нужно отдельно делать, если ты хочешь делать поиск, держи код:

Lua:
local s = require 'lib.samp.events'
active = false

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("taxi", function() active = not active
        if not active then
            sampAddChatMessage("{DF7401}[Taxi]{FFFFFF}Выключенно.", -1)
        else
            sampAddChatMessage("{DF7401}[Taxi]{FFFFFF}Поиск заказов активирован.", -1)
        end
    end)
    wait(-1)
end
 
function s.onServerMessage(color, text)
if active then  
  if text:find('(.*)%[(%d+)%] вызывает такси с города "(.*)"') then
    print ('беру заказ...')
    nick, id = text:match('(.*)%[(%d+)%] вызывает такси с города "(.*)"')
    sampAddChatMessage('{DF7401}[Taxi]{FFFFFF}'..nick..' ['..id..'] вызвал такси. Беру заказ.', -1)
    sampSendChat('/gotaxi' ..id)
  end
end
end

убрал result, ибо зачем)?

Все равно не реагирует на сообщения в чате, но спасибо.
 

Wycmpblu

Известный
152
31
из-за чего может быть?

код:
[20:04:38.890991] (error)    multiahk.lua: cannot resume non-suspended coroutine
stack traceback:
    F:\Games\GTA\HelperSAMP 0.26-5\moonloader\lib\rkeys.lua: in function 'getCurrentHotKey'
    F:\Games\GTA\HelperSAMP 0.26-5\moonloader\lib\rkeys.lua:127: in function <F:\Games\GTA\HelperSAMP 0.26-5\moonloader\lib\rkeys.lua:124>
Может код multiahk.lua скинешь?
 

dfleex

Участник
38
2
Всем привет, как сделать проверку в чате если было [A] Test_Test[0]: /ban id 30 cheat то будет выполняться /ban id 30 cheat с префиксом администратора? Я уже так сделал так, и сделал что бы было например /uval 1 test у меня выводится 2 сообщения что пришла форма и скрипт выполняет сразу и /uval 1 test и /ban id 30 cheat. Помогите пожалуйста.