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

Smeruxa

Известный
1,294
680
Тогда ещё, если можешь помочь, там кликварп корявый стоит, при активном имгуи он начинает работать, не поможешь это исправить пожалуйста?
ты че сам вообще ни че не умеешь?
Lua:
function clickWarp()
    lua_thread.create(function()
        while true do
            if cursorEnabled then
                local mode = sampGetCursorMode()
                if mode == 0 then
                    showCursor(true)
                end
                local sx, sy = getCursorPos()
                local sw, sh = windowCoordinates[1], windowCoordinates[2]
                local color = join_argb(255, elements.colors.colorClickWarpText.r, elements.colors.colorClickWarpText.g, elements.colors.colorClickWarpText.b)
                if sx >= 0 and sy >= 0 and sx < sw and sy < sh then
                    local posX, posY, posZ = convertScreenCoordsToWorld3D(sx, sy, 700.0)
                    local camX, camY, camZ = getActiveCameraCoordinates()
                    local result, colpoint = processLineOfSight(camX, camY, camZ, posX, posY, posZ, true, true, false, true, false, false, false)
                    if result and colpoint.entity ~= 0 then
                        local normal = colpoint.normal
                        local pos = Vector3D(colpoint.pos[1], colpoint.pos[2], colpoint.pos[3]) - (Vector3D(normal[1], normal[2], normal[3]) * 0.1)
                        local zOffset = 300
                        if normal[3] >= 0.5 then zOffset = 1 end
                        local result, colpoint2 = processLineOfSight(pos.x, pos.y, pos.z + zOffset, pos.x, pos.y, pos.z - 0.3, true, true, false, true, false, false, false)
                        if result then
                            pos = Vector3D(colpoint2.pos[1], colpoint2.pos[2], colpoint2.pos[3] + 1)
                            local curX, curY, curZ  = getCharCoordinates(playerPed)
                            local dist              = getDistanceBetweenCoords3d(curX, curY, curZ, pos.x, pos.y, pos.z)
                            local hoffs             = renderGetFontDrawHeight(fonts.clickWarp)
                            sy = sy - 2
                            sx = sx - 2
                            renderFontDrawText(fonts.clickWarp, string.format("%0.2fm", dist), sx, sy - hoffs, color)
                            local tpIntoCar = nil
                            if colpoint.entityType == 2 then
                                local car = getVehiclePointerHandle(colpoint.entity)
                                if doesVehicleExist(car) and (not isCharInAnyCar(playerPed) or storeCarCharIsInNoSave(playerPed) ~= car) then
                                    displayVehicleName(sx, sy - hoffs * 2, getNameOfVehicleModel(getCarModel(car)))
                                    if isKeyDown(VK_RBUTTON) then
                                        tpIntoCar = car
                                    end
                                    renderFontDrawText(fonts.clickWarp, "Hold right mouse button to teleport into the car", sx, sy - hoffs * 3, color)
                                end
                            end
                            createPointMarker(pos.x, pos.y, pos.z)
                            if isKeyDown(VK_LBUTTON) then
                                if tpIntoCar then
                                    if not jumpIntoCar(tpIntoCar) then
                                        teleportPlayer(pos.x, pos.y, pos.z)
                                        local veh = storeCarCharIsInNoSave(playerPed)
                                        local cordsVeh = {getCarCoordinates(veh)}
                                        setCarCoordinates(veh, cordsVeh[1], cordsVeh[2], cordsVeh[3])
                                        cursorEnabled = false
                                        showCursor(false)
                                        removePointMarker()
                                        break
                                    end
                                else
                                    if isCharInAnyCar(playerPed) then
                                        local norm = Vector3D(colpoint.normal[1], colpoint.normal[2], 0)
                                        local norm2 = Vector3D(colpoint2.normal[1], colpoint2.normal[2], colpoint2.normal[3])
                                        rotateCarAroundUpAxis(storeCarCharIsInNoSave(playerPed), norm2)
                                        pos = pos - norm * 1.8
                                        pos.z = pos.z - 1.1
                                    end
                                    teleportPlayer(pos.x, pos.y, pos.z)
                                    cursorEnabled = false
                                    showCursor(false)
                                    removePointMarker()
                                    break
                                end
                                while isKeyDown(VK_LBUTTON) do wait(0) end
                                cursorEnabled = false
                                showCursor(false)
                                removePointMarker()
                                break
                            end
                        end
                    end
                end
            end
            wait(0)
            removePointMarker()
        end
        cursorEnabled = false
        showCursor(false)
        removePointMarker()
    end)
