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

Double Tap Inside

Известный
Проверенный
1,899
1,241
Как перехватывать (получать инфу) с Launcher диалогов, например на Radmir CRMP. Такие "диалоги" как авторизация... итд, мне сказали, что это CSS интерфейсы. Как же мне добраться до них, чтобы вытащить пару значений?
Эти мудаки вместо текстдравов, геймтекста начали пихать эти лаунчеровые интерфейсы, которые я хз как перехватить...
 

kizn

О КУ)))
Всефорумный модератор
2,404
2,058
что-то не получилось
:
script:
require "lib.moonloader" -- подключение библиотеки
local keys = require "vkeys"
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local main_window_state = imgui.ImBool(false)
local example_window_state = imgui.ImBool(false)
local playerid = -1
local sw, sh = getScreenResolution() -- узнаем размер экрана

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("imgui", function() main_window_state.v = not main_window_state.v end)
    imgui.Process = false
    -- Блок выполняется один раз после старта сампа
    while true do
        wait(0)
        imgui.Process = main_window_state.v
        -- Блок выполняющийся бесконечно (пока самп активен)
        local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
        if valid and doesCharExist(ped) then
            local result, id = sampGetPlayerIdByCharHandle(ped)
            if result and isKeyJustPressed(VK_X) then
                main_window_state.v = not main_window_state.v
                playerid = id
            end
        end
    end
end

