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

Fott

Простреленный
3,446
2,312
может он имеет введу когда прицелился 1 раз то у него сохранился id человека а потом он нажал кнопку и оно написало /trade id.
Пусть тогда записывает ид в глобальную переменную и посмотрит уроки и другие скрипты, а не будет задавать тут миллион глупых вопросов
 

Itachi Uchiha

Участник
124
21
В чем проблема просто подсказать как это делать а не разводить тут невесть что?
 

kizn

О КУ)))
Всефорумный модератор
2,405
2,060
В чем проблема просто подсказать как это делать а не разводить тут невесть что?
Да сделай ты кнопку вкл/выкл, в бесконечный цикл main поставь проверку на нажатие кнопки, активацию кнопки T R A D E и твою команду
Что здесь непонятного?
 
D

deleted-user-399997

Гость
Все равно, у меня оно спамит, устанавливал 5000. Не работает wait
Lua:
[/B]

require('lib.moonloader')
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local sw, sh = getScreenResolution()
local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)
local checked_checkbox = imgui.ImBool(false)
local checked_radio = imgui.ImInt(0)
local checked_combo = imgui.ImInt(1)
local int_delay = imgui.ImInt(0)
function main()
    imgui.Process = false
    sampRegisterChatCommand("fh", cmd_fh)
    while true do
        wait(0)
        if main_window_state.v == false then
            imgui.Process = false
        end
    end
end
function cmd_fh(arg)
    main_window_state.v = not main_window_state.v
    imgui.Process = main_window_state.v
end
function imgui.OnDrawFrame()
    imgui.SetNextWindowSize(imgui.ImVec2(500, 300), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8"FamilyHelper", main_window_state, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove)
    imgui.SetCursorPos(imgui.ImVec2(5, 25)) 
    if imgui.Button(u8"Обьявления", imgui.ImVec2(120, 24)) then
        selected = 1
    end
    imgui.SetCursorPos(imgui.ImVec2(130, 25)) 
    if imgui.Button(u8"Приглашение", imgui.ImVec2(120, 24)) then
        selected = 2
    end
    imgui.SetCursorPos(imgui.ImVec2(255, 25)) 
    if imgui.Button(u8"Авто сообщение", imgui.ImVec2(120, 24)) then
        selected = 3
    end
    imgui.SetCursorPos(imgui.ImVec2(380, 25)) 
    if imgui.Button(u8"Информация", imgui.ImVec2(120, 24)) then
        selected = 4
    end
    if selected == 1 then
        imgui.Separator()
        
        imgui.RadioButton("Standart", checked_radio, 1 )
        imgui.SameLine()
        imgui.RadioButton("VIP", checked_radio, 2 )
        imgui.InputText(u8"Введите текст", text_buffer)
        imgui.PushItemWidth(120)
        imgui.InputInt("##input", int_delay, 0, 0)
        imgui.Checkbox(u8"Включить/Выключить", checked_checkbox)
        if checked_checkbox.v then
            lua_thread.create(function()
                sampSendChat(u8:decode("ad ".. checked_radio.v .. " " .. text_buffer.v))
                wait(int_delay.v)
            end)
        end
    end
    imgui.End()
end

[B]
 

kizn

О КУ)))
Всефорумный модератор
2,405
2,060
Все равно, у меня оно спамит, устанавливал 5000. Не работает wait
Lua:
[/B]

require('lib.moonloader')
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local sw, sh = getScreenResolution()
local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)
local checked_checkbox = imgui.ImBool(false)
local checked_radio = imgui.ImInt(0)
local checked_combo = imgui.ImInt(1)
local int_delay = imgui.ImInt(0)
function main()
    imgui.Process = false
    sampRegisterChatCommand("fh", cmd_fh)
    while true do
        wait(0)
        if main_window_state.v == false then
            imgui.Process = false
        end
    end
end
function cmd_fh(arg)
    main_window_state.v = not main_window_state.v
    imgui.Process = main_window_state.v
