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

chromiusj

Известный
Модератор
5,606
3,916
Привет , пытаюсь хукнуть сообщение от сервера "Вы авторизовались", мне над чтоб именно после этого запускался мой скрипт, но не хукается оно
хук вы авторизовались:
function sampev.onServerMessage(color, text)

    if text:find('Вы авторизовались.') then
        sampAddChatMessage('ЕСТЬ КОНТАКТ', -1)
             end
 end
вот как выглядит в чат логе:
вот чо хукать:
[17:45:07] Вы авторизовались.

[17:45:07] Загрузить или выгрузить транспортное средство: {FFFFB3}/cars

[17:45:07] Меню персонажа, квесты, награды, мероприятия и достижения: {FFFFB3}/menu
1691851816317.png

Lua:
local sampev = require('lib.samp.events')
function sampev.onServerMessage(color, text)
    if text:find('Вы авторизовались%.') then
        sampAddChatMessage('прием вы тут', -1)
    end
end
 

nikusik

Новичок
22
0
Посмотреть вложение 211421
Lua:
local sampev = require('lib.samp.events')
function sampev.onServerMessage(color, text)
    if text:find('Вы авторизовались%.') then
        sampAddChatMessage('прием вы тут', -1)
    end
end


A8E83019-1ECF-40D1-9500-C6E90032985B.jpeg

Может из за того что текст синий , но этого не пишется в чат логе и хрен пойми что, но не работает даже так
 

nanobrick

Участник
76
47
Здравствуйте, есть ли способ обойти эту систему CAPTCHA в игре? В приведенном ниже примере этот интерфейс показывает, когда вы находитесь в состоянии AFK более 10 минут в транспортном средстве, и когда это происходит, это отображается на вашем экране и предлагает вам выбрать все транспортные средства, которые запрашивает интерфейс (пример в видео: ТРАКТОР), и после того, как вы выберете их все, CAPTCHA будет завершена. В видео также есть идентификаторы и имена textdraw (бесполезные), чтобы как-то понять, как это сделать.
you have to create an array which contains car models from captcha and their names. For example:
Lua:
model_arr = {
 ['TRACTOR'] = *its model id*,
}
using samp car model IDs or function

And then write code which runs when there's a car name matched from 'B-HOOD CAPTCHA' textdraw using regular expression in onShowTextDraw hook event. It should get the matched car's model id from the array using matched name as a key, get all existing textdraw models in a for loop, and send clicks to matched models
Lua:
-- sampev.onShowTextDraw
-- name = text:match(*pattern*)
-- return if name equals nil
-- create a thread with a bit of delay because other textdraws may appear a bit later
captcha_car_model = model_arr[name]
for i = 2000, 2300 do
  if sampTextdrawIsExists(i) then
    local model = sampTextdrawGetModelRotationZoomVehColor(i)
    if model == captcha_car_model then
      sampSendClickTextdraw(i)
    end
  end
end
-- end of thread
-- end of sampev.onShowTextDraw
idk if it's the best solution but it should work
 

Gorskin

♥ Love Lua ♥
Проверенный
1,334
1,172
Всем привет, что-то я не могу раздуплиться...
Имеется строка
Lua:
local text = "%02d:%02d"
Мне необходимо избавиться от всех волшебных символов кроме целого числа %d при этом чтобы человек при желании мог менять его на
Lua:
local text = "Goodbye"
и т.д, менять вид строки на
Lua:
local text = "%d:%d"
Всё это нужно мне для рендера часов из одиночки, ибо если человек случайно укажет %s или %f то игру крашнет.
Нужно составить регулярку такую чтобы человек мог писать любой текст, и из формата 07:34 делать 7:34.

Lua:
imgui.InputText(u8"##ФорматЧасов", buffers.formatClock, sizeof(buffers.formatClock))
imgui.PopItemWidth()
imgui.SameLine()
if imgui.Button(u8'Сохранить##форматвремени', imgui.ImVec2(70, 25)) then
    if str(buffers.formatClock):find("%d") then 
        ini.settings.formatClock = str(buffers.formatClock) 
        save() 
        gotofunc("InterfaceElementEditor") 
    end
end
 

Дядя Энрик.

Активный
337
81
Привет , пытаюсь хукнуть сообщение от сервера "Вы авторизовались", мне над чтоб именно после этого запускался мой скрипт, но не хукается оно
хук вы авторизовались:
function sampev.onServerMessage(color, text)

    if text:find('Вы авторизовались.') then
        sampAddChatMessage('ЕСТЬ КОНТАКТ', -1)
             end
 end