function imgui.OnDrawFrame()
    if not main_window_state.v then
        imgui.Process = false
    end
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(300, 325), imgui.Cond.FirstUseEver) -- устанавливаем размер окна
        imgui.SetNextWindowPos(imgui.ImVec2((sw / 2), sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) -- позиция окна
        imgui.Begin(u8"Helper Menu", main_window_state)
        if imgui.Button(u8"История ников") then
            sampSendChat("/history "..sampGetPlayerNickname(tostring(playerid)))
        end

        if imgui.Button(u8"Добавить в записную книгу") then
             sampSendChat("/add "..tostring(playerid))
        end

        if imgui.Button(u8"Нажми") then
            example_window_state.v = not example_window_state.v
        end
        -- Если нужен NickName: sampGetPlayerNickname(tostring(playerid))
        -- Если нужен NickName без _ : sampGetPlayerNickname(tostring(playerid)):gsub('_', ' ')
        -- Если нужен ID: tostring(playerid)
    end
    imgui.End()
end
if example_window_state.v then
    imgui.SetNextWindowSize(imgui.ImVec2(100, 100), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2((sw / 5), sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8"Меню1", example_window_state)
        imgui.Text(u8"Test")

    imgui.End()
end
я начинающий луа скриптер, пожалуйста, сделайте все за меня
 

monolith04

Известный
69
6
Lua:
  if statute_window.v then
    imgui.SetNextWindowSize(imgui.ImVec2(650,470), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(fa.ICON_LIST..u8' Устав', statute_window, imgui.WindowFlags.NoResize)
    imgui.BeginChild("StatuteOrg", imgui.ImVec2(210, 155), false)
      imgui.Columns(1, 'StatuteOrg')
      if imgui.Selectable(u8'Министерство здравоохранения', false) then OrgSetList = 0 end
    imgui.EndChild()
    imgui.SameLine()
    imgui.BeginChild('StatuteList', imgui.ImVec2(420, 440), true)
    if OrgSetList == 0 then
    local ustav = io.open('moonloader/config/kolt04/yst1_1.txt'):lines()
      if ustav then
        for lines in ustav do
          imgui.TextWrapped(u8(lines))
        end
      end
    end
    imgui.EndChild()
    imgui.End()
  end
После нажатия на Selectable окно внаглую закрывается через 5 секунд. Хоть и текст выводится нормально. Где я напортачил? 🤔
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,731
4,718
Как перехватывать (получать инфу) с Launcher диалогов, например на Radmir CRMP. Такие "диалоги" как авторизация... итд, мне сказали, что это CSS интерфейсы. Как же мне добраться до них, чтобы вытащить пару значений?
Эти мудаки вместо текстдравов, геймтекста начали пихать эти лаунчеровые интерфейсы, которые я хз как перехватить...
Реверсить.

И они не мудаки, сам попробуй сначала что-то подобное сделать, потом говори.
 

Ciske

Новичок
18
6
Народ, как сделать активацию флуда клавишей по нажатию кнопки и деактивация по нажатию второй?
F3 — старт; F4 — стоп.
Я пытаюсь объявить переменную со статусом. При нажатии кнопок её изменять и сделать в цикле проверку статуса. Но скрипт как-то не горит желанием останавливаться… Что здесь не так?

Lua:
require "lib.moonloader"
require "lib.sampfuncs"
require "lib.game.keys"

local work = false

function main()

    while true do
        wait(0)

        if isKeyDown(VK_F3) then
            work = true -- меняем статус по нажатию F3 и запускаем цикл

            while work == true do    -- если статус true, флудим
                 setVirtualKeyDown(VK_LMENU, true)    -- нажимаем и поднимаем Alt
                 lua_thread.create(function()
                   wait(100)
                   setVirtualKeyDown(VK_LMENU, false)
                end)
                wait(0)
            end

        end

        if isKeyDown(VK_F4) then.  -- меняем статус на false
            work = false
        end

    end
end
 

Next..

Известный
343
135
Народ, как сделать активацию флуда клавишей по нажатию кнопки и деактивация по нажатию второй?
F3 — старт; F4 — стоп.
Я пытаюсь объявить переменную со статусом. При нажатии кнопок её изменять и сделать в цикле проверку статуса. Но скрипт как-то не горит желанием останавливаться… Что здесь не так?

Lua:
require "lib.moonloader"
require "lib.sampfuncs"
require "lib.game.keys"

local work = false

function main()

    while true do
        wait(0)

        if isKeyDown(VK_F3) then
            work = true -- меняем статус по нажатию F3 и запускаем цикл

            while work == true do    -- если статус true, флудим
                 setVirtualKeyDown(VK_LMENU, true)    -- нажимаем и поднимаем Alt
                 lua_thread.create(function()
                   wait(100)
                   setVirtualKeyDown(VK_LMENU, false)
                end)
                wait(0)
            end

        end

        if isKeyDown(VK_F4) then.  -- меняем статус на false
            work = false
        end

    end
end
Lua:
require "lib.moonloader"
require "lib.sampfuncs"
require "lib.game.keys"

local work = false

function main()
    while true do
        wait(0)
        if isKeyJustPressed(VK_F3) then
            work = true
        end -- меняем статус по нажатию F3 и запускаем цикл
        while work do wait(0)  -- если статус true, флудим
            setVirtualKeyDown(VK_LMENU, true)    -- нажимаем и поднимаем Alt
            wait(100)
            setVirtualKeyDown(VK_LMENU, false)
            if isKeyJustPressed(VK_F4) then  -- меняем статус на false
                work = false
            end
        end
    end
end
 

danywa

Активный
358
49
Последнее редактирование:

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
Пробовал, ничего не получается

ап
1629133326918.png

Lua:
  if statute_window.v then
    imgui.SetNextWindowSize(imgui.ImVec2(650,470), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(fa.ICON_LIST..u8' Устав', statute_window, imgui.WindowFlags.NoResize)
    imgui.BeginChild("StatuteOrg", imgui.ImVec2(210, 155), false)
      imgui.Columns(1, 'StatuteOrg')
      if imgui.Selectable(u8'Министерство здравоохранения', false) then OrgSetList = 0 end
    imgui.EndChild()
    imgui.SameLine()
    imgui.BeginChild('StatuteList', imgui.ImVec2(420, 440), true)
    if OrgSetList == 0 then
    local ustav = io.open('moonloader/config/kolt04/yst1_1.txt'):lines()
      if ustav then
        for lines in ustav do
          imgui.TextWrapped(u8(lines))
        end
      end
    end
    imgui.EndChild()
    imgui.End()
  end
После нажатия на Selectable окно внаглую закрывается через 5 секунд. Хоть и текст выводится нормально. Где я напортачил? 🤔
Я не уверен, но скорее всего это из-за того, что ты каждый кадр открываешь файл (пр. 100 FPS = 100 раз в секунду) в OnDrawFrame(). В бесконечном цикле результат примерно такой же.
 

Ciske

Новичок
18
6
Lua:
require "lib.moonloader"
require "lib.sampfuncs"
require "lib.game.keys"

local work = false

function main()
    while true do
        wait(0)
        if isKeyJustPressed(VK_F3) then
            work = true
        end -- меняем статус по нажатию F3 и запускаем цикл
        while work do wait(0)  -- если статус true, флудим
            setVirtualKeyDown(VK_LMENU, true)    -- нажимаем и поднимаем Alt
            wait(100)
            setVirtualKeyDown(VK_LMENU, false)
            if isKeyJustPressed(VK_F4) then  -- меняем статус на false
                work = false
            end
        end
    end
end
Спасибо.
При нажатии на F4 крашит игру. Хм.
UPD: если убрать setVirtualKeyDown и wait(100), заменив это на просто вывод чего-нибудь в чат, всё работает. А с нажатием кнопки (setVirtualKeyDown) при клике на F4 скрипт не останавливается, игра крашится...

UPD: Господи, какой же я идиот. Кажется, я допёр, почему при зажатии скриптом A;lt и нажатием мной F4 игра закрывается...
 
Последнее редактирование:
  • Ха-ха
Реакции: Rice. и Next..

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
есть сниппет, который ищет ближайщий объект?
Этот попробуй.
Lua:
for _, v in pairs(getAllObjects()) do
    local minDist = 333
    local result, x, y, z = getObjectCoordinates(v)
    local mX, mY, mZ = getCharCoordinates(PLAYER_PED)
    local dist = math.sqrt((x - mX)^2 + (y - mY)^2 + (z - mZ)^2)
    if dist < minDist then
        -- Code
    end
end
 

vladick2227

Новичок
1
0
Смог создать imgui окно по команде, но не могу добавить ни ImputText, ни даже долбаный крестик, что бы закрыть окно, ни позиционирование. НИЧЕГО. Помогите пж
require "lib.moonloader"
local keys = require "vkeys"
local imgui = require "imgui"
local encoding = require "encoding"
local notf = import 'lib_imgui_notf.lua'
local sw, sh = getScreenResolution()
encoding.default = "CP1251"
u8 = encoding.UTF8

local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)

function main()
if not isSampLoaded() or not isSampfuncsLoaded() then return end
while not isSampAvailable() do wait(100) end

sampRegisterChatCommand("gh", cmd_imgui)

while true do
wait(0)

if main_window_state.v == false then
imgui.Process = false
end
end
end

function cmd_imgui(arg)
main_windows_state.v = not main_windows_state.v
imgui.Process = main_windows_state.v
end

function imgui.OnDrawFrame()

imgui.Begin(u8"Госс Хелпер", main_window_state)
imgui.Text(u8"Тип че-то написано")
imgui.End()
end