end

выйди из вопросов и забудь о программировании пожалуйста
 

MAHEKEH

Известный
1,989
494
ты че сам вообще ни че не умеешь?
Lua:
function clickWarp()
    lua_thread.create(function()
        while true do
            if cursorEnabled then
                local mode = sampGetCursorMode()
                if mode == 0 then
                    showCursor(true)
                end
                local sx, sy = getCursorPos()
                local sw, sh = windowCoordinates[1], windowCoordinates[2]
                local color = join_argb(255, elements.colors.colorClickWarpText.r, elements.colors.colorClickWarpText.g, elements.colors.colorClickWarpText.b)
                if sx >= 0 and sy >= 0 and sx < sw and sy < sh then
                    local posX, posY, posZ = convertScreenCoordsToWorld3D(sx, sy, 700.0)
                    local camX, camY, camZ = getActiveCameraCoordinates()
                    local result, colpoint = processLineOfSight(camX, camY, camZ, posX, posY, posZ, true, true, false, true, false, false, false)
                    if result and colpoint.entity ~= 0 then
                        local normal = colpoint.normal
                        local pos = Vector3D(colpoint.pos[1], colpoint.pos[2], colpoint.pos[3]) - (Vector3D(normal[1], normal[2], normal[3]) * 0.1)
                        local zOffset = 300
                        if normal[3] >= 0.5 then zOffset = 1 end
                        local result, colpoint2 = processLineOfSight(pos.x, pos.y, pos.z + zOffset, pos.x, pos.y, pos.z - 0.3, true, true, false, true, false, false, false)
                        if result then
                            pos = Vector3D(colpoint2.pos[1], colpoint2.pos[2], colpoint2.pos[3] + 1)
                            local curX, curY, curZ  = getCharCoordinates(playerPed)
                            local dist              = getDistanceBetweenCoords3d(curX, curY, curZ, pos.x, pos.y, pos.z)
                            local hoffs             = renderGetFontDrawHeight(fonts.clickWarp)
                            sy = sy - 2
                            sx = sx - 2
                            renderFontDrawText(fonts.clickWarp, string.format("%0.2fm", dist), sx, sy - hoffs, color)
                            local tpIntoCar = nil
                            if colpoint.entityType == 2 then
                                local car = getVehiclePointerHandle(colpoint.entity)
                                if doesVehicleExist(car) and (not isCharInAnyCar(playerPed) or storeCarCharIsInNoSave(playerPed) ~= car) then
                                    displayVehicleName(sx, sy - hoffs * 2, getNameOfVehicleModel(getCarModel(car)))
                                    if isKeyDown(VK_RBUTTON) then
                                        tpIntoCar = car
                                    end
                                    renderFontDrawText(fonts.clickWarp, "Hold right mouse button to teleport into the car", sx, sy - hoffs * 3, color)
                                end
                            end
                            createPointMarker(pos.x, pos.y, pos.z)
                            if isKeyDown(VK_LBUTTON) then
                                if tpIntoCar then
                                    if not jumpIntoCar(tpIntoCar) then
                                        teleportPlayer(pos.x, pos.y, pos.z)
                                        local veh = storeCarCharIsInNoSave(playerPed)
                                        local cordsVeh = {getCarCoordinates(veh)}
                                        setCarCoordinates(veh, cordsVeh[1], cordsVeh[2], cordsVeh[3])
                                        cursorEnabled = false
                                        showCursor(false)
                                        removePointMarker()
                                        break
                                    end
                                else
                                    if isCharInAnyCar(playerPed) then
                                        local norm = Vector3D(colpoint.normal[1], colpoint.normal[2], 0)
                                        local norm2 = Vector3D(colpoint2.normal[1], colpoint2.normal[2], colpoint2.normal[3])
                                        rotateCarAroundUpAxis(storeCarCharIsInNoSave(playerPed), norm2)
                                        pos = pos - norm * 1.8
                                        pos.z = pos.z - 1.1
                                    end
                                    teleportPlayer(pos.x, pos.y, pos.z)
                                    cursorEnabled = false
                                    showCursor(false)
                                    removePointMarker()
                                    break
                                end
                                while isKeyDown(VK_LBUTTON) do wait(0) end
                                cursorEnabled = false
                                showCursor(false)
                                removePointMarker()
                                break
                            end
                        end
                    end
                end
            end
            wait(0)
            removePointMarker()
        end
        cursorEnabled = false
        showCursor(false)
        removePointMarker()
    end)
end


