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

trefa

Известный
Всефорумный модератор
2,097
1,233
Мне нужно когда я пишу /a /mute 10 120 мат и нажимаю ентер, в этот же момент должно писать /ans 10 Для подачи жалобы...
Никак не другим хелперам которые просят наказание, только чтобы у меня
А додуматся не мог?:thinking:
Lua:
cmd = {"/a /warn","/a /ban"}
 

trefa

Известный
Всефорумный модератор
2,097
1,233
Долго ебался над этим.
Lua:
local imgui = require("imgui")
local x2, y2 = getScreenResolution()
local checkbox = imgui.ImBool(false)
local encoding = require ("encoding")
local traser = imgui.ImBool(false)
local enab = imgui.ImBool(true)
local inicfg = require("inicfg")
encoding.default = "CP1251"
u8 = encoding.UTF8
local inputs11 = {
tabl = {
121212, 1221
}
}
tabl = {}
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4
    colors[clr.TitleBg]                = ImVec4(255, 0, 0, 1)
    colors[clr.TitleBgActive]          = ImVec4(255, 0, 0, 1)
    colors[clr.TitleBgCollapsed]       = ImVec4(255, 0, 0, 0.1)
function main()
while not isSampAvailable() do wait(100) end
local font = renderCreateFont("Arial", 7, 4)
sampRegisterChatCommand("renderob", function() enab.v = not enab.v end)
     if not doesDirectoryExist("moonloader//config") then
        createDirectory("moonloader//config")
        inicfg.save(inputs11, "objwallhack")
    end
    inputs = inicfg.load(nil, "objwallhack")
    if inputs == nil then
        inicfg.save(inputs11, "objwallhack")
       inputs = inicfg.load(nil, "objwallhack")
    end
    for _, val in ipairs(inputs.tabl) do
        table.insert(tabl,imgui.ImInt(val))
    end
    while true do
    wait(0)
    imgui.Process = enab.v
        for _, v in pairs(getAllObjects()) do
            if isObjectOnScreen(v) then
                local _, x, y, z = getObjectCoordinates(v)
                local x1, y1 = convert3DCoordsToScreen(x,y,z)
                local model = getObjectModel(v)
                local x2,y2,z2 = getCharCoordinates(PLAYER_PED)
                local x10, y10 = convert3DCoordsToScreen(x2,y2,z2)
                if checkbox.v then
                    renderFontDrawText(font, model, x1, y1, -1)
                    if traser.v then
                        renderDrawLine(x10, y10, x1, y1, 1.0, -1)
                    end
                else
                    for _, v2 in ipairs(inputs) do
                        if v2.v == model then
                            renderFontDrawText(font, model, x1, y1, -1)
                        elseif traser.v and v2.v ~= model then
                                renderDrawLine(x10, y10, x1, y1, 1.0, -1)
                        end
                        end
                    end
            end
        end
    end
end

function imgui.OnDrawFrame()
if enab.v then
    imgui.SetNextWindowPos(imgui.ImVec2(x2 / 2, y2 / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(300, 400), imgui.Cond.FirstUseEver)
    imgui.Begin("Render objects", enab, imgui.WindowFlags.AlwaysUseWindowPadding + imgui.WindowFlags.NoResize + imgui.WindowFlags.AlwaysUseWindowPadding)
    imgui.Checkbox(u8("Найти все объекты"), checkbox)
    imgui.Checkbox(u8("Включить трейсер"), traser)
    if imgui.Button(u8("Добавить новое условие")) then
        table.insert(inputs.tabl, #inputs.tabl + 1)
        table.insert(tabl, imgui.ImInt(#tabl + 1))
            inicfg.save(inputs, "objwallhack")
    end--
    if #inputs.tabl > 0 then
        if imgui.Button(u8("Удалить последнее условие")) then
        table.remove(tabl, #tabl)
        table.remove(inputs.tabl, #inputs.tabl)
        inicfg.save(inputs, "objwallhack")
        end
    end
    imgui.BeginChild("inputs", imgui.ImVec2(287, 270), true)
    for i, val in ipairs(tabl) do
        if imgui.InputInt("input"..i, val, 0, -1) then
            inputs.tabl[i] = tabl[i].v
            inicfg.save(inputs, "objwallhack")
        end
    end
     imgui.EndChild()
    imgui.End()
end
end
 
  • Нравится
Реакции: ШPEK

lorgon

Известный
656
268
Как получить машину в которой сижу я?

В чём проблема?
Lua:
car = storeCarCharIsIn(PLAYER_PED)
speed = getCarSpeed(car)
sampAddChatMessage("Speed: "..speed, -1)
Лог
Код:
Text.lua: opcode '02E3' call caused an unhandled exception
stack traceback:
    [C]: in function 'getCarSpeed'
    C:\Games\GTA San Andreas\moonloader\Text.lua:65: in function <C:\Games\GTA San Andreas\moonloader\Text.lua:58>
 

trefa

Известный
Всефорумный модератор
2,097
1,233
как сэмулировать нажатие мышки??
Lua:
setGameKeyState(17, 32767)

Как получить машину в которой сижу я?

В чём проблема?
Lua:
car = storeCarCharIsIn(PLAYER_PED)
speed = getCarSpeed(car)
sampAddChatMessage("Speed: "..speed, -1)
Лог
Код:
Text.lua: opcode '02E3' call caused an unhandled exception
stack traceback:
    [C]: in function 'getCarSpeed'
    C:\Games\GTA San Andreas\moonloader\Text.lua:65: in function <C:\Games\GTA San Andreas\moonloader\Text.lua:58>
Lua:
if isCharInAnyCar(PLAYER_PED) then
        print(getCarSpeed(getCarCharIsUsing(PLAYER_PED)))
    end
 

ШPEK

Известный
1,476
525
Как получить машину в которой сижу я?

В чём проблема?
Lua:
car = storeCarCharIsIn(PLAYER_PED)
speed = getCarSpeed(car)
sampAddChatMessage("Speed: "..speed, -1)
Лог
Код:
Text.lua: opcode '02E3' call caused an unhandled exception
stack traceback:
    [C]: in function 'getCarSpeed'
    C:\Games\GTA San Andreas\moonloader\Text.lua:65: in function <C:\Games\GTA San Andreas\moonloader\Text.lua:58>
local veh = storeCarCharIsInNoSave(PLAYER_PED)
 

BohdanSatan

Известный
160
40
Можно ли сделать на луа что-то похожее как на AHK {Down 1} {Enter}
Подробная работа скрипта: Пишет команду "/mm" нажимает, к примеру 1 раз стрелку вниз и нажимает Enter.
 

tlwsn

Известный
537
85
Lua:
for line in lines(akt) do
      imgui.Text(u8(line))
    end
как правильно вывести текст из локальной переменной? пробовал так но нет
 

trefa

Известный
Всефорумный модератор
2,097
1,233
Можно ли сделать на луа что-то похожее как на AHK {Down 1} {Enter}
Подробная работа скрипта: Пишет команду "/mm" нажимает, к примеру 1 раз стрелку вниз и нажимает Enter.
Lua:
sampSendDialogResponse(sampGetCurrentDialogId(), 1,1,nil)
 
  • Нравится
Реакции: BohdanSatan