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

NoName_001

Участник
152
21
Встал в афк - вышел - пришли все сообщения от сервера за время, которое я был в афк. Мне нужно сделать так, чтобы onServerMessage не работал после афк(т.е. скрипт не должен видеть те сообщения, которые пришли за время паузы). Как это оформить?
 

CaJlaT

Овощ
Модератор
2,806
2,614
Встал в афк - вышел - пришли все сообщения от сервера за время, которое я был в афк. Мне нужно сделать так, чтобы onServerMessage не работал после афк(т.е. скрипт не должен видеть те сообщения, которые пришли за время паузы). Как это оформить?
Lua:
if not isGamePaused() then
    --code
end
 

kizn

О КУ)))
Всефорумный модератор
2,405
2,060
функцию нашёл на blasthack wiki.
Сообщения приходят после отмены паузы, а не во время ее.
код:
Lua:
function s.onServerMessage(color, text)
    if not isGamePaused() then
        if text:find('тута мой текст') then
            print('принт для примера и он выводится в лог.')
        end
    end
end

попробуй сначала if text:find('тута мой текст') then, потом if not isGamePaused() then
 

NoName_001

Участник
152
21
попробуй сначала if text:find('тута мой текст') then, потом if not isGamePaused() then
Смысла нет, если я вижу эти сообщения, то я точно не АФК. Сделал криво, что при получении сообщения к переменной прибавляется 50. При значении переменной выше 400 текст не ищется.
 

MrBidloKoder

Известный
425
248
Есть нормальные подсказки функций для VS code? Сколько бы не лазил по инету ничего не нашёл. Может быть у кого-то есть? Ну типо чтобы не ебать мозги себе и заходить за каждой функцией в вики.
 

darkjer

Активный
134
68
Есть нормальные подсказки функций для VS code? Сколько бы не лазил по инету ничего не нашёл. Может быть у кого-то есть? Ну типо чтобы не ебать мозги себе и заходить за каждой функцией в вики.
 

enyag

Известный
345
12
почему код не робит? после релога не выводит то, что в textdraw1 и textdraw2
Lua:
        if third_window_state.v then
            local sw, sh = getScreenResolution()
            imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.CondFirstUseEver, imgui.ImVec2(0.5, 0.5))
            imgui.SetNextWindowSize(imgui.ImVec2(1250, 343), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"Смена лого и ника", third_window_state, imgui.WindowFlags.NoResize)
        imgui.InputText(u8'Введите первый текстдрав(Pears)', pearsBufferText)
        imgui.InputText(u8'Введите второй текстдрав(Project)', projectBufferText)
        pears = pearsBufferText.v
        project = projectBufferText.v
        imgui.Text(u8'Сейчас вы можете выбрать подходящий цвет для вашего лого.\nОчень жаль что так мало цветов, но что есть, то есть :(')
        if imgui.CollapsingHeader(u8'Цвета первого текстдрава(Pears)', imgui.ImVec2(100, 50)) then
            if imgui.ColorEdit3(u8'Выбор цвета 1 текстдрава', colortd) then
                clrtd = join_argb(0, colortd.v[1] * 255, colortd.v[2] * 255, colortd.v[3] * 255)
                local x1, y1 = sampTextdrawGetLetterSizeAndColor(2)
                local newcolortd = '0xFF' .. ('%06X'):format(clrtd)
                sampTextdrawSetLetterSizeAndColor(2, x1, y1, newcolortd)
            end
    end
        if imgui.CollapsingHeader(u8'Цвета второго текстдрава(Project)', imgui.ImVec2(100, 50)) then
            imgui.SameLine()
            imgui.TextQuestion(u8'Позволяет изменить цвет первого текстдрава')
            if imgui.ColorEdit3(u8'Выбор цвета 2 текстдрава', colortd_2) then
                clrtd_2 = join_argb(0, colortd_2.v[1] * 255, colortd_2.v[2] * 255, colortd_2.v[3] * 255)
                local x2, y2 = sampTextdrawGetLetterSizeAndColor(3)
                local newcolortd = '0xFF' .. ('%06X'):format(clrtd_2)
                sampTextdrawSetLetterSizeAndColor(3, x2, y2, newcolortd)
            end



if imgui.Button(u8'Сохранить', imgui.ImVec2(90, 25)) then
                mainIni.textdraws.textdraw1 = pears
                mainIni.textdraws.textdraw2 = project
                if inicfg.save(mainIni, directIni) then
                end
                if sampTextdrawIsExists(2) and sampTextdrawIsExists(3) then
                    sampTextdrawSetString(2, mainIni.textdraws.textdraw1)
                    sampTextdrawSetString(3, mainIni.textdraws.textdraw2)
                    sampAddChatMessage("Успешно сохранено, первый текстдрав "..mainIni.textdraws.textdraw1..". Второй текстдрав "..mainIni.textdraws.textdraw2, -1)
                end
            end
up
 

S-Sirius

Известный
353
21
Как можно делать в imgui так, чтобы при нажатие на любой из этих кнопок в нижнем меню появился определённый текст, кнопка и т.д.?
1599326786610.png