вот как выглядит в чат логе:
вот чо хукать:
[17:45:07] Вы авторизовались.

[17:45:07] Загрузить или выгрузить транспортное средство: {FFFFB3}/cars

[17:45:07] Меню персонажа, квесты, награды, мероприятия и достижения: {FFFFB3}/menu
Lua:
local sampev = require "lib.samp.events"
function sampev.onServerMessage(color, text)
    if text:find('Вы авторизовались.') then
        sampAddChatMessage('ЕСТЬ КОНТАКТ', -1)
     end
 end
vrode rabotaet

использую /relvl , каким образом получить количество игроков с таким же уровнем который у меня указан в поиске?
JF3KZfpNGHA.jpg
 
Последнее редактирование:

Yans

Активный
190
33
Как вернуть номер элемента по тексту чтобы скрипт нажал на него ?


Govnokod:
-- проверка на ид, но код выглядит как будто его избили лопатой     

            if id == 2831 then

            --Тут должна по идее быть проверка на текст, но я не знаю как ее сделать

            -- А тут нажатие на номер элемента в списке

            --[[Дерьмо:

            sampSendDialogResponse(2831, 1, 0, "")

            sampSendDialogResponse(2831, 1, 1, "")

            sampSendDialogResponse(2831, 1, 2, "")

            sampSendDialogResponse(2831, 1, 3, "")

            sampSendDialogResponse(2831, 1, 4, "")

            sampSendDialogResponse(2831, 1, 5, "")

            sampSendDialogResponse(2831, 1, 6, "")

            sampCloseCurrentDialogWithButton(0)

            active = not active

        end --]]

      

      

-- Весь код:

local sampev = require 'lib.samp.events'



local active = not active



function main()

    while not isSampAvailable() do wait(100) end

    wait(-1)

end



function sampev.onServerMessage(color, text)

    if text:find ("Мой зад") then

        active = active

    end

end



function sampev.onShowDialog(id, style, title, b1, b2, text)

    if active == active then

        sampSendChat("/bonus")



        if id == 2831 then

            sampSendDialogResponse(2831, 1, 0, "")

            sampSendDialogResponse(2831, 1, 1, "")

            sampSendDialogResponse(2831, 1, 2, "")

            sampSendDialogResponse(2831, 1, 3, "")

            sampSendDialogResponse(2831, 1, 4, "")

            sampSendDialogResponse(2831, 1, 5, "")

            sampSendDialogResponse(2831, 1, 6, "")

            sampCloseCurrentDialogWithButton(0)

            active = not active

        end

    end

end
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,132
Как вернуть номер элемента по тексту чтобы скрипт нажал на него ?


Govnokod:
-- проверка на ид, но код выглядит как будто его избили лопатой    

            if id == 2831 then

            --Тут должна по идее быть проверка на текст, но я не знаю как ее сделать

            -- А тут нажатие на номер элемента в списке

            --[[Дерьмо:

            sampSendDialogResponse(2831, 1, 0, "")

            sampSendDialogResponse(2831, 1, 1, "")

            sampSendDialogResponse(2831, 1, 2, "")

            sampSendDialogResponse(2831, 1, 3, "")

            sampSendDialogResponse(2831, 1, 4, "")

            sampSendDialogResponse(2831, 1, 5, "")

            sampSendDialogResponse(2831, 1, 6, "")

            sampCloseCurrentDialogWithButton(0)

            active = not active

        end --]]

     

     

-- Весь код:

local sampev = require 'lib.samp.events'



local active = not active



function main()

    while not isSampAvailable() do wait(100) end

    wait(-1)

end



function sampev.onServerMessage(color, text)

    if text:find ("Мой зад") then

        active = active

    end

end



function sampev.onShowDialog(id, style, title, b1, b2, text)

    if active == active then

        sampSendChat("/bonus")



        if id == 2831 then

            sampSendDialogResponse(2831, 1, 0, "")

            sampSendDialogResponse(2831, 1, 1, "")

            sampSendDialogResponse(2831, 1, 2, "")

            sampSendDialogResponse(2831, 1, 3, "")

            sampSendDialogResponse(2831, 1, 4, "")

            sampSendDialogResponse(2831, 1, 5, "")

            sampSendDialogResponse(2831, 1, 6, "")

            sampCloseCurrentDialogWithButton(0)

            active = not active

        end

    end

end
 
  • Нравится
Реакции: Yans

chapo

