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

RiTwin

Новичок
20
11
Что не так?
Lua:
require 'lib.moonloader'
require 'lib.sampfuncs'
local key = require 'vkeys'
local enabled = false

function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand('mr', function()
    enabled = not enabled
    sampAddChatMessage(enabled and '{ffffff}Вкл' or '{ffffff}Выкл', -1)
        thread = lua_thread.create_suspended(thread_function)
  end)
end

for i = 0, 1024 do
    if sampIs3dTextDefined(i) then
        local string, color, posX, posY, posZ, distance, ignoreWalls, playerId, vehicleId = sampGet3dTextInfoById(i)
            if string:find('10000$') and string:find('ALT') and not sampIsChatInputActive() and not sampIsDialogActive() and not isPauseMenuActive() then
                  thread:run()
            end
        end
    end
end

function thread_function()
  wait(50)
  setVirtualKeyDown(key.VK_LMENU, true)
  wait(10)
  setVirtualKeyDown(key.VK_LMENU, false)
  wait(50)
  setVirtualKeyDown(key.VK_RETURN, true)
  wait(10)
  setVirtualKeyDown(key.VK_RETURN, false)
  wait(50)
  setVirtualKeyDown(key.VK_RETURN, true)
  wait(10)
  setVirtualKeyDown(key.VK_RETURN, false)
  wait(50)
  sampSendChat('/mr')
end
 

astynk

Известный
Проверенный
742
530
Что не так?
Lua:
require 'lib.moonloader'
require 'lib.sampfuncs'
local key = require 'vkeys'
local enabled = false

function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand('mr', function()
    enabled = not enabled
    sampAddChatMessage(enabled and '{ffffff}Вкл' or '{ffffff}Выкл', -1)
        thread = lua_thread.create_suspended(thread_function)
  end)
end

for i = 0, 1024 do
    if sampIs3dTextDefined(i) then
        local string, color, posX, posY, posZ, distance, ignoreWalls, playerId, vehicleId = sampGet3dTextInfoById(i)
            if string:find('10000$') and string:find('ALT') and not sampIsChatInputActive() and not sampIsDialogActive() and not isPauseMenuActive() then
                  thread:run()
            end
        end
    end
end

function thread_function()
  wait(50)
  setVirtualKeyDown(key.VK_LMENU, true)
  wait(10)
  setVirtualKeyDown(key.VK_LMENU, false)
  wait(50)
  setVirtualKeyDown(key.VK_RETURN, true)
  wait(10)
  setVirtualKeyDown(key.VK_RETURN, false)
  wait(50)
  setVirtualKeyDown(key.VK_RETURN, true)
  wait(10)
  setVirtualKeyDown(key.VK_RETURN, false)
  wait(50)
  sampSendChat('/mr')
end
Тут не так абсолютно все, переписывать с нуля надо.
 

KhanWarden

Участник
42
3
Я хочу, чтобы делались действия после того как закрывается диалоговое окно. Подробнее:
Прописываю /invite [id]
Выходит диалоговое окно, где я должен выбрать форму
Как закроется диалоговое окно (т.е. как выберу форму) должны отыгрываться дальнейшие действия. Как это сделать?
 

astynk

Известный
Проверенный
742
530
Я хочу, чтобы делались действия после того как закрывается диалоговое окно. Подробнее:
Прописываю /invite [id]
Выходит диалоговое окно, где я должен выбрать форму
Как закроется диалоговое окно (т.е. как выберу форму) должны отыгрываться дальнейшие действия. Как это сделать?
Lua:
local waiting = false

sampRegisterChatCommand('invite', function (arg)
    sampSendChat('/invite ' .. arg)
    waiting = true
end)

function events.onSendDialogResponse()
    if waiting then waiting = false else return end
    -- code
end
 
  • Нравится
Реакции: McLore

McLore

Известный
559
279
я сделал биндер на клавишу, типо нажимаешь на клавишу в чат пишет что то, я столкнулся с такой проблемой когда открываешь чат и нажимаешь на забинденные клавиши то биндер срабатывает, как это исправить?
Код дай
 

EndoHokage

Активный
136
55
Привет, есть ли в луа такая функция которая ожидает какого либо действия.
Например, есть бесконечный цыкл, но в середине стоит проверка на действие, и пока действие не будет true, то цыкл будет оставаться на одной строке ожидания
Заранее спасибо
 
  • Нравится
Реакции: Mamory и Temate

Adam_Rockwell

Активный
143
25
Привет, есть ли в луа такая функция которая ожидает какого либо действия.
Например, есть бесконечный цыкл, но в середине стоит проверка на действие, и пока действие не будет true, то цыкл будет оставаться на одной строке ожидания
Заранее спасибо
условный оператор if
 

EndoHokage

Активный
136
55
условный оператор if
Мне нужно не проверять, а прям его остановить в одной точке
Если я в while, создам поток с while true и в этом потоке сделаю ожидание, то оно остановить исполнение первого while?
 
Последнее редактирование:

Adam_Rockwell

Активный
143
25
Мне нужно не проверять, а прям его остановить в одной точке
Если я в while, создам поток с while true и в этом потоке сделаю ожидание, то оно остановить исполнение первого while?
Остановить цикл while можно через break
Ты бы писал уже по сути что тебе надо сделать, а не намёками. А то ты вопросы задаешь, сам не понимая, что хочешь в ответ услышать)
 

ak4k1y

Участник
71
7
Есть функция определяющая Я в афк или нет?

(( isGamePaused() работает только если нажат ESC , а если игра свёрнута не работает ))
 

EndoHokage

Активный
136
55
Что тут не так, пишет что нельзя передать nil value, вот только я print(val) делаю и оно не равно nil
Lua:
for key, val in pairs(IdTable) do
    print(val)
    ThreadOfClickTextdraw:run(val)
end

--Функцию которую я вызываю

function ClickThread(clicklid)
    sampSendClickTextdraw(clicklid)
    wait(50)
end

--Вот как я создаю поток

ThreadOfClickTextdraw = lua_thread.create_suspended(ClickThread)

Заранее спасибо
 
  • Нравится
Реакции: Mamory

Adam_Rockwell

Активный
143
25
Что тут не так, пишет что нельзя передать nil value, вот только я print(val) делаю и оно не равно nil
Lua:
for key, val in pairs(IdTable) do
    print(val)
    ThreadOfClickTextdraw:run(val)
end

--Функцию которую я вызываю

function ClickThread(clicklid)
    sampSendClickTextdraw(clicklid)
    wait(50)
end

--Вот как я создаю поток

ThreadOfClickTextdraw = lua_thread.create_suspended(ClickThread)

Заранее спасибо
IdTable то покажи