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

Vespan

loneliness
Проверенный
2,105
1,643
Как сделать,что когда настаёт час:55 минут,то пишет sampAddChatMessage('PAYDAYYY', -1)
Час должен быть любой(не 5:55 / 21:55 а любой )
 

dmitri4

Известный
453
79
Как сделать,что когда настаёт час:55 минут,то пишет sampAddChatMessage('PAYDAYYY', -1)
Час должен быть любой(не 5:55 / 21:55 а любой )
Lua:
if os.date('%M') == '55' then
    sampAddChatMessage('PAYDAYYY', -1)
end
Координаты бара ввода чата реально получить?
Lua:
local in1 = getStructElement(sampGetInputInfoPtr(), 0x8, 4)
local x = getStructElement(in1, 0x8, 4)
local y = getStructElement(in1, 0xC, 4)
 
Последнее редактирование:

Vespan

loneliness
Проверенный
2,105
1,643
Lua:
if os.date('%M') == '55' then
    sampAddChatMessage('PAYDAYYY', -1)
end

Lua:
local in1 = getStructElement(sampGetInputInfoPtr(), 0x8, 4)
local in2 = getStructElement(in1, 0x8, 4)
local in3 = getStructElement(in1, 0xC, 4)
А куда ставить ?В беск.Цыкл(если поставлю то там пздц какой флуд этим сообщением)
 

mld

Участник
99
11
При записи /ms в гта у меня не открывается 1 меню,а если прописать /ld,то обе меншки появляются,до этого все работало как надо,а щас все полетело
что делать?
В функции /ld я прописывал imgui.Process = mainldrs_window.v не помогает,а только крашит скрипт
 

Вложения

  • 1569957255044.png
    1569957255044.png
    8 KB · Просмотры: 141

dmitri4

Известный
453
79
А куда ставить ?В беск.Цыкл(если поставлю то там пздц какой флуд этим сообщением)
Как вариант проверять в отдельном цикле с задержкой в минуту
При записи /ms в гта у меня не открывается 1 меню,а если прописать /ld,то обе меншки появляются,до этого все работало как надо,а щас все полетело
что делать?
В функции /ld я прописывал imgui.Process = mainldrs_window.v не помогает,а только крашит скрипт
В Main
Lua:
imgui.Process = main_window.v or mainlrds_windows.v
 

mld

Участник
99
11
Lua:
--// загрузка скрипта //
function main()
    sampRegisterChatCommand('ms',call_window)
    sampRegisterChatCommand('ld',call_ldwindow)
    while true do
      wait(0)
      if wasKeyPressed(key.VK_INSERT)  then
      main_window.v = not main_window.v
      end
      if wasKeyPressed(key.VK_F1) then
      main_window.v = not main_window.v
      end     
      imgui.Process = main_window.v or mainlrds_windows.v
    end
end

--// call-windows //
function call_window()
    main_window.v = not main_window.v
    imgui.Process = main_window.v
end

--// call-ldwindows //
function call_ldwindow()
    mainlrds_window.v = not mainlrds_window.v
end
 

dmitri4

Известный
453
79
Lua:
--// загрузка скрипта //
function main()
    sampRegisterChatCommand('ms',call_window)
    sampRegisterChatCommand('ld',call_ldwindow)
    while true do
      wait(0)
      if wasKeyPressed(key.VK_INSERT)  then
      main_window.v = not main_window.v
      end
      if wasKeyPressed(key.VK_F1) then
      main_window.v = not main_window.v
      end    
      imgui.Process = main_window.v or mainlrds_windows.v
    end
end

--// call-windows //
function call_window()
    main_window.v = not main_window.v
    imgui.Process = main_window.v
end

--// call-ldwindows //
function call_ldwindow()
    mainlrds_window.v = not mainlrds_window.v
end
Желательно было бы с имгуи а не этот кусок который даже не запуститься
 

mld

