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

PoundFoolish

Участник
81
1
В чем трабл? Скрипт должен когда я ввожу команду "/sss ID" активировать серверную команду "/sms ID", затем команду "/v ID" - это уже команда сделанная через этот-же скрипт, именно ее он не хочет активировать. Хелп
(Если пишу в чате эту команду, то все окей - работает, но нужно чтобы работала через это тоже)


Lua:
function cmd_sss(pam)
    lua_thread.create(function()
        local id = pam:match('(%d+)')
        if id then
            sampSendChat('/sms ' .. id .. '')
            wait(10)
            sampSendChat('/v ' .. id .. '')
    else
            sampAddChatMessage('Ты не указал айдишник, дурик', -1)
        end
    end)
end


Lua:
sampRegisterChatCommand("v", cmd_testo)



function cmd_testo(arg)
        two_okno.v = not two_okno.v
        main_window_state.v = false
    end
  
    -- ЭТА САМАЯ КОМАНДА (/v)
 

chapo

чопа сребдс // @moujeek
Модератор
8,862
11,551
В чем трабл? Скрипт должен когда я ввожу команду "/sss ID" активировать серверную команду "/sms ID", затем команду "/v ID" - это уже команда сделанная через этот-же скрипт, именно ее он не хочет активировать. Хелп
(Если пишу в чате эту команду, то все окей - работает, но нужно чтобы работала через это тоже)


Lua:
function cmd_sss(pam)
    lua_thread.create(function()
        local id = pam:match('(%d+)')
        if id then
            sampSendChat('/sms ' .. id .. '')
            wait(10)
            sampSendChat('/v ' .. id .. '')
    else
            sampAddChatMessage('Ты не указал айдишник, дурик', -1)
        end
    end)
end


Lua:
    function cmd_testo(arg)
        two_okno.v = not two_okno.v
        main_window_state.v = false
    end
  
    -- ЭТА САМАЯ КОМАНДА (/v)
Созданные скриптами команды надо вводить не через sampSendChat, а через sampProcessChatInput('')
 
  • Влюблен
Реакции: PoundFoolish

PoundFoolish

Участник
81
1
Как сделать , чтобы клавиша включала и выключала, а не только вывключала?

Lua:
    if isKeyJustPressed(VK_F5) then
        imgui.ShowCursor = false
    end
 

hos1n

Участник
39
4
Как сделать , чтобы клавиша включала и выключала, а не только вывключала?

Lua:
    if isKeyJustPressed(VK_F5) then
        imgui.ShowCursor = false
    end
Lua:
if isKeyJustPressed(VK_F5) then
    imgui.ShowCursor = not imgui.ShowCursor
end
Как выполнить сочетание 2-х клавиш?

Lua:
if wasKeyPressed(VK_F4) and wasKeyPressed(VK_F5) then
    -- твой код
end
 
  • Нравится
Реакции: PoundFoolish

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
Lua:
-- Если такую команду:
sampRegisterChatCommand("test", test)

function test()
    -- ...
end

-- Можно вызвать так:
test()

-- То как вызвать такую команду?:
sampRegisterChatCommand("test", function()
    -- ...
end)
 
  • Нравится
Реакции: iliyasyeskhatov

hos1n

Участник
39
4
Lua:
-- Если такую команду:
sampRegisterChatCommand("test", test)

function test()
    -- ...
end

-- Можно вызвать так:
test()

-- То как вызвать такую команду?:
sampRegisterChatCommand("test", function()
    -- ...
end)
Никак, во втором случае Вы не создаёте отдельную функцию. У неё нет своего названия и её никак не вызвать "из вне".
 
  • Нравится
Реакции: Dmitriy Makarov

Kirill Dumchik

Участник
61
3
Допустим я пишу в чате /ts 22 33 и должно писать:
/sms 22 Здравствуйте. Проверяю сотрудника под ником James_Petyh.
James_Petyh к примеру - это 33 ид

Пытался сделать так, но я проебался и не правильно все сделал. Как сделать верно, хелпаните пожалуйста)

Lua:
function cmd_ts(pam)
    local id = pam:match('(%d+)')
    local idd = pam:match('(%d+)')
    nick = sampGetPlayerNickname(idd)
    if id then
        sampSendChat('/ans '..id..' test '..nick..'!')
    else
        sampAddChatMessage('Вы не указали id.', -1)
    end