Lua:
imgui.BeginMenuBar()
            if imgui.BeginMenu(fa.ICON_TV.."  "..u8"РАБ. СТОЛ") then
                --
                imgui.EndMenu()
            end
            if imgui.BeginMenu(fa.ICON_UNIVERSAL_ACCESS.."  "..u8"ВОЗМОЖНОСТИ") then
                --
                imgui.EndMenu()
            end
            if imgui.BeginMenu(fa.ICON_TERMINAL.."  "..u8"КОМАНДЫ") then
                imgui.MenuItem("Simple layout")
                imgui.MenuItem("Property editor")
                imgui.EndMenu()
            end
            if imgui.BeginMenu(fa.ICON_COGS.."  "..u8"НАСТРОЙКИ") then
                --
                imgui.EndMenu()
            end
            imgui.SameLine(null, 150)
            if imgui.BeginMenu(fa.ICON_POWER_OFF) then
                if imgui.MenuItem(fa.ICON_POWER_OFF..u8"  Завершить работы") then
                    sampSetChatDisplayMode(2)
                    setAudioStreamState(notebook, as_action.PLAY)
                    setAudioStreamVolume(notebook, 100)
                    lockPlayerControl(false)
                    showCursor(false, false)
                    imgui.Process = false
                    main_window_state.v = not main_window_state.v end
                if imgui.MenuItem(fa.ICON_REDO..u8"  Перезагрузка") then
                    sampSetChatDisplayMode(2)
                    lockPlayerControl(false)
                    showCursor(false, false)
                    thisScript():reload() end
                imgui.EndMenu()
            end
        imgui.EndMenuBar()
 

|DEVIL|

Известный
359
273
Как переместить следующий элемент имгуи на ту же строчку?
1599327313554.png
 

Demmy

Участник
121
22
Как можно делать в imgui так, чтобы при нажатие на любой из этих кнопок в нижнем меню появился определённый текст, кнопка и т.д.?
Посмотреть вложение 67938
Lua:
imgui.BeginMenuBar()
            if imgui.BeginMenu(fa.ICON_TV.."  "..u8"РАБ. СТОЛ") then
                --
                imgui.EndMenu()
            end
            if imgui.BeginMenu(fa.ICON_UNIVERSAL_ACCESS.."  "..u8"ВОЗМОЖНОСТИ") then
                --
                imgui.EndMenu()
            end
            if imgui.BeginMenu(fa.ICON_TERMINAL.."  "..u8"КОМАНДЫ") then
                imgui.MenuItem("Simple layout")
                imgui.MenuItem("Property editor")
                imgui.EndMenu()
            end
            if imgui.BeginMenu(fa.ICON_COGS.."  "..u8"НАСТРОЙКИ") then
                --
                imgui.EndMenu()
            end
            imgui.SameLine(null, 150)
            if imgui.BeginMenu(fa.ICON_POWER_OFF) then
                if imgui.MenuItem(fa.ICON_POWER_OFF..u8"  Завершить работы") then
                    sampSetChatDisplayMode(2)
                    setAudioStreamState(notebook, as_action.PLAY)
                    setAudioStreamVolume(notebook, 100)
                    lockPlayerControl(false)
                    showCursor(false, false)
                    imgui.Process = false
                    main_window_state.v = not main_window_state.v end
                if imgui.MenuItem(fa.ICON_REDO..u8"  Перезагрузка") then
                    sampSetChatDisplayMode(2)
                    lockPlayerControl(false)
                    showCursor(false, false)
                    thisScript():reload() end
                imgui.EndMenu()
            end
        imgui.EndMenuBar()
Lua:
local desktop = true-- в самом начале
local features = false

imgui.BeginMenuBar()
            if imgui.BeginMenu(fa.ICON_TV.."  "..u8"РАБ. СТОЛ") then
                desktop = not desktop -- или desktop = true
                imgui.EndMenu()
            end
            if imgui.BeginMenu(fa.ICON_UNIVERSAL_ACCESS.."  "..u8"ВОЗМОЖНОСТИ") then
                features = not features -- аналогично
                imgui.EndMenu()
            end
            if imgui.BeginMenu(fa.ICON_TERMINAL.."  "..u8"КОМАНДЫ") then
                imgui.MenuItem("Simple layout")
                imgui.MenuItem("Property editor")
                imgui.EndMenu()
            end
            if imgui.BeginMenu(fa.ICON_COGS.."  "..u8"НАСТРОЙКИ") then
                --
                imgui.EndMenu()
            end
            imgui.SameLine(null, 150)
            if imgui.BeginMenu(fa.ICON_POWER_OFF) then
                if imgui.MenuItem(fa.ICON_POWER_OFF..u8"  Завершить работы") then
                    sampSetChatDisplayMode(2)
                    setAudioStreamState(notebook, as_action.PLAY)
                    setAudioStreamVolume(notebook, 100)
                    lockPlayerControl(false)
                    showCursor(false, false)
                    imgui.Process = false
                    main_window_state.v = not main_window_state.v end
                if imgui.MenuItem(fa.ICON_REDO..u8"  Перезагрузка") then
                    sampSetChatDisplayMode(2)
                    lockPlayerControl(false)
                    showCursor(false, false)
                    thisScript():reload() end
                imgui.EndMenu()
            end
        imgui.EndMenuBar()
        if desktop then
            -- code
        elseif features then
            -- code
        end
Как варик
 
  • Нравится
Реакции: S-Sirius