чопа сребдс // @moujeek
Модератор
8,879
11,602
Как можно грамотно определить перевернута ли машина? Без использования функции isCarStuckOnRoof? Пытался с кватернионами, но я чет хз как они работают
1691922634032.png
1691922691938.png

1691922726390.png
 

tsunamiqq

Участник
433
17
Работает пиар только после перезагрузки скрипта, и выключается также:

Lua:
local inicfg = require('inicfg')
local directIni = 'CNNHelper.ini'
local mainIni = inicfg.load(inicfg.load({
    autopiar = {
        vrchecked = false,
        vrtext = u8'',
        vrdelay = 60000,
        checkedautopiar = false
}, directIni))
inicfg.save(mainIni, directIni)

local AUTOPIAR = {
    vrchecked = new.bool(mainIni.autopiar.vrchecked),
    vrtext = new.char[256](u8(mainIni.autopiar.vrtext)),
    vrdelay = new.int(mainIni.autopiar.vrdelay),
    checkedautopiar = new.bool(mainIni.autopiar.checkedautopiar)
}

--Окно

        if imgui.Checkbox(u8' Вкл/Выкл AutoPiar', AUTOPIAR.checkedautopiar) then
            mainIni.autopiar.checkedautopiar = AUTOPIAR.checkedautopiar[0]
        end

        if imgui.Checkbox('##vrchecked', AUTOPIAR.vrchecked) then
            mainIni.autopiar.vrchecked = AUTOPIAR.vrchecked[0]
        end

        if imgui.InputTextWithHint(faicons('USER')..u8' Текст /vr', u8'Введите текст', AUTOPIAR.vrtext, 256) then
            mainIni.autopiar.vrtext = u8:decode(ffi.string(AUTOPIAR.vrtext))
        end

        if imgui.InputInt(faicons('CLOCK_NINE')..u8' Задержка /vr', AUTOPIAR.vrdelay) then
            mainIni.autopiar.vrdelay = AUTOPIAR.vrdelay[0]
        end

--Вне окна

if mainIni.autopiar.checkedautopiar then
    if mainIni.autopiar.vrchecked then
        lua_thread.create(function()
            sampSendChat('/vr '..mainIni.autopiar.vrtext)
            wait(mainIni.autopiar.vrdelay)
            return true
        end)
    end
end
актуал
 
Последнее редактирование:

Дядя Энрик.

Активный
337
81
Lua:
local sampev = require "lib.samp.events"
function sampev.onServerMessage(color, text)
    if text:find('Вы авторизовались.') then
        sampAddChatMessage('ЕСТЬ КОНТАКТ', -1)
     end
 end
vrode rabotaet

использую /relvl , каким образом получить количество игроков с таким же уровнем который у меня указан в поиске?
JF3KZfpNGHA.jpg
ап
 

alarm0

Участник
44
3
Как для sampCreate3dText добавить обводку? На серверном 3dtext она есть, а при создании локального нет, не нашёл информации по этому поводу. И доступны ли какие-то флаги для 3dtext?
 
Последнее редактирование:

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,992
2,186
Как можно грамотно определить перевернута ли машина? Без использования функции isCarStuckOnRoof? Пытался с кватернионами, но я чет хз как они работают
Попробуй это
Lua:
getCarRoll(storeCarCharIsInNoSave(1))
1691934452643.png
1691934489925.png
 
  • Влюблен
Реакции: chapo

Gorskin

♥ Love Lua ♥
Проверенный
1,334
1,172
Всем привет, что-то я не могу раздуплиться...
Имеется строка
Lua:
local text = "%02d:%02d"
Мне необходимо избавиться от всех волшебных символов кроме целого числа %d при этом чтобы человек при желании мог менять его на
Lua:
local text = "Goodbye"
и т.д, менять вид строки на
Lua:
local text = "%d:%d"
Всё это нужно мне для рендера часов из одиночки, ибо если человек случайно укажет %s или %f то игру крашнет.
Нужно составить регулярку такую чтобы человек мог писать любой текст, и из формата 07:34 делать 7:34.

Lua:
imgui.InputText(u8"##ФорматЧасов", buffers.formatClock, sizeof(buffers.formatClock))
imgui.PopItemWidth()
imgui.SameLine()
if imgui.Button(u8'Сохранить##форматвремени', imgui.ImVec2(70, 25)) then
    if str(buffers.formatClock):find("%d") then
        ini.settings.formatClock = str(buffers.formatClock)
        save()
        gotofunc("InterfaceElementEditor")
    end
end
?