выйди из вопросов и забудь о программировании пожалуйста
перенаправляй его сюда https://www.blast.hk/threads/18157/ и всё


Вопрос по данной теме
как мне вывести число в имгуи окошко из ini Файла, ну или хотя бы готовую переменную с числом?
Код:
imgui.Text(u8"Ваше число удачи: ", INI.Settings.Number) пробовал так

imgui.Text(u8"Ваше число удачи: ", Number) и вот так

подозреваю что дело в % но как что чего в луа, пока плаваю
 
  • Влюблен
  • Нравится
Реакции: Shepi и Smeruxa

Smeruxa

Известный
1,294
680
перенаправляй его сюда https://www.blast.hk/threads/18157/ и всё


Вопрос по данной теме
как мне вывести число в имгуи окошко из ini Файла, ну или хотя бы готовую переменную с числом?
Код:
imgui.Text(u8"Ваше число удачи: ", INI.Settings.Number) пробовал так

imgui.Text(u8"Ваше число удачи: ", Number) и вот так

подозреваю что дело в % но как что чего в луа, пока плаваю
imgui.Text(u8"Ваше число удачи: "..INI.Settings.Number)
 
  • Bug
Реакции: MAHEKEH

Gorskin

I shit on you
Проверенный
1,246
1,039
Имеется адрес памяти
Lua:
memory.fill(0x7178F0, 0x90, 5, true)
который отключает полосы в небе от самолетов, как мне включить потом эти полосы обратно? что нужно вписать вместо 0x90 и где брать значения для адресов памяти?
 
D

deleted-user-422095

Гость
Имеется адрес памяти
Lua:
memory.fill(0x7178F0, 0x90, 5, true)
который отключает полосы в небе от самолетов, как мне включить потом эти полосы обратно? что нужно вписать вместо 0x90 и где брать значения для адресов памяти?
Прочитай адрес до отключения, переведи в hex(не обязательно) и вот тебе включение
Upd
Точнее так memory.tohex
 

СоМиК

Известный
457
310
Подключил FaIcons, но почему то вместо иконок вопросики
1632412689561.png
1632412699799.png

UPD: нашел проблему, связана была с тем, что стоял доп шрифт через pushfont, но возможно ли как то объединить шрифты? Чтобы и иконки и шрифт был сразу

Снова UPD: решил проблему, на самом деле я думал, что этот говнокод не сработает
1632413025048.png


XDD
 
Последнее редактирование:

MAHEKEH

Известный
1,989
494
возможно ли сделать постоянную проверку ?
у меня допустим есть такой код

Код:
                    while true do
                     wait(0)
                    
                     if testCheat("z") then state = not state end -- или клавиша, не столь важно

                     if state then sampAddChatMessage("Ничего важного", -1) --- end

                     wait(99999) -- из-за задержки мне не переключить state на false

                     --- т.е пока не пройдет 99999 мс деактивировать не выйдет
                                        
                                        end
                                        end
                                        end
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,767
11,220
возможно ли сделать постоянную проверку ?
у меня допустим есть такой код

Код:
                    while true do
                     wait(0)
                   
                     if testCheat("z") then state = not state end -- или клавиша, не столь важно

                     if state then sampAddChatMessage("Ничего важного", -1) --- end

                     wait(99999) -- из-за задержки мне не переключить state на false

                     --- т.е пока не пройдет 99999 мс деактивировать не выйдет
                                       
                                        end
                                        end
                                        end
Lua:
local active = false

function main()
    while not isSampAvailable() do wait(0) end
    func()
    while true do
        wait(0)
        if testCheat('z') then active = not active end
    end
end

function func()
    lua_thread.create(function()
        while true do
            wait(9999)
            if active then
                --code
            end
        end
    end)
end
 
  • Нравится
Реакции: MAHEKEH

DedPoet

Участник
98
18
1632423415034.png

Как убрать угол этот который под тайтлом? или сделать его прозрачным