end
function imgui.OnDrawFrame()
    imgui.SetNextWindowSize(imgui.ImVec2(500, 300), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8"FamilyHelper", main_window_state, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove)
    imgui.SetCursorPos(imgui.ImVec2(5, 25)) 
    if imgui.Button(u8"Обьявления", imgui.ImVec2(120, 24)) then
        selected = 1
    end
    imgui.SetCursorPos(imgui.ImVec2(130, 25)) 
    if imgui.Button(u8"Приглашение", imgui.ImVec2(120, 24)) then
        selected = 2
    end
    imgui.SetCursorPos(imgui.ImVec2(255, 25)) 
    if imgui.Button(u8"Авто сообщение", imgui.ImVec2(120, 24)) then
        selected = 3
    end
    imgui.SetCursorPos(imgui.ImVec2(380, 25)) 
    if imgui.Button(u8"Информация", imgui.ImVec2(120, 24)) then
        selected = 4
    end
    if selected == 1 then
        imgui.Separator()
        
        imgui.RadioButton("Standart", checked_radio, 1 )
        imgui.SameLine()
        imgui.RadioButton("VIP", checked_radio, 2 )
        imgui.InputText(u8"Введите текст", text_buffer)
        imgui.PushItemWidth(120)
        imgui.InputInt("##input", int_delay, 0, 0)
        imgui.Checkbox(u8"Включить/Выключить", checked_checkbox)
        if checked_checkbox.v then
            lua_thread.create(function()
                sampSendChat(u8:decode("ad ".. checked_radio.v .. " " .. text_buffer.v))
                wait(int_delay.v)
            end)
        end
    end
    imgui.End()
end

[B]
поставь в созданном потоке print(int_delay.v) - что выведет в мунлог?
 
  • Нравится
Реакции: Itachi Uchiha
D

deleted-user-399997

Гость
поставь в созданном потоке print(int_delay.v) - что выведет в мунлог?
Оно в мун лог пишет число которое в int_delay но все равно продолжает спамить
поставь в созданном потоке print(int_delay.v) - что выведет в мунлог?
Поставил я 30000, у меня в сампфункс консоль не выводилось ничего, только как раз через 30 сек начало
 
Последнее редактирование модератором:

ewin

Известный
675
370
function at line 669 has more than 60 upvalues
Как исправить? Пытался определенное имгуи окно засунуть в другую функцию и вызывать ее, но тогда при нажатии на любую из кнопок навигации, скрипт просто крашится
 

enyag

Известный
345
12
function at line 669 has more than 60 upvalues
Как исправить? Пытался определенное имгуи окно засунуть в другую функцию и вызывать ее, но тогда при нажатии на любую из кнопок навигации, скрипт просто крашится
сам фиксил это и пофиксил.
просто создай массив, допустим array, добавляй в него перменную как в коде и везде юзай не main_window_state.v, а не забавляй добавляй в начало название массива
Lua:
array = {
    main_window_state = imgui.ImBool(false)
}

Примерчик:
-- начало кода
array = {
main_window_state = imgui.ImBool(false)
}

-- on frame
if then array.main_window_state = imgui.ImBool(false)
-- code
end
 
  • Нравится
Реакции: PanSeek

ewin

Известный
675
370
сам фиксил это и пофиксил.
просто создай массив, допустим array, добавляй в него перменную как в коде и везде юзай не main_window_state.v, а не забавляй добавляй в начало название массива
Lua:
array = {
    main_window_state = imgui.ImBool(false)
}

Примерчик:
-- начало кода
array = {
main_window_state = imgui.ImBool(false)
}

-- on frame
if then array.main_window_state = imgui.ImBool(false)
-- code
end
Есть еще способы?
 

Slava Stetem

Участник
106
5
Помогите хочу добавить картинку на ImGUI и вылазит ошибка
Код:
attempt to index global 'imgui' (a nil value)
stack traceback:
Вот сама строка с кодом;
Lua:
img = imgui.CreateTextureFromFile(getGameDirectory() .. "\\moonloader\\images\\offiver.jpg")
imgui.Image(img, imgui.ImVec2(200, 180))