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

Flokich

Новичок
9
0
Lua:
local imgui = require("imgui")
local pie_mode = imgui.ImBool(true) -- режим PieMenu
local pie_keyid = 1 -- 0 ЛКМ, 1 ПКМ, 2 СКМ
local pie_elements =
{
  {name = 'Сказать привет', action = function() sampSendChat('Привет.') end, next = nil},
  {name = 'Сказать пока', action = function() sampSendChat('Пока.') end, next = nil},
  {name = 'Сказать что-то', action = function() end, next = {
    {name = 'Сказать как дела', action = function() sampSendChat('Как дела.') end, next = nil},
    {name = 'Сказать ку-ку', action = function() sampSendChat('Ку-ку.') end, next = nil},
    {name = 'Сказать дароу', action = function() sampSendChat('Дароу.') end, next = nil}
  }}
}
if pie_mode.v then
    if imgui.IsMouseClicked(pie_keyid) then imgui.OpenPopup('PieMenu') end
    if pie.BeginPiePopup('PieMenu', pie_keyid) then
      for k, v in ipairs(pie_elements) do
        if v.next == nil then if pie.PieMenuItem(u8(v.name)) then v.action() end
        elseif type(v.next) == 'table' then drawPieSub(v) end
      end
      pie.EndPiePopup()
    end
end
imgui.ShowCursor = (pie_mode.v and imgui.IsMouseDown(pie_keyid))
function drawPieSub(v)
  if pie.BeginPieMenu(u8(v.name)) then
    for i, l in ipairs(v.next) do
      if l.next == nil then
        if pie.PieMenuItem(u8(l.name)) then l.action() end
      elseif type(l.next) == 'table' then
        drawPieSub(l)
      end
    end
    pie.EndPieMenu()
  end
end


А почему при запуске такая ошибка?

(error) test3.lua: ...to San Andreas + MultiPlayer\moonloader\test3.lua:1: attempt to index global 'imgui' (a nil value)
stack traceback:

Брал отсюда - https://blast.hk/threads/19648/page-3

(error) test3.lua: ...to San Andreas + MultiPlayer\moonloader\test3.lua:17: attempt to index global 'pie' (a nil value)
stack traceback:
 

Bananious

Известный
238
17
Как сделать что бы с помощью чек бокса активировалась емуляция клавиши:
Lua:
setGameKeyState(16, 0xFF)
wait(20)
 

Belo4ka_belka

Известный
191
7
Можно после текста добавить IsItemClicked чтобы сделать его кликабельным
Lua:
imgui.Text('Hello world')
if imgui.IsItemClicked() then
    --действия при клике
end
Ура! Спасибо!

Здравствуйте товарищи. Имеется текстовый элемент, необходимо обвести вокруг него контур. Возможно ли такое?
 

MrCold

Активный
364
118
Умоляю вас, помогите мне вот это перевести на Lua, прошу):
CLEO:
:Label0006E3
00D6: if
0039:   21@ == 1
004D: jump_if_false @Label000943
0BE5: raknet 14@ = get_hook_param 1 -- packedId
00D6: if
0039:   14@ == 115
004D: jump_if_false @Label000943
0BE5: raknet 15@ = get_hook_param 0 -- BITSTREAM
0BE7: raknet 16@ = bit_stream_read 15@ type 1
0BE7: raknet 17@ = bit_stream_read 15@ type 2
0BE7: raknet 18@ = bit_stream_read 15@ type 3
0BE7: raknet 19@ = bit_stream_read 15@ type 3
0BE7: raknet 20@ = bit_stream_read 15@ type 3
00D6: if and
0039:   16@ == 0
0039:   19@ == 0
0B23:  samp is_player_connected 17@
004D: jump_if_false @Label000943
0BCB: samp send_give_damage playerid 17@ damage 7.0 weapon 0 bodypart 9
 

Bananious

Известный
238
17
Можно как-то сделать переход по ссылке, например нажимаю кнопку в Imgui и меня перекидывает по ссылке?
 

Kuharz

Известный
407
154
Вообще нифига не получается,
ни такой вариант
Lua:
function wtest()
    if not isGamePaused() or not isPauseMenuActive() then
         local text, _, _, _ = sampGetChatString(99)
          if string.find(text, "test") then
             sampAddChatMessage(text, -1)
         end
    end
end
Ни такой
Lua:
function wtest()
    if not isGamePaused() or not isPauseMenuActive() then
         local text, _, _, _ = sampGetChatString(99)
             sampAddChatMessage(text, -1)
    end
end
Не катят.