code:
function apply_custom_style()
    imgui.SwitchContext()

    style.WindowRounding = 2.0
    style.WindowTitleAlign = imgui.ImVec2(0.5, 0.84)
    style.ChildWindowRounding = 2.0
    style.FrameRounding = 2.0
    style.WindowPadding = imgui.ImVec2(0.0, 0.0)
    style.ScrollbarSize = 13.0
    style.ScrollbarRounding = 0
    style.GrabMinSize = 8.0
    style.GrabRounding = 1.0

    colors[clr.FrameBg]                = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.FrameBgHovered]         = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.FrameBgActive]          = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.TitleBg]                = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.TitleBgActive]          = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.TitleBgCollapsed]       = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.CheckMark]              = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.SliderGrab]             = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.SliderGrabActive]       = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.Button]                 = ImVec4(0.26, 0.59, 0.98, 0.40)
    colors[clr.ButtonHovered]          = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.ButtonActive]           = ImVec4(0.06, 0.53, 0.98, 1.00)
    colors[clr.Header]                 = ImVec4(0.26, 0.59, 0.98, 0.31)
    colors[clr.HeaderHovered]          = ImVec4(0.26, 0.59, 0.98, 0.80)
    colors[clr.HeaderActive]           = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.Separator]              = colors[clr.Border]
    colors[clr.SeparatorHovered]       = ImVec4(0.26, 0.59, 0.98, 0.78)
    colors[clr.SeparatorActive]        = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.ResizeGrip]             = ImVec4(0.26, 0.59, 0.98, 0.25)
    colors[clr.ResizeGripHovered]      = ImVec4(0.26, 0.59, 0.98, 0.67)
    colors[clr.ResizeGripActive]       = ImVec4(0.26, 0.59, 0.98, 0.95)
    colors[clr.TextSelectedBg]         = ImVec4(0.26, 0.59, 0.98, 0.35)
    colors[clr.Text]                   = ImVec4(1.00, 1.00, 1.00, 1.00)
    colors[clr.TextDisabled]           = ImVec4(0.50, 0.50, 0.50, 1.00)
    colors[clr.WindowBg]               = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.ChildWindowBg]          = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.PopupBg]                = ImVec4(0.08, 0.08, 0.08, 0.94)
    colors[clr.ComboBg]                = colors[clr.PopupBg]
    colors[clr.Border]                 = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.BorderShadow]           = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.MenuBarBg]              = ImVec4(0.14, 0.14, 0.14, 0.94)
    colors[clr.ScrollbarBg]            = ImVec4(0.02, 0.02, 0.02, 0.53)
    colors[clr.ScrollbarGrab]          = ImVec4(0.31, 0.31, 0.31, 1.00)
    colors[clr.ScrollbarGrabHovered]   = ImVec4(0.41, 0.41, 0.41, 1.00)
    colors[clr.ScrollbarGrabActive]    = ImVec4(0.51, 0.51, 0.51, 1.00)
    colors[clr.CloseButton]            = ImVec4(0.41, 0.41, 0.41, 0.50)
    colors[clr.CloseButtonHovered]     = ImVec4(0.98, 0.39, 0.36, 1.00)
    colors[clr.CloseButtonActive]      = ImVec4(0.98, 0.39, 0.36, 1.00)
    colors[clr.PlotLines]              = ImVec4(0.61, 0.61, 0.61, 1.00)
    colors[clr.PlotLinesHovered]       = ImVec4(1.00, 0.43, 0.35, 1.00)
    colors[clr.PlotHistogram]          = ImVec4(0.90, 0.70, 0.00, 1.00)
    colors[clr.PlotHistogramHovered]   = ImVec4(1.00, 0.60, 0.00, 1.00)
    colors[clr.ModalWindowDarkening]   = ImVec4(0.80, 0.80, 0.80, 0.35)
end
 
Последнее редактирование:

MAHEKEH

Известный
1,989
494
Как сделать обводку imgui.Button?
style.FrameBorderSize = 1.0

ха, да ладно, только хотел тоже самое узнать
как это правильно добавить чтоб работало ?
Код:
imgui.SwitchContext()
local style = imgui.GetStyle()
local colors = style.Colors
local clr = imgui.Col
local ImVec4 = imgui.ImVec4
local ImVec4 = imgui.ImVec4
local ImVec2 = imgui.ImVec2
    
        style.WindowPadding       = ImVec2(9, 7)
        style.WindowRounding      = 4
        style.ChildWindowRounding = 2
        style.FramePadding        = ImVec2(11, 2)
        style.FrameRounding       = 2
        style.ItemSpacing         = ImVec2(4, 5)
        style.TouchExtraPadding   = ImVec2(0, 0)
        style.IndentSpacing       = 21
        style.ScrollbarSize       = 15
        style.ScrollbarRounding   = 0
        style.GrabMinSize         = 9
        style.GrabRounding        = 1
        style.WindowTitleAlign    = ImVec2(0.5, 0.5)
        style.ButtonTextAlign     = ImVec2(0.5, 0.5)
        style.FrameBorderSize     = 1.0 -- добавил и перестало работать, чего не хватает?