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

suouca

Новичок
68
11
ебусь с цветом, хелп
изначально имею цвет формата argb
Lua:
local col = 0xFFFF0000
первожу его в rgba и делаю из него imgui.ImFloat() для того чтобы использовать его в imgui.ColotEdit4()
Lua:
local imcol = imgui.ImFloat4(imgui.ImColor(argb_to_rgba(col):GetFloat4())
и не могу перевести обратно в argb, что делать?
 

BARRY BRADLEY

Известный
711
176
Lua:
function hook.onSendGiveDamage(playerId, damage, weapon, bodypart)
    result, handle = sampGetCharHandleBySampPlayerId(playerId)
    if result then -- and not sampIsPlayerPaused(playerId)

        if lid == playerId then dh = dh + 1
        else lid = -1 end
        local name = sampGetPlayerNickname(playerId)
        printStringNow(string.format("~g~%s / DAMAGE: %d / x%d", name, damage, dh), 2000)
        print(string.format("ВЫ ПОПАЛИ В %s | DAMAGE: %d | WEAPON: %d", name, damage, weapon))
        lid = playerId
    end
end
 

#kweeZ

Известный
577
122
Код:
function submenus_show(menu, caption, select_button, close_button, back_button)
    select_button, close_button, back_button = select_button or 'Select', close_button or 'Close', back_button or 'Back'
    prev_menus = {}
    function display(menu, id, caption)
        local string_list = {}
        for i, v in ipairs(menu) do
            table.insert(string_list, type(v.submenu) == 'table' and v.title .. '  >>' or v.title)
        end
        sampShowDialog(id, caption, table.concat(string_list, '\n'), select_button, (#prev_menus > 0) and back_button or close_button, sf.DIALOG_STYLE_LIST)
        repeat
      wait(0)
            local result, button, list = sampHasDialogRespond(id)
            if result then
                if button == 1 and list ~= -1 then
                    local item = menu[list + 1]
                    if type(item.submenu) == 'table' then -- submenu
                        table.insert(prev_menus, {menu = menu, caption = caption})
                        if type(item.onclick) == 'function' then
                            item.onclick(menu, list + 1, item.submenu)
                        end
                        return display(item.submenu, id + 1, item.submenu.title and item.submenu.title or item.title)
                    elseif type(item.onclick) == 'function' then
                        local result = item.onclick(menu, list + 1)
                        if not result then return result end
                        return display(menu, id, caption)
                    end
                else -- if button == 0
                    if #prev_menus > 0 then
                        local prev_menu = prev_menus[#prev_menus]
                        prev_menus[#prev_menus] = nil
                        return display(prev_menu.menu, id - 1, prev_menu.caption)
                    end
                    return false
                end
            end
        until result
    end
    return display(menu, 31337, caption or menu.title)
end
Меню создаётся, но, если кликаешь хоть на 1 итем, то скрипт крашится ,пишет что-то про строку с wait(0)
 

Petr_Sergeevich

Известный
Проверенный
707
296
Код:
function submenus_show(menu, caption, select_button, close_button, back_button)
    select_button, close_button, back_button = select_button or 'Select', close_button or 'Close', back_button or 'Back'
    prev_menus = {}
    function display(menu, id, caption)
        local string_list = {}
        for i, v in ipairs(menu) do
            table.insert(string_list, type(v.submenu) == 'table' and v.title .. '  >>' or v.title)
        end
        sampShowDialog(id, caption, table.concat(string_list, '\n'), select_button, (#prev_menus > 0) and back_button or close_button, sf.DIALOG_STYLE_LIST)
        repeat
      wait(0)
            local result, button, list = sampHasDialogRespond(id)
            if result then
                if button == 1 and list ~= -1 then
                    local item = menu[list + 1]
                    if type(item.submenu) == 'table' then -- submenu
                        table.insert(prev_menus, {menu = menu, caption = caption})
                        if type(item.onclick) == 'function' then
                            item.onclick(menu, list + 1, item.submenu)
                        end
                        return display(item.submenu, id + 1, item.submenu.title and item.submenu.title or item.title)
                    elseif type(item.onclick) == 'function' then
                        local result = item.onclick(menu, list + 1)
                        if not result then return result end
                        return display(menu, id, caption)
                    end
                else -- if button == 0
                    if #prev_menus > 0 then
                        local prev_menu = prev_menus[#prev_menus]
                        prev_menus[#prev_menus] = nil
                        return display(prev_menu.menu, id - 1, prev_menu.caption)
                    end
                    return false
                end
            end
        until result
    end
    return display(menu, 31337, caption or menu.title)
end
Меню создаётся, но, если кликаешь хоть на 1 итем, то скрипт крашится ,пишет что-то про строку с wait(0)
А как ты её используешь?

ебусь с цветом, хелп
изначально имею цвет формата argb
Lua:
local col = 0xFFFF0000
первожу его в rgba и делаю из него imgui.ImFloat() для того чтобы использовать его в imgui.ColotEdit4()
Lua:
local imcol = imgui.ImFloat4(imgui.ImColor(argb_to_rgba(col):GetFloat4())
и не могу перевести обратно в argb, что делать?
Lua:
function explode_argb(argb)
local a = bit.band(bit.rshift(argb, 24), 0xFF)
local r = bit.band(bit.rshift(argb, 16), 0xFF)
local g = bit.band(bit.rshift(argb, 8), 0xFF)
local b = bit.band(argb, 0xFF)
return a, r, g, b
end

function join_argb(a, r, g, b)
local argb = b -- b
argb = bit.bor(argb, bit.lshift(g, 8)) -- g
argb = bit.bor(argb, bit.lshift(r, 16)) -- r
argb = bit.bor(argb, bit.lshift(a, 24)) -- a
return argb
end

function ARGB(rgba)
local a, r, g, b = explode_argb(rgba)
return bit.tohex(join_argb(a, b, g, r))
end
 
Последнее редактирование:

#kweeZ

Известный
577
122
А как ты её используешь?


Lua:
function explode_argb(argb)
local a = bit.band(bit.rshift(argb, 24), 0xFF)
local r = bit.band(bit.rshift(argb, 16), 0xFF)
local g = bit.band(bit.rshift(argb, 8), 0xFF)
local b = bit.band(argb, 0xFF)
return a, r, g, b
end

function join_argb(a, r, g, b)
local argb = b -- b
argb = bit.bor(argb, bit.lshift(g, 8)) -- g
argb = bit.bor(argb, bit.lshift(r, 16)) -- r
argb = bit.bor(argb, bit.lshift(a, 24)) -- a
return argb
end

function ARGB(rgba)
local a, r, g, b = explode_argb(rgba)
return bit.tohex(join_argb(a, b, g, r))
end
Код:
require "lib.moonloader"
local keys = require "vkeys"
local sampev = require "lib.samp.events"
local sf = require 'sampfuncs'

local tag = "{FFFFFF}Test"
local main_color = 0xFFA200
local main_color_text = "{5A90CE}"
local white_color = "{FFFFFF}"
local red_color = "{FF0000}"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
      while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("test1", qband)
        sampRegisterChatCommand("test2", qband2)
    thread = lua_thread.create_suspended(thread_function)

      sampAddChatMessage("" .. tag, main_color)


      while true do
      wait(0)
end
end

function test1()
      sampShowDialog(2342, "Test", "Accept", "Cancel")
end

function test2()
dialog =    {
  {
        title = "Test1",
        onclick = function()
     test1()
     return true
        end
  }
}
submenus_show(dialog, 'Test', 'Accept', 'Cancel', 'Back')
end

function submenus_show(menu, caption, select_button, close_button, back_button)
    select_button, close_button, back_button = select_button or 'Select', close_button or 'Close', back_button or 'Back'
    prev_menus = {}
    function display(menu, id, caption)
        local string_list = {}
        for i, v in ipairs(menu) do
            table.insert(string_list, type(v.submenu) == 'table' and v.title .. '  >>' or v.title)
        end
        sampShowDialog(id, caption, table.concat(string_list, '\n'), select_button, (#prev_menus > 0) and back_button or close_button, sf.DIALOG_STYLE_LIST)
        repeat
      wait(0)
            local result, button, list = sampHasDialogRespond(id)
            if result then
                if button == 1 and list ~= -1 then
                    local item = menu[list + 1]
                    if type(item.submenu) == 'table' then -- submenu
                        table.insert(prev_menus, {menu = menu, caption = caption})
                        if type(item.onclick) == 'function' then
                            item.onclick(menu, list + 1, item.submenu)
                        end
                        return display(item.submenu, id + 1, item.submenu.title and item.submenu.title or item.title)
                    elseif type(item.onclick) == 'function' then
                        local result = item.onclick(menu, list + 1)
                        if not result then return result end
                        return display(menu, id, caption)
                    end
                else -- if button == 0
                    if #prev_menus > 0 then
                        local prev_menu = prev_menus[#prev_menus]
                        prev_menus[#prev_menus] = nil
                        return display(prev_menu.menu, id - 1, prev_menu.caption)
                    end
                    return false
                end
            end
        until result
    end
    return display(menu, 31337, caption or menu.title)
end
 

Natami

Участник
377
26
Как сделать,чтобы при нажатии это кнопки "Собеседование" открылось 2-ое меню.
А то мучаюсь несколько дней.

Вот мой код:
Lua:
function imgui.OnDrawFrame()
  if main_window_state.v then
    imgui.SetNextWindowSize(imgui.ImVec2(800, 600), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Хелпер', main_window_state ,noresize + noscroll + imgui.WindowFlags.NoScrollWithMouse + imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.ShowBorders)
    imgui.Text(u8'============РЕКЛАМА============')
    imgui.SameLine()
    imgui.Text(u8'         ==========РП ОТЫГРОВКИ==========')
        if imgui.Button(u8'Собеседование\n     СМИ-РСФ', btn_size) then

        end
        imgui.End()
    end
end

function main()
    sampRegisterChatCommand('ustav', ustav_menu)
    while true do
        wait(0)
        if wasKeyPressed(key.VK_Z) then 
                main_window_state.v = not main_window_state.v 
        end
        imgui.Process = main_window_state.v 
    end
end
function ustav_menu()
  main_window_state.v = not main_window_state.v
  imgui.Process = main_window_state.v
end
.
Lua:
 if imgui.Button(u8'Собеседование', btn_size) then imgui.OpenPopup(u8"Фракции") then
        imgui.SetNextWindowSize(imgui.ImVec2(200, 200), imgui.Cond.FirstUseEver)
        if imgui.BeginPopupModal(u8"Фракции") then
            lua_thread.create(function()
            imgui.Button(u8'сми', btn_size) then sampSendChat("/gov text")
         wait(0)
         sampSendChat("/gov text")
         end)
        -- code
        imgui.EndPopup()
        end
    imgui.End()
    end
 
Последнее редактирование:

BARRY BRADLEY

Известный
711
176
Первый вопрос: Я создал маркер над игроком, он виден на радаре и над головой игрока. Как удалить его над головой, но оставить на радаре?
Второй вопрос: Как создать объект над головой игрока на время?

Заранее спасибо, с меня лайк.
 

offsya

Новичок
12
0
Какая функция на посадку игрока на пассажирское, определяющая его ID, есть чтобы срабатывала как только окончательно в кар сел, а не как только нажал G?
 

suouca

Новичок
68
11
А как ты её используешь?


Lua:
function explode_argb(argb)
local a = bit.band(bit.rshift(argb, 24), 0xFF)
local r = bit.band(bit.rshift(argb, 16), 0xFF)
local g = bit.band(bit.rshift(argb, 8), 0xFF)
local b = bit.band(argb, 0xFF)
return a, r, g, b
end

function join_argb(a, r, g, b)
local argb = b -- b
argb = bit.bor(argb, bit.lshift(g, 8)) -- g
argb = bit.bor(argb, bit.lshift(r, 16)) -- r
argb = bit.bor(argb, bit.lshift(a, 24)) -- a
return argb
end

function ARGB(rgba)
local a, r, g, b = explode_argb(rgba)
return bit.tohex(join_argb(a, b, g, r))
end
да я знаю про существование этих функций, ты мне скажи как из ImFloat4 вернуть rgba
 

mld

Участник
99
11
Lua:
 if imgui.Button(u8'Собеседование', btn_size) then imgui.OpenPopup(u8"Фракции") then
        imgui.SetNextWindowSize(imgui.ImVec2(200, 200), imgui.Cond.FirstUseEver)
        if imgui.BeginPopupModal(u8"Фракции") then
            lua_thread.create(function()
            imgui.Button(u8'сми', btn_size) then sampSendChat("/gov text")
         wait(0)
         sampSendChat("/gov text")
         end)
        -- code
        imgui.EndPopup()
        end
    imgui.End()
    end
Не получается вообще
У меня постоянно жалуется на разные строки
 

tlwsn

Известный
537
85
хотел сделать аналог кил-листа из соба, но не смог догадаться, как можн нарисовать иконки оружий как в собе?
Bwbf2hM.png
 
  • Нравится
Реакции: BARRY BRADLEY

mld

Участник
99
11
проверь структуру, там ошибка
Проверил,все норм.
По другому сделал,теперь крашится игра с ошибкой
Lua:
function imgui.OnDrawFrame()
      if main_window_state.v then
            imgui.SetNextWindowSize(imgui.ImVec2(800, 600), imgui.Cond.FirstUseEver)
            imgui.Begin(u8'Хелпер', main_window_state ,noresize + noscroll + imgui.WindowFlags.NoScrollWithMouse + imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.ShowBorders)
        imgui.Text(u8'============РЕКЛАМА============')
        imgui.SameLine()
        imgui.Text(u8'         ==========РП ОТЫГРОВКИ==========')
            if imgui.Button(u8'Собеседование', btn_size) then
                if imgui.OpenPopup(u8"Фракции") then
                    imgui.SetNextWindowSize(imgui.ImVec2(200, 200), imgui.Cond.FirstUseEver)
                    if imgui.BeginPopupModal(u8"Фракции") then
                        lua_thread.create(function()
                            if imgui.Button(u8'сми', btn_size) then
                                sampSendChat("/n 123")
                                wait(2000)
                                sampSendChat('/b 123')
                            end
                        end)
                    end
                end
                imgui.EndPopup()
            end
            imgui.End()
        end
end
.