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

why ega

РП игрок
Модератор
2,556
2,248
Lua:
local imgui = require 'imgui'

local key = require 'vkeys'

img2 = imgui.CreateTextureFromFile(getGameDirectory() .. "\\moonloader\\ft\\2.jpg")



--- imgui STUFF

local slider = imgui.ImInt(50)

local drive = imgui.ImBool(false)

local draiv = imgui.ImBuffer(256)

local menu = 0







local main_window_state = imgui.ImBool(false)

function imgui.OnDrawFrame()

    if main_window_state.v then

    imgui.SetNextWindowSize(imgui.ImVec2(700, 189), imgui.Cond.FirstUseEver)

    imgui.PushStyleVar(imgui.StyleVar.WindowPadding, imgui.ImVec2(12, 8))

 

    imgui.Begin('AUTO VAZIAVIMAS 2.0', main_window_state, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize)

    imgui.BeginChild('##main_menu', imgui.ImVec2(330, 149), true)

    if imgui.Checkbox('IJUNGIMAS', drive) then

    if isCharSittingInAnyCar(PLAYER_PED) then

        if  drive.v then

            sampAddChatMessage('{FB7B1F}[AUTO VAZIAVIMAS 2.0]{FFFFFF}:  ijungtas.', -1)

        else

            sampAddChatMessage('{FB7B1F}[AUTO VAZIAVIMAS 2.0]{FFFFFF}:  isjungtas.', -1)

            clearCharTasks(PLAYER_PED) taskWarpCharIntoCarAsDriver(PLAYER_PED, storeCarCharIsInNoSave(PLAYER_PED))

        end

    else

        sampAddChatMessage('{FB7B1F}[AUTO VAZIAVIMAS 2.0]{FFFFFF}: Seskite i masina.', -1)

    end

end

imgui.SameLine()

if imgui.Button('VAZIAVIMO BUDAI') then menu = 1 end

imgui.SameLine()

imgui.Text('tuzas#7109')



imgui.SliderInt('Greitis', slider, 10, 150)

imgui.Text('IVESKITE VAZIAVIMO BUDA')

imgui.InputText(' ', draiv)

imgui.EndChild()

imgui.SameLine()

imgui.BeginChild('##main_', imgui.ImVec2(338, 149), true)

img = img2

imgui.Image(img, imgui.ImVec2(318, 129))

if menu ==1 then

    imgui.Text(' 0 - stopping at traffic lights and in front of cars\n 5 - stopping at traffic lights and avoiding cars\n 2 - passing traffic lights and avoiding cars\n 4 - passing traffic lights and stopping in front of cars\n 7 - driving strictly on the road passing traffic lights and \n not stopping goes "through" cars')

end

    imgui.EndChild()

    imgui.End()

    imgui.PopStyleVar(1)

  end

end







function main()

    if not isSampfuncsLoaded() or not isSampLoaded() then return end

    while not isSampAvailable() do wait(100) end

    sampAddChatMessage('{FB7B1F}[[AUTO VAZIAVIMAS 2.0]]{FFFFFF}: uzloadintas.', -1)

    sampAddChatMessage('{FB7B1F}[[AUTO VAZIAVIMAS 2.0]]{FFFFFF}: tuzas#7109.', -1)

    sampRegisterChatCommand('ttt', function() X,Y,Z = getCharCoordinates(PLAYER_PED) print(X..', '..Y..', '..Z) end)

    sampRegisterChatCommand('marker', ChangeScriptStatee)

 

    while true do wait(0)    

        if not sampIsChatInputActive() and not sampIsDialogActive()

            main_window_state.v = not main_window_state.v

        end

        imgui.Process = main_window_state.v

                if drive.v then

                    coords, posX, posY, posZ = getTargetBlipCoordinates()

                    z = getGroundZFor3dCoord(posX, posY, posZ)

                    taskCarDriveToCoord(PLAYER_PED, -1,  posX, posY,posZ, (slider.v), 0, null, draiv.v)

                end

            end

        end

         



        function apply_custom_style()

            imgui.SwitchContext()

            local style = imgui.GetStyle()

            local colors = style.Colors

            local clr = imgui.Col

            local ImVec4 = imgui.ImVec4

            local ImVec2 = imgui.ImVec2

       

             style.WindowPadding = ImVec2(15, 15)

             style.WindowRounding = 15.0

             style.FramePadding = ImVec2(5, 5)

             style.ItemSpacing = ImVec2(12, 8)

             style.ItemInnerSpacing = ImVec2(8, 6)

             style.IndentSpacing = 25.0

             style.ScrollbarSize = 15.0

             style.ScrollbarRounding = 15.0

             style.GrabMinSize = 15.0

             style.GrabRounding = 7.0

             style.ChildWindowRounding = 8.0

             style.FrameRounding = 6.0

         

       

               colors[clr.Text] = ImVec4(0.95, 0.96, 0.98, 1.00)

               colors[clr.TextDisabled] = ImVec4(0.36, 0.42, 0.47, 1.00)

               colors[clr.WindowBg] = ImVec4(0.11, 0.15, 0.17, 1.00)

               colors[clr.ChildWindowBg] = ImVec4(0.15, 0.18, 0.22, 1.00)

               colors[clr.PopupBg] = ImVec4(0.08, 0.08, 0.08, 0.94)

               colors[clr.Border] = ImVec4(0.43, 0.43, 0.50, 0.50)

               colors[clr.BorderShadow] = ImVec4(0.00, 0.00, 0.00, 0.00)

               colors[clr.FrameBg] = ImVec4(0.20, 0.25, 0.29, 1.00)

               colors[clr.FrameBgHovered] = ImVec4(0.12, 0.20, 0.28, 1.00)

               colors[clr.FrameBgActive] = ImVec4(0.09, 0.12, 0.14, 1.00)

               colors[clr.TitleBg] = ImVec4(0.09, 0.12, 0.14, 0.65)

               colors[clr.TitleBgCollapsed] = ImVec4(0.00, 0.00, 0.00, 0.51)

               colors[clr.TitleBgActive] = ImVec4(0.08, 0.10, 0.12, 1.00)

               colors[clr.MenuBarBg] = ImVec4(0.15, 0.18, 0.22, 1.00)

               colors[clr.ScrollbarBg] = ImVec4(0.02, 0.02, 0.02, 0.39)

               colors[clr.ScrollbarGrab] = ImVec4(0.20, 0.25, 0.29, 1.00)

               colors[clr.ScrollbarGrabHovered] = ImVec4(0.18, 0.22, 0.25, 1.00)

               colors[clr.ScrollbarGrabActive] = ImVec4(0.09, 0.21, 0.31, 1.00)

               colors[clr.ComboBg] = ImVec4(0.20, 0.25, 0.29, 1.00)

               colors[clr.CheckMark] = ImVec4(0.28, 0.56, 1.00, 1.00)

               colors[clr.SliderGrab] = ImVec4(0.28, 0.56, 1.00, 1.00)

               colors[clr.SliderGrabActive] = ImVec4(0.37, 0.61, 1.00, 1.00)

               colors[clr.Button] = ImVec4(0.20, 0.25, 0.29, 1.00)

               colors[clr.ButtonHovered] = ImVec4(0.28, 0.56, 1.00, 1.00)

               colors[clr.ButtonActive] = ImVec4(0.06, 0.53, 0.98, 1.00)

               colors[clr.Header] = ImVec4(0.20, 0.25, 0.29, 0.55)

               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.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.06, 0.05, 0.07, 1.00)

               colors[clr.CloseButton] = ImVec4(0.40, 0.39, 0.38, 0.16)

               colors[clr.CloseButtonHovered] = ImVec4(0.40, 0.39, 0.38, 0.39)

               colors[clr.CloseButtonActive] = ImVec4(0.40, 0.39, 0.38, 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.TextSelectedBg] = ImVec4(0.25, 1.00, 0.00, 0.43)

               colors[clr.ModalWindowDarkening] = ImVec4(1.00, 0.98, 0.95, 0.73)

         end

         apply_custom_style()

[22:14:34.325838] (system) Loading script 'C:\Users\sv47\OneDrive\Desktop\ad\moonloader\auto vaziavimas.lua'...
[22:14:34.325838] (debug) New script: 06C5FC6C
[22:14:34.325838] (error) auto vaziavimas.lua: ...sva47\OneDrive\Desktop\ad\moonloader\auto vaziavimas.lua:76: 'then' expected near 'main_window_state'
В 131 строке "then" забыл
 

Corrygan228

Участник
132
9
Как убрать эту херню, для изменения размера окна, если у меня стоит флаг imgui.WindowFlags.NoResize
Lua:
if imgui.Button(u8'Сбросить настройки', imgui.ImVec2(150, 40)) then
    imgui.OpenPopup(u8'Подтверждение')
end
if imgui.BeginPopupModal(u8'Подтверждение', imgui.WindowFlags.NoResize) then
    imgui.SetNextWindowPos(imgui.ImVec2(x / 2, y / 2), imgui.ImVec2(0.5, 0.5))
    imgui.SetWindowSize(imgui.ImVec2(350, 150))
    imgui.CenterText(u8'Вы уверены, что хотите сбросить все настройки?')
    imgui.SetCursorPosX(30)
    if imgui.Button(u8'Да', imgui.ImVec2(130, 40)) then
        iniReset()
        jsonReset()
        thisScript():reload()
    end
    imgui.SameLine()
    imgui.SetCursorPosX(190)
    if imgui.Button(u8'Нет', imgui.ImVec2(130, 40)) then
        imgui.CloseCurrentPopup()
    end
    imgui.EndPopup()
end
Screenshot_7.png
 

Andrinall

Известный
680
532
Как убрать эту херню, для изменения размера окна, если у меня стоит флаг imgui.WindowFlags.NoResize
Lua:
if imgui.Button(u8'Сбросить настройки', imgui.ImVec2(150, 40)) then
    imgui.OpenPopup(u8'Подтверждение')
end
if imgui.BeginPopupModal(u8'Подтверждение', imgui.WindowFlags.NoResize) then
    imgui.SetNextWindowPos(imgui.ImVec2(x / 2, y / 2), imgui.ImVec2(0.5, 0.5))
    imgui.SetWindowSize(imgui.ImVec2(350, 150))
    imgui.CenterText(u8'Вы уверены, что хотите сбросить все настройки?')
    imgui.SetCursorPosX(30)
    if imgui.Button(u8'Да', imgui.ImVec2(130, 40)) then
        iniReset()
        jsonReset()
        thisScript():reload()
    end
    imgui.SameLine()
    imgui.SetCursorPosX(190)
    if imgui.Button(u8'Нет', imgui.ImVec2(130, 40)) then
        imgui.CloseCurrentPopup()
    end
    imgui.EndPopup()
end
Посмотреть вложение 181853
_Bool igBeginPopupModal(const char* name, _Bool *p_open, ImGuiWindowFlags flags);

Ты пытаешься сунуть флаг как указатель на boolean переменную.
Попробуй хотя бы так.
if imgui.BeginPopupModal(u8'Подтверждение', _, imgui.WindowFlags.NoResize) then
 

why ega

РП игрок
Модератор
2,556
2,248
Как отправить серверу через синхру, шо я прицелился (нажал ПКМ)?
 

Corrygan228

Участник
132
9
Есть биндер, в котором можно создавать строки и удалять их, как сохранить их кол-во, если переменные для каждого инпута записаны в массиве?
Например по стандарту у меня записано 3 строки, я добавил одну и обновил скрипт, их снова стало 3, как правильно сохранить их кол-во в inicfg или json?
Lua:
local drugs_binds = {
    imgui.ImBuffer(256),
    imgui.ImBuffer(256),
    imgui.ImBuffer(256)
}

imgui.BeginChild('##drugs_use_binds', imgui.ImVec2(520, 375), false)
    for i, j in ipairs(drugs_binds) do
        imgui.InputText(u8'Строка №' .. tostring(i), j)
    end
    imgui.SameLine()
    if imgui.Button('+', imgui.ImVec2(25, 25)) then
        table.insert(drugs_binds, imgui.ImBuffer(256))
    end
    imgui.SameLine()
    if imgui.Button('-', imgui.ImVec2(25, 25)) then
        table.remove(drugs_binds)
    end
imgui.EndChild()
up
 

qdIbp

Автор темы
Проверенный
1,387
1,142
Lua:
local inicfg = require('inicfg')
local imgui = require('imgui')

local encoding = require('encoding')
encoding.default = 'CP1251'
u8 = encoding.UTF8

local iniName = 'ini.ini'
local xz = imgui.ImBool(false)

local drugs_binds = inicfg.load(nil,iniName)
local drugs_binds = inicfg.load({
    main = {
        'text1','text2','text3'
    }
},iniName)

for i = 1, #drugs_binds.main do
    _G['bind_'..i] = imgui.ImBuffer(''..drugs_binds.main[i],256)
end

function imgui.OnDrawFrame()
    if xz.v then
        imgui.Begin('xz',xz)
            imgui.BeginChild('##drugs_use_binds', imgui.ImVec2(520, 375), false)
                for i = 1, #drugs_binds.main do
                    if imgui.InputText(u8'Строка №' ..tostring(i), _G['bind_'..i])then
                        drugs_binds.main[i] = _G['bind_'..i].v
                        inicfg.save(drugs_binds,iniName)
                    end
                end
                if imgui.Button('+', imgui.ImVec2(25, 25)) then
                    local stage = #drugs_binds.main+1
                    drugs_binds.main[stage] = 'text'..stage
                    _G['bind_'..stage] = imgui.ImBuffer(drugs_binds.main[stage],256)
                    inicfg.save(drugs_binds,iniName)
                end
                imgui.SameLine()
                if imgui.Button('-', imgui.ImVec2(25, 25)) then
                    _G[#drugs_binds] = nil
                    table.remove(drugs_binds.main)
                    inicfg.save(drugs_binds,iniName)
                end
            imgui.EndChild()
        imgui.End()
    end
end

function main()
    while true do wait(0)
        imgui.Process = xz.v
        if wasKeyPressed(33) then--page up
            xz.v = not xz.v
        end
    end
end
 

whybronya

Новичок
6
2
Пишу свой первый скрипт для евольв рп, суть в том что он пишет в фракционный чат сколько кд на ограбление аммо, но не знаю как вывести таймер, подскажите
1671286023982.png
 
Последнее редактирование:

why ega

РП игрок
Модератор
2,556
2,248
Пишу свой первый скрипт для евольв рп, суть в том что он пишет в фракционный чат сколько кд на ограбление аммо, но не знаю как вывести таймер, подскажите Посмотреть вложение 182037
так понял тебя?
Lua:
local ev = require("lib.samp.events")

function ev.onServerMessage(color, text)
    if text:find("До следующего ограбления %d+:%d+") then
        local hour, minute = text:match("До следующего ограбления (%d+):(%d+)")
        sampAddChatMessage(hour .. ":" .. minute, -1)
    end
end

мб тупой вопрос, но почему сука не работает?
Lua:
local _, ped = sampGetCharHandleBySampPlayerId(config.attack_input[0])
Код:
attempt to call global 'sampGetCharSampIdByHandle' (a nil value)
 
Последнее редактирование:
  • Влюблен
Реакции: whybronya

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
мб тупой вопрос, но почему сука не работает?
То, что ты пишешь и то, на что указывает консоль - 2 разные функции. Причём второй функции не существует. Ошибся, может?)
 
  • Нравится
Реакции: why ega

why ega

РП игрок
Модератор
2,556
2,248
То, что ты пишешь и то, на что указывает консоль - 2 разные функции. Причём второй функции не существует. Ошибся, может?)
мне по ид над хендл получить

А, все, я чет тупой, не туда смотрел..

Пытаюсь отправить на серв то, что я кого-то резанул ножом, но выглядит как обычный удар, как можно пофиксить аим синхру (или в чем дело)?
Lua:
local px, py, pz = getCharCoordinates(ped)
local b = 0 * math.pi / 360.0
local h = 0 * math.pi / 360.0
local angle = getCharHeading(ped)
local a = angle * math.pi / 360.0
local c1, c2, c3 = math.cos(h), math.cos(a), math.cos(b)
local s1, s2, s3 = math.sin(h), math.sin(a), math.sin(b)
local data = mb.getPlayerData()
local aim = mb.getAimData()
if math.random(0, 1) == 1 then data.keysData = 128 end
if math.random(0, 1) == 1 then data.keysData = 4 end                                              
data.position.x, data.position.y, data.position.z = get_coil_pos(ped, -0.7)
data.quaternion.w = c1 * c2 * c3 - s1 * s2 * s3
data.quaternion.z = -( c1 * s2 * c3 - s1 * c2 * s3 )
aim.camMode = 4
aim.camFront.x, aim.camFront.y, aim.camFront.z = -0.8, -0.5, -0.2
aim.camPos.x, aim.camPos.y, aim.camPos.z = getBodyPartCoordinates(7, ped)
data.weapon = 4
bot.handle:sendAimData(aim)
bot.handle:sendPlayerData(data)

function getBodyPartCoordinates(id, handle)
    local pedptr = getCharPointer(handle)
    local vec = ffi.new("float[3]")
    getBonePosition(ffi.cast("void*", pedptr), vec, id, true)
    return vec[0], vec[1], vec[2]
end
 
Последнее редактирование:

why ega

РП игрок
Модератор
2,556
2,248
Как сделать так, чтобы если строка больше допустим 256 символов, то она обрезалась и переносилась в другой imgui.Text()?