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

lorgon

Известный
656
268
Как эмулировать нажатие клавиши W? (Много раз надо нажать). Как проверить сижу ли я вообще в машине?
 

BIG BOG

Известный
654
142
Код:
function BeginToPoint2(arg)
    arg = tonumber(arg)
    if arg ~= nil then
    lua_thread.create(BeginToPoint, arg)
    end
end
function BeginToPoint(time)
    repeat
        sampSendChat("/bla")
        wait(time)
    until not enabled
        
end
я хочу чтобы число введённое после команды записывалось в переменную time, я пробовал так, но это не сработало
 

trefa

Известный
Всефорумный модератор
2,097
1,233
mb = "%d"
mainIni.sett.megabytes = math.ceil(mb * 1048576)
inicfg.save(mainIni, "Mine.ini")
но крашит
[ML] (error) my: D:\S\moonloader\my.lua:89: attempt to perform arithmetic on global 'mb' (a string value)
stack traceback:
D:\S\moonloader\my.lua:89: in function <D:\S\moonloader\my.lua:85>
[ML] (error) my: Script died due to an error. (19BC93CC)
Зачем ты пытаешься число умножить на строку?
 

Fomikus

Известный
Проверенный
474
343
Можно ли убрать что-то одно (и как вообще): ХП/БРОНЯ/ДЕНЬГИ/ИКОНКИ/КАРТА?
 

Leatington

Известный
258
71
Есть такой биндер
Lua:
function SendChatTextWithTxt(file)
  tags = {
    ["{N}"] = gName or "ERROR",
    ["{S}"] = gSurname or "ERROR",
    ["{ID}"] = gID or "ERROR"
  }
  lua_thread.create(
    function()
      for line in io.lines(file) do
        for tag in pairs(tags) do
          if line:find(tag) then
            line = line:gsub(tag, tags[tag])
          elseif line:find('{wait (%d+)}') then
            waittag = line:find('{wait (%d+)}')
           
            _, waittime = string.match(waittag, '(%a+) (%d+)')
            print(waittime) --возвращает nil
          end
        end
        sampSendChat(line)
        wait(2000)
    end
  end)
end

в файле есть тэг {wait 20}
как достать с тэга значение 20

выше предложенный вариант возвращает мне значение nil
Код:
if v:find('{wait:(%d+)}') then
    local waiting = v:match('{wait:(%d+)}')
    local result = v:gsub('{wait:(%d+)}', '')
    if result ~= '' then
        sampSendChat(result)
        wait(waiting)
    end
Переделай под себя немного.
 
  • Нравится
Реакции: KH9I3b_MuJIOCJIABCKu

FBenz

Активный
328
40
Мне нужно нажимать на + и - в данном интерфейсе. А так же на кнопку CREATE. Как мне это сделать? Не шарю за текстдровы
33522
 

FYS

Потрачен
982
236
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Вложения

  • textdraw_4 (1).lua
    1.5 KB · Просмотры: 5
  • Нравится
Реакции: FBenz

KH9I3b_MuJIOCJIABCKu

Участник
52
20
Код:
if v:find('{wait:(%d+)}') then
    local waiting = v:match('{wait:(%d+)}')
    local result = v:gsub('{wait:(%d+)}', '')
    if result ~= '' then
        sampSendChat(result)
        wait(waiting)
    end
Переделай под себя немного.

я то переделал но получается что выражение if result ~= '' равно false и ничего не делается

вот к какому варианту дошел я
Lua:
function SendChatTextWithTxt(file)
  tags = {
    ["{N}"] = gName or "ERROR",
    ["{S}"] = gSurname or "ERROR",
    ["{ID}"] = gID or "ERROR"
  }
  lua_thread.create(
    function()
      for line in io.lines(file) do
        for tag in pairs(tags) do
          if line:find(tag)  then
            line = line:gsub(tag, tags[tag])
          elseif line:find('{wait (%d+)}') then
            waiting = line:match('{wait (%d+)}')
            line = line:gsub('{wait (%d+)}', '')
          end
        end
        -- if result ~= '' then
          sampSendChat(line)
          wait(waiting)
      --  end
        -- sampAddChatMessage(line, 0x00bababa)
     
      end
     
  end)
end

текст в файле
Код:
/me взял в руки дверь
{wait 2000}
/me выбросил дверь
{wait 3000}
{ID}

и текст на выходе
Код:
[23:29:40] * Florencio взял в руки дверь

[23:29:40] Florencio говорит:

[23:29:42] * Florencio выбросил дверь

[23:29:44] Florencio говорит:

[23:29:47] Florencio говорит: 10

а мне просто не нужны пропуски, просто нужно что-бы {wait 3000} игнорировался или стирался во время выполнения скрипта
 
Последнее редактирование:

LuaMaster

Известный
145
17
Lua:
function hook.onServerMessage(color,msg)
    if string.find(msg, "Server closed the connection") then
        lua_thread.create(function()
            sampDisconnectWithReason(quit)
            wait(10000)
            sampSetGamestate(1)
        end)
    end
end
[\code].

Почему не работает?