Участник
99
11
Желательно было бы с имгуи а не этот кусок который даже не запуститься
Ща скину,еще прикол в том,что у меня скрипт по другому называется,а мл выдает другое название скрипта
А все началось с того,что я добавил testCheat и после удалил и к этому привел крах всего скрипта
UPD
Заработало,тогда,когда я поменял переменные,и вставил твой код imgui.Process = main_window.v or leaders_window.v
Lua:
function imgui.OnDrawFrame()
    if main_window.v then
        imgui.SetNextWindowSize(imgui.ImVec2(740,500))
        imgui.Begin(u8'SMI++ | By Cody_Flex', main_window,imgui.WindowFlags.NoResize + imgui.WindowFlags.ShowBorders + imgui.WindowFlags.AlwaysAutoResize)
            imgui.BeginChild('left', imgui.ImVec2(155, 470), true) --Навигация по меню от "Эфиров" до "О скрипте"
                if not selected then selected = 1 end
                    if imgui.Button(fa.ICON_BULLHORN..u8' Эфиры',selectable_size) then selected = 1 end --Эфиры
                imgui.Separator()
                    if imgui.Button(fa.ICON_AUDIO_DESCRIPTION..u8' Реклама',selectable_size) then selected = 2 end --Реклама
                imgui.Separator()
                    if imgui.Button(fa.ICON_ATLAS..u8' Экзамен и прочее',selectable_size) then selected = 3 end --Экзамен и прочее
                imgui.Separator()
                    if imgui.Button(fa.ICON_ADDRESS_CARD..u8' Объявления',selectable_size) then selected = 4 end -- Объявления
                imgui.Separator()
                    if imgui.Button(fa.ICON_FILE_CODE..u8' О скрипте',selectable_size) then selected = 5 end -- О скрипте
            imgui.EndChild() --конец навигации
            imgui.SameLine()
            imgui.BeginChild('right', imgui.ImVec2(570, 470), true)
                if selected == 1 then --// Эфиры //
                    imgui.BeginChild('up', imgui.ImVec2(560, 48), true)
                     if not selectedd then selectedd = 1 end
                        if imgui.Button(u8'Математика',btnlives_size) then selectedd = 1 end -- Математика
                            imgui.SameLine()
                        if imgui.Button(u8'Столицы',btnlives_size) then selectedd = 2 end -- Столицы
                            imgui.SameLine()
                        if imgui.Button(u8'125',btnlives_size) then selectedd = 3 end -- Интервью
                            imgui.SameLine()
                        if imgui.Button(u8'126',btnlives_size) then selectedd = 4 end --126
                    imgui.EndChild()
                    imgui.BeginChild('down', imgui.ImVec2(560, 410), true) --действия эфиров
                    imgui.EndChild()
                end --// Конец Эфиров //
                if selected == 2 then --// Реклама //
                    imgui.BeginChild('##up', imgui.ImVec2(560, 48), true)
                      if not selecteddd then selecteddd = 1 end
                        if imgui.Button(u8'Гос.Орг-ии',adws_btn) then selecteddd = 1 end -- Математика
                            imgui.SameLine()
                        if imgui.Button(u8'Прес.Синд.',adws_btn) then selecteddd = 2 end -- Столицы
                    imgui.EndChild()
                    imgui.BeginChild('##down', imgui.ImVec2(560, 410), true) --реклама организаций/синдикатов
                        if selecteddd == 1 then -- Гос.Орг
                            if imgui.Button(u8'ЛСМЦ',btnadw_size) then end
                                imgui.SameLine()
                            if imgui.Button(u8'ТСР',btnadw_size) then end
                                imgui.SameLine()
                            if imgui.Button(u8'СВАТ',btnadw_size) then end
                            if imgui.Button(u8'СФМЦ',btnadw_size) then end
                                imgui.SameLine()
                            if imgui.Button(u8'ЛСПД',btnadw_size) then end
                                imgui.SameLine()
                            if imgui.Button(u8'Пра-во',btnadw_size) then end
                            if imgui.Button(u8'ЛВМЦ',btnadw_size) then end
                                imgui.SameLine()
                            if imgui.Button(u8'СФПД',btnadw_size) then end
                                imgui.SameLine()
                            if imgui.Button(u8'ЦБ',btnadw_size) then end
                            if imgui.Button(u8'ЛСа(МП)',btnadw_size) then end
                                imgui.SameLine()
                            if imgui.Button(u8'РКШД',btnadw_size) then end
                                imgui.SameLine()
                            if imgui.Button(u8'ГЦЛ',btnadw_size) then end
                            if imgui.Button(u8'СФа(ВВС)',btnadw_size) then end
                        end -- Конец Гос.Организаций

                        if selecteddd == 2 then -- Преступные Синдикаты
                            if imgui.Button(u8'РМ',btnadw_size) then end
                                imgui.SameLine()
                            if imgui.Button(u8'Якудза',btnadw_size) then end
                            if imgui.Button(u8'ЛКН',btnadw_size) then end
                                imgui.SameLine()
                            if imgui.Button(u8'Байкеры',btnadw_size) then end
                        end -- Конец Прес.Синдикатов

                    imgui.EndChild()
                end -- // Конец Рекламы //

                if selected == 3 then -- Экзамен и прочее
                    imgui.BeginChild('##upps', imgui.ImVec2(560, 48), true)
                      if not selectedddd then selectedddd = 1 end
                        if imgui.Button(u8'Устав',btnlives_size) then selecteddddd = 1 end
                            imgui.SameLine()
                        if imgui.Button(u8'ПРО',btnlives_size) then selecteddddd = 2 end
                            imgui.SameLine()
                        if imgui.Button(u8'ППЭ',btnlives_size) then selecteddddd = 3 end
                    imgui.EndChild()
                    imgui.BeginChild('##downs', imgui.ImVec2(560, 408), true)
                        if selecteddddd == 1 then
                            if imgui.Button(u8'112331',btnlives_size) then end
                        end
                        if selecteddddd == 2 then
                            if imgui.Button(u8'1123312',btnlives_size) then end
                        end
                        if selecteddddd == 3 then
                            if imgui.Button(u8'1123313',btnlives_size) then end
                        end
                    imgui.EndChild()
                end -- Конец Экзаменов и Прочее
            
                if selected == 4 then
                
                end
                if selected == 5 then
                    imgui.Text(aboutscr)
                end
            imgui.EndChild()
        imgui.End()   
    end
    if mainlrds_window.v then
        imgui.SetNextWindowSize(imgui.ImVec2(350,250))
        imgui.Begin(u8'Menu of leader | By Cody_Flex', mainldrs_window,imgui.WindowFlags.NoResize + imgui.WindowFlags.ShowBorders + imgui.WindowFlags.AlwaysAutoResize)
            if imgui.Button(u8'Собеседование',imgui.ImVec2(342,20)) then end
            if imgui.Button(u8'Инвайт в орг',imgui.ImVec2(342,20)) then end
            if imgui.Button(u8'Увал',imgui.ImVec2(342,20)) then end
            if imgui.Button(u8'Выдать/снять выговор',imgui.ImVec2(342,20)) then end
            if imgui.Button(u8'Лекции',imgui.ImVec2(342,20)) then end
            if imgui.Button(u8'/expel',imgui.ImVec2(342,20)) then end
            if imgui.Button(u8'/gov',imgui.ImVec2(342,20)) then end
        imgui.End()
    end
end



--// icons/иконки //
local fa_font = nil
local fa_glyph_ranges = imgui.ImGlyphRanges({ fa.min_range, fa.max_range })
function imgui.BeforeDrawFrame()
    if fa_font == nil then
        local font_config = imgui.ImFontConfig() -- to use 'imgui.ImFontConfig.new()' on error
        font_config.MergeMode = true

        fa_font = imgui.GetIO().Fonts:AddFontFromFileTTF('moonloader/resource/fonts/fa-solid-900.ttf', 13.0, font_config, fa_glyph_ranges)
    end
end




--// загрузка скрипта //
function main()
    sampRegisterChatCommand('ms',call_window)
    sampRegisterChatCommand('ld',call_ldwindow)
    while true do
      wait(0)
      if wasKeyPressed(key.VK_INSERT)  then
      main_window.v = not main_window.v
      end
      if wasKeyPressed(key.VK_F1) then
      main_window.v = not main_window.v
      end 
      imgui.Process = main_window.v
      imgui.Process = mainlrds_windows.v
    end
end

--// call-windows //
function call_window()
    main_window.v = not main_window.v
    imgui.Process = main_window.v
end

--// call-ldwindows //
function call_ldwindow()
    mainlrds_window.v = not mainlrds_window.v
    imgui.Process = mainlrds_windows.v
end
Как выставить imgui.Text() по центру?
local sw, sh = getScreenResolution()
imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2 ))
Но меню появляется не совсем по середине экрана,как исправить?
 
Последнее редактирование:

NHacker1271

Известный
156
16
Как реализовать отправку сообщения не на сервер, не визуально, а как sendinput в ahk?