end
 

Kirill Dumchik

Участник
61
3
Lua:
function cmd(param1, param2)
    nick = sampGetPlayerNickname(param2)
    sampSendChat('/sms '..param1..' Здравствуйте. Проверяю сотрудника под ником: '..nick..'.')
end
Так тоже пробовал, когда пишу в чате команду, выходит так:
Пишу: /ts 22 33
Пишет: /sms 22 33 Здравствуйте. Проверяю сотрудника под ником: Dora[0].
Тоесть 2-ой парам не работает
 

moreveal

Известный
Проверенный
921
618
Как выполнить сочетание 2-х клавиш?
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,535
Допустим я пишу в чате /ts 22 33 и должно писать:
/sms 22 Здравствуйте. Проверяю сотрудника под ником James_Petyh.
James_Petyh к примеру - это 33 ид

Пытался сделать так, но я проебался и не правильно все сделал. Как сделать верно, хелпаните пожалуйста)

Lua:
function cmd_ts(pam)
    local id = pam:match('(%d+)')
    local idd = pam:match('(%d+)')
    nick = sampGetPlayerNickname(idd)
    if id then
        sampSendChat('/ans '..id..' test '..nick..'!')
    else
        sampAddChatMessage('Вы не указали id.', -1)
    end
end
local id, name = pam:match("(%d+)%s+(.+)")
 

Pheustopal

Новичок
6
1
Можно как-то добавить, чтобы в конце добавилась еще команда, но она должна сработать на того человека, которого я указал в 2
Тоесть примерно так, но я не знаю, как сделать чтобы реагировало именно на ИД, а не на его ник


Lua:
function cmd_aaa(pam)
    local id, nick = pam:match("(%d+)%s+(.+)")
    nick = sampGetPlayerNickname(nick)
    if id and nick then
        sampSendChat('/sms '..id..' Проверяю данные '..nick..'.')
        wait(100)
        sampsendchat('/delete И ТУТ НАДО ВСТАВИТЬ ИД ЧЕЛОВЕКА ИЗ NICK')
    else
        sampAddChatMessage('Не-а', -1)
    end
end

Буду благодарен, если поможешь)
Lua:
function sampGetPlayerIdByNickname(nick)
  nick = tostring(nick)
  local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
  if nick == sampGetPlayerNickname(myid) then return myid end
  for i = 0, 1003 do
    if sampIsPlayerConnected(i) and sampGetPlayerNickname(i) == nick then
      return i
    end
  end
end

function cmd_aaa(param)
    local playerid, nickname = param:match('(%d+)%s+(.+)')
    local nick = sampGetPlayerNickname(nick)
    if playerid and nick then
        sampSendChat('/sms ' .. playerid .. ' Проверяю данные ' .. nickname .. '.')
        wait(100)
        sampsendchat('/delete ' .. sampGetPlayerIdByNickname(nickname))
    else
        sampAddChatMessage('Не-а.', -1)
    end
end
 
  • Влюблен
Реакции: Kirill Dumchik

moreveal

Известный
Проверенный
921
618
Можно как-то добавить, чтобы в конце добавилась еще команда, но она должна сработать на того человека, которого я указал в 2
Тоесть примерно так, но я не знаю, как сделать чтобы реагировало именно на ИД, а не на его ник


Lua:
function cmd_aaa(pam)
    local id, nick = pam:match("(%d+)%s+(.+)")
    nick = sampGetPlayerNickname(nick)
    if id and nick then
        sampSendChat('/sms '..id..' Проверяю данные '..nick..'.')
        wait(100)
        sampsendchat('/delete И ТУТ НАДО ВСТАВИТЬ ИД ЧЕЛОВЕКА ИЗ NICK')
    else
        sampAddChatMessage('Не-а', -1)
    end
end

Буду благодарен, если поможешь)
Lua:
function sampGetPlayerIdByNickname(nick)
    local myid = select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))
    if tostring(nick) == sampGetPlayerNickname(myid) then return myid end
    for i = 0, sampGetMaxPlayerId() do if sampIsPlayerConnected(i) and sampGetPlayerNickname(i) == tostring(nick) then return i end end
    return -1
end

-----------------------------------
sampSendChat('/delete '..sampGetPlayerIdByNickname(nick))
 
Последнее редактирование:
  • Влюблен
Реакции: Kirill Dumchik