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

goodflex

Активный
280
57
Что за ошибка?

[ML] (error) IMenu: ...Free-user\Desktop\sborka dlya arizona\moonloader\new.lua:53: sol: no matching function call takes this number of arguments and the specified types
stack traceback:
[C]: in function 'ImBool'
...Free-user\Desktop\sborka dlya arizona\moonloader\new.lua:53: in main chunk

Всё было нормально пока не добавил 3 новых чекбокса, проверил код, как я понял ошибка где то тут:

Lua:
local directIni = ('moonloader\\config\\flood.ini')
local mainIni = inicfg.load({
    config = {},
    checkbox123 = {}
}, "flood.ini")
inicfg.save(mainIni, 'flood.ini')
-------------------------
local OFFSET = 2
local object = nil
cbug = false
local one1 = imgui.ImBool(false)
selected_item = imgui.ImInt(0)
local text_buffer = imgui.ImBuffer(256)
local text_buffer1 = imgui.ImBuffer(256)
local text_buffer2 = imgui.ImBuffer(256)
local Checkbox = imgui.ImBool(mainIni.checkbox123.Checkbox)
local Checkbox1 = imgui.ImBool(mainIni.checkbox123.Checkbox1)
local Checkbox2 = imgui.ImBool(mainIni.checkbox123.Checkbox2)
local Checkbox3 = imgui.ImBool(mainIni.checkbox123.Checkbox3)
local Checkbox4 = imgui.ImBool(mainIni.checkbox123.Checkbox4)
local Checkbox5 = imgui.ImBool(mainIni.checkbox123.Checkbox5)
local Checkbox6 = imgui.ImBool(mainIni.checkbox123.Checkbox6)
local Checkbox7 = imgui.ImBool(mainIni.checkbox123.Checkbox7)
local Checkbox8 = imgui.ImBool(mainIni.checkbox123.Checkbox8)
local Checkbox9 = imgui.ImBool(mainIni.checkbox123.Checkbox9)
local Checkbox10 = imgui.ImBool(mainIni.checkbox123.Checkbox10)
local Checkbox11 = imgui.ImBool(mainIni.checkbox123.Checkbox11)
local Checkbox12 = imgui.ImBool(mainIni.checkbox123.Checkbox12)
local Checkbox13 = imgui.ImBool(mainIni.checkbox123.Checkbox13)
local Checkbox14 = imgui.ImBool(mainIni.checkbox123.Checkbox14)
local Checkbox15 = imgui.ImBool(mainIni.checkbox123.Checkbox15)
local Checkbox16 = imgui.ImBool(mainIni.checkbox123.Checkbox16)
local Checkbox17 = imgui.ImBool(mainIni.checkbox123.Checkbox17)
local Checkbox18 = imgui.ImBool(mainIni.checkbox123.Checkbox18)
local Checkbox19 = imgui.ImBool(mainIni.checkbox123.Checkbox19)
local Checkbox20 = imgui.ImBool(mainIni.checkbox123.Checkbox20)
local Checkbox21 = imgui.ImBool(mainIni.checkbox123.Checkbox21) -- 51 строка
local Checkbox22 = imgui.ImBool(mainIni.checkbox123.Checkbox22)
local Checkbox23 = imgui.ImBool(mainIni.checkbox123.Checkbox23)

Что за ошибка?

[ML] (error) IMenu: ...Free-user\Desktop\sborka dlya arizona\moonloader\new.lua:53: sol: no matching function call takes this number of arguments and the specified types
stack traceback:
[C]: in function 'ImBool'
...Free-user\Desktop\sborka dlya arizona\moonloader\new.lua:53: in main chunk

Всё было нормально пока не добавил 3 новых чекбокса, проверил код, как я понял ошибка где то тут:

Lua:
local directIni = ('moonloader\\config\\flood.ini')
local mainIni = inicfg.load({
    config = {},
    checkbox123 = {}
}, "flood.ini")
inicfg.save(mainIni, 'flood.ini')
-------------------------
local OFFSET = 2
local object = nil
cbug = false
local one1 = imgui.ImBool(false)
selected_item = imgui.ImInt(0)
local text_buffer = imgui.ImBuffer(256)
local text_buffer1 = imgui.ImBuffer(256)
local text_buffer2 = imgui.ImBuffer(256)
local Checkbox = imgui.ImBool(mainIni.checkbox123.Checkbox)
local Checkbox1 = imgui.ImBool(mainIni.checkbox123.Checkbox1)
local Checkbox2 = imgui.ImBool(mainIni.checkbox123.Checkbox2)
local Checkbox3 = imgui.ImBool(mainIni.checkbox123.Checkbox3)
local Checkbox4 = imgui.ImBool(mainIni.checkbox123.Checkbox4)
local Checkbox5 = imgui.ImBool(mainIni.checkbox123.Checkbox5)
local Checkbox6 = imgui.ImBool(mainIni.checkbox123.Checkbox6)
local Checkbox7 = imgui.ImBool(mainIni.checkbox123.Checkbox7)
local Checkbox8 = imgui.ImBool(mainIni.checkbox123.Checkbox8)
local Checkbox9 = imgui.ImBool(mainIni.checkbox123.Checkbox9)
local Checkbox10 = imgui.ImBool(mainIni.checkbox123.Checkbox10)
local Checkbox11 = imgui.ImBool(mainIni.checkbox123.Checkbox11)
local Checkbox12 = imgui.ImBool(mainIni.checkbox123.Checkbox12)
local Checkbox13 = imgui.ImBool(mainIni.checkbox123.Checkbox13)
local Checkbox14 = imgui.ImBool(mainIni.checkbox123.Checkbox14)
local Checkbox15 = imgui.ImBool(mainIni.checkbox123.Checkbox15)
local Checkbox16 = imgui.ImBool(mainIni.checkbox123.Checkbox16)
local Checkbox17 = imgui.ImBool(mainIni.checkbox123.Checkbox17)
local Checkbox18 = imgui.ImBool(mainIni.checkbox123.Checkbox18)
local Checkbox19 = imgui.ImBool(mainIni.checkbox123.Checkbox19)
local Checkbox20 = imgui.ImBool(mainIni.checkbox123.Checkbox20)
local Checkbox21 = imgui.ImBool(mainIni.checkbox123.Checkbox21)
local Checkbox22 = imgui.ImBool(mainIni.checkbox123.Checkbox22)
local Checkbox23 = imgui.ImBool(mainIni.checkbox123.Checkbox23)
попробывал убрать 2, до 20 всё работает, от 20 нет, у чекбоксов лимит 20?

что вписать в function sampev.onSendDialogResponse(dialogId, -- и тип что то тут) чтобы оно могло нажимать кнопки (ну тип виртуал клавиши)
 
Последнее редактирование:

hhgvbjb

Новичок
1
0
Крашит луа скрипт при вводе команды.
В чем тут ошибка
fsgs.png




Проблему решил
 
Последнее редактирование:

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,704
Что за ошибка?

[ML] (error) IMenu: ...Free-user\Desktop\sborka dlya arizona\moonloader\new.lua:53: sol: no matching function call takes this number of arguments and the specified types
stack traceback:
[C]: in function 'ImBool'
...Free-user\Desktop\sborka dlya arizona\moonloader\new.lua:53: in main chunk

Всё было нормально пока не добавил 3 новых чекбокса, проверил код, как я понял ошибка где то тут:

Lua:
local directIni = ('moonloader\\config\\flood.ini')
local mainIni = inicfg.load({
    config = {},
    checkbox123 = {}
}, "flood.ini")
inicfg.save(mainIni, 'flood.ini')
-------------------------
local OFFSET = 2
local object = nil
cbug = false
local one1 = imgui.ImBool(false)
selected_item = imgui.ImInt(0)
local text_buffer = imgui.ImBuffer(256)
local text_buffer1 = imgui.ImBuffer(256)
local text_buffer2 = imgui.ImBuffer(256)
local Checkbox = imgui.ImBool(mainIni.checkbox123.Checkbox)
local Checkbox1 = imgui.ImBool(mainIni.checkbox123.Checkbox1)
local Checkbox2 = imgui.ImBool(mainIni.checkbox123.Checkbox2)
local Checkbox3 = imgui.ImBool(mainIni.checkbox123.Checkbox3)
local Checkbox4 = imgui.ImBool(mainIni.checkbox123.Checkbox4)
local Checkbox5 = imgui.ImBool(mainIni.checkbox123.Checkbox5)
local Checkbox6 = imgui.ImBool(mainIni.checkbox123.Checkbox6)
local Checkbox7 = imgui.ImBool(mainIni.checkbox123.Checkbox7)
local Checkbox8 = imgui.ImBool(mainIni.checkbox123.Checkbox8)
local Checkbox9 = imgui.ImBool(mainIni.checkbox123.Checkbox9)
local Checkbox10 = imgui.ImBool(mainIni.checkbox123.Checkbox10)
local Checkbox11 = imgui.ImBool(mainIni.checkbox123.Checkbox11)
local Checkbox12 = imgui.ImBool(mainIni.checkbox123.Checkbox12)
local Checkbox13 = imgui.ImBool(mainIni.checkbox123.Checkbox13)
local Checkbox14 = imgui.ImBool(mainIni.checkbox123.Checkbox14)
local Checkbox15 = imgui.ImBool(mainIni.checkbox123.Checkbox15)
local Checkbox16 = imgui.ImBool(mainIni.checkbox123.Checkbox16)
local Checkbox17 = imgui.ImBool(mainIni.checkbox123.Checkbox17)
local Checkbox18 = imgui.ImBool(mainIni.checkbox123.Checkbox18)
local Checkbox19 = imgui.ImBool(mainIni.checkbox123.Checkbox19)
local Checkbox20 = imgui.ImBool(mainIni.checkbox123.Checkbox20)
local Checkbox21 = imgui.ImBool(mainIni.checkbox123.Checkbox21) -- 51 строка
local Checkbox22 = imgui.ImBool(mainIni.checkbox123.Checkbox22)
local Checkbox23 = imgui.ImBool(mainIni.checkbox123.Checkbox23)


попробывал убрать 2, до 20 всё работает, от 20 нет, у чекбоксов лимит 20?

что вписать в function sampev.onSendDialogResponse(dialogId, -- и тип что то тут) чтобы оно могло нажимать кнопки (ну тип виртуал клавиши)
тебя вообще не волнует что в ини нет полей Checkbox - Checkbox23?
Lua:
local inicfg = require('inicfg')
local iniFileName = 'filename.ini'
local ini = inicfg.load({
    checkbox = {
        true,
        false,
        true
    },
}, iniFileName)
inicfg.save(ini, iniFileName)

local checkbox = {}

for index = 1, 20 do
    checkbox[index] = imgui.ImBool(ini.checkbox[index] or false)
end
 

goodflex

Активный
280
57
тебя вообще не ебет что в ини нет полей Checkbox - Checkbox23?
они до 20 у меня сами делались там, спустя день додумался туда вставить их, теперь всё нормально

как можно сделать такую rgd линию?
123673


чтобы переливалась цветами
 
Последнее редактирование:

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,704
Есть ли способ узнать расстояние между игроком и мной в реальном времени в потоке? Если да, то как мне это сделать? Мне нужна команда, которая его переключает (например, /target ID), и когда он находится в зоне потоковой передачи, расстояние должно быть на экране.
Lua:
local playerId = nil

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('trackdist', function(arg)
        local id = tonumber(arg)
        if not id or not sampIsPlayerConnected(id) then
            return sampAddChatMessage('disabled', -1)
        end
        playerId = id
        sampAddChatMessage('enabled', -1)
    end)
    while true do
        wait(0)
        if playerId then
            local result, ped = sampGetCharHandleBySampPlayerId(playerId)
            local x, y, z = getCharCoordinates(PLAYER_PED)
            printStyledString(result and math.floor(getDistanceBetweenCoords3d(x, y, z, getCharCoordinates(ped)))..' m.' or 'not in stream zone', 50, 7)
        end
    end
end
 

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,704
они до 20 у меня сами делались там, спустя день додумался туда вставить их, теперь всё нормально

как можно сделать такую rgd линию?
123673


чтобы переливалась цветами
1682166290895.png

Lua:
local DL, p = imgui.GetWindowDrawList(), imgui.GetCursorScreenPos()
local r, g, b, a = rainbow(0.5, 255, 0)
local r2, g2, b2, a2 = rainbow(0.5, 255, 20)
local left, right = imgui.GetColorU32Vec4(imgui.ImVec4(r / 255, g / 255, b / 255, a / 255)), imgui.GetColorU32Vec4(imgui.ImVec4(r2 / 255, g2 / 255, b2 / 255, a2 / 255))
DL:AddRectFilledMultiColor(p, imgui.ImVec2(p.x + imgui.GetWindowWidth(), p.y + 4), left, right, right, left)


function join_argb(a, r, g, b) -- by FYP
    local argb = b  -- b
    argb = bit.bor(argb, bit.lshift(g, 8))  -- g
    argb = bit.bor(argb, bit.lshift(r, 16)) -- r
    argb = bit.bor(argb, bit.lshift(a, 24)) -- a
    return argb
end

function rainbow(speed, alpha, offset) -- by rraggerr
    local clock = os.clock() + offset
    local r = math.floor(math.sin(clock * speed) * 127 + 128)
    local g = math.floor(math.sin(clock * speed + 2) * 127 + 128)
    local b = math.floor(math.sin(clock * speed + 4) * 127 + 128)
    return r,g,b,alpha
end
 

goodflex

Активный
280
57
Посмотреть вложение 198822
Lua:
local DL, p = imgui.GetWindowDrawList(), imgui.GetCursorScreenPos()
local r, g, b, a = rainbow(0.5, 255, 0)
local r2, g2, b2, a2 = rainbow(0.5, 255, 20)
local left, right = imgui.GetColorU32Vec4(imgui.ImVec4(r / 255, g / 255, b / 255, a / 255)), imgui.GetColorU32Vec4(imgui.ImVec4(r2 / 255, g2 / 255, b2 / 255, a2 / 255))
DL:AddRectFilledMultiColor(p, imgui.ImVec2(p.x + imgui.GetWindowWidth(), p.y + 4), left, right, right, left)


function join_argb(a, r, g, b) -- by FYP
    local argb = b  -- b
    argb = bit.bor(argb, bit.lshift(g, 8))  -- g
    argb = bit.bor(argb, bit.lshift(r, 16)) -- r
    argb = bit.bor(argb, bit.lshift(a, 24)) -- a
    return argb
end

function rainbow(speed, alpha, offset) -- by rraggerr
    local clock = os.clock() + offset
    local r = math.floor(math.sin(clock * speed) * 127 + 128)
    local g = math.floor(math.sin(clock * speed + 2) * 127 + 128)
    local b = math.floor(math.sin(clock * speed + 4) * 127 + 128)
    return r,g,b,alpha
end
а в имгуи это как применить?

Посмотреть вложение 198822
Lua:
local DL, p = imgui.GetWindowDrawList(), imgui.GetCursorScreenPos()
local r, g, b, a = rainbow(0.5, 255, 0)
local r2, g2, b2, a2 = rainbow(0.5, 255, 20)
local left, right = imgui.GetColorU32Vec4(imgui.ImVec4(r / 255, g / 255, b / 255, a / 255)), imgui.GetColorU32Vec4(imgui.ImVec4(r2 / 255, g2 / 255, b2 / 255, a2 / 255))
DL:AddRectFilledMultiColor(p, imgui.ImVec2(p.x + imgui.GetWindowWidth(), p.y + 4), left, right, right, left)


function join_argb(a, r, g, b) -- by FYP
    local argb = b  -- b
    argb = bit.bor(argb, bit.lshift(g, 8))  -- g
    argb = bit.bor(argb, bit.lshift(r, 16)) -- r
    argb = bit.bor(argb, bit.lshift(a, 24)) -- a
    return argb
end

function rainbow(speed, alpha, offset) -- by rraggerr
    local clock = os.clock() + offset
    local r = math.floor(math.sin(clock * speed) * 127 + 128)
    local g = math.floor(math.sin(clock * speed + 2) * 127 + 128)
    local b = math.floor(math.sin(clock * speed + 4) * 127 + 128)
    return r,g,b,alpha
end
вставил в скрипт ( в имгуи ничего не вставлял ещё) - крашит
 
D

deleted-user-139653

Гость
как проверить бежит ли игрок? думал найти по типу isPlayerRun(Running) но ничего нет(
 
D

deleted-user-139653

Гость
Lua:
isButtonPressed(nil, 16)

-- пример:
if isButtonPressed(nil, 16) then
    printStyledString('RUNNING NIGGA!', 25, 7)
end
херовый способ(
если дрочить пробел то значение мерцает(


Lua:
function getCharStamina()
    return math.floor(memory.getfloat(0xB7CDB4) / 32.9 + 5)
end

function main()
    while true do wait(0)
        if isButtonPressed(nil, 16) then
            local x, y, z = getCharCoordinates(PLAYER_PED)
            local xx, yy = convert3DCoordsToScreen(x, y, z)
            renderFontDrawText(font, getCharStamina(), xx, yy, -1)
        end
    end
end
 

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,704
херовый способ(
если дрочить пробел то значение мерцает(


Lua:
function getCharStamina()
    return math.floor(memory.getfloat(0xB7CDB4) / 32.9 + 5)
end

function main()
    while true do wait(0)
        if isButtonPressed(nil, 16) then
            local x, y, z = getCharCoordinates(PLAYER_PED)
            local xx, yy = convert3DCoordsToScreen(x, y, z)
            renderFontDrawText(font, getCharStamina(), xx, yy, -1)
        end
    end
end
Lua:
-- в самое начало
local lastPressed = 0

-- беск цикл
if isButtonPressed(nil, 16) then lastPressed = os.clock() end
if lastPressed + 0.2 - os.clock() > 0 then
    renderFontDrawText(Font, 'running', 400, 400, 0xFFffffff)
end
@chapo как мне это сделать?
для начала стоит научится включать логику и использовать гугл
Lua:
local playerId = nil

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('trackdist', function(arg)
        local id = tonumber(arg)
        if not id or not sampIsPlayerConnected(id) then
            return sampAddChatMessage('disabled', -1)
        end
        playerId = id
        sampAddChatMessage('enabled', -1)
    end)
    while true do
        wait(0)
        if playerId then
            local result, ped = sampGetCharHandleBySampPlayerId(playerId)
            local x, y, z = getCharCoordinates(PLAYER_PED)
            local dist = getDistanceBetweenCoords3d(x, y, z, getCharCoordinates(ped))
            printStyledString(result and ('%s [%s]: %0.1f m.'):format(sampGetPlayerNickname(playerId) or 'NAME', playerId, dist) or 'not in stream zone', 50, 7)
        end
    end
end
1682174369762.png
 
  • Нравится
Реакции: deleted-user-139653

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,704
я не очень в этом разбираюсь, но как мне это сделать на textdraw? то, что вы мне дали, сделано на игровом тексте, а не на textdraw (шрифт arial). @chapo
так блять создай текстдрав, потом замени вывод геймтекста на sampTextdrawSetString

блять, зачем ты лезешь сюда? Изучи сначала основы луа и moonloader api
 
  • Нравится
Реакции: Sadow и MLycoris