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

moreveal

Известный
988
723
Why I use sampSendClickTextdraw(11705) but the script don't click in the telephone?

Посмотреть вложение 141317
11705 is the model number, you need to use the textdraw ID, hook the OnShowTextdraw event, and find out the textdraw ID that has a modelId equal to 11705
also you can try this script (type "showtdid" in the sampfuncs console)

p.s: often textdraws have dynamic IDs, so it's worth focusing on other data - for example, the same model number, as well as the position of the textdraw, its size, etc.
 

Вложения

  • td+did.lua
    2.1 KB · Просмотры: 5
  • Нравится
Реакции: halfastrc

moreveal

Известный
988
723
How can I do this, what kind of function I need to use to get the size of the textdraw?
And thx for the help
this library will help a lot in this
then, you can use rpc event processing
Lua:
local sampev = require 'samp.events' -- you can find the events you need and their arguments here: lib/samp/events.lua

function sampev.onShowTextDraw(id, data)
    print(data.modelId, data.position.x, data.position.y)
end
1648363485708.png
 
  • Нравится
Реакции: halfastrc

wintreist

Активный
308
71
Привет, пишу скрипт для себя на аризоне на пилота, и проблема возникла с взятием самолёта: наступаю на пикап, жму альт, появляется диалог с самолётами в аэропорту.
Разбиваю строки диалога кодом:
разбитие диалога на строки:
local textes = {}
for i in text:gmatch('(.-)\n') do table.insert(textes, i) end
далее пробегаюсь по массиву в поисках нужного самолёта:

Lua:
for key, val in pairs(textes) do
    if val:find('Shamal', 1, true) then
        checkneed = true
        sampSendDialogResponse(dialogId, 1, key-2, nil)
        break
    end
end
if checkneed == false then sampSendDialogResponse(dialogId, 0, nil, nil) end
return false
и в 4й строке отправляю ответ диалогу если нашел нужный самолёт, в 8 отправляю диалогу, что я его закрываю, и в 9 не показываю диалог
8+9 строки работают как часы, диалог закрывается, и я могу открыть новый, а вот 4я посылает меня нахрен, и не берёт самолёт, просто ничего не происходит.
P.S: в 4й строке key-2, потому что у 0й строки диалога 2 индекс в массиве строк
up
 

VoloRate

Новичок
1
1
Всем привет! Начал заниматься Lua скриптингом, а именно imgui. У меня вот вопрос, какие библиотеки нужны чтобы создать имгуи окно и в нем были кнопки, по типу команды 1, ты нажимаешь на эту кнопку а там команды определенные в ряд
 
  • Ха-ха
Реакции: Sadow

Rice.

Известный
Модератор
1,757
1,706
Функция:
Lua:
function sampGetListboxItemByText(text, plain)
    if not sampIsDialogActive() then return -1 end
        plain = not (plain == false)
    for i = 0, sampGetListboxItemsCount() - 1 do
        if sampGetListboxItemText(i):find(text, 1, plain) then
            return i
        end
    end
    return -1
end
Пример для твоего случая:
Lua:
for line in text:gmatch("[^\n]+") do
    lua_thread.create(function()
        wait(1)
        local cont = sampGetListboxItemByText('Shamal')
        sampSendDialogResponse(dialogId, 1, cont, nil)
    end)
end
 

wintreist

Активный
308
71
Функция:
Lua:
function sampGetListboxItemByText(text, plain)
    if not sampIsDialogActive() then return -1 end
        plain = not (plain == false)
    for i = 0, sampGetListboxItemsCount() - 1 do
        if sampGetListboxItemText(i):find(text, 1, plain) then
            return i
        end
    end
    return -1
end
Пример для твоего случая:
Lua:
for line in text:gmatch("[^\n]+") do
    lua_thread.create(function()
        wait(1)
        local cont = sampGetListboxItemByText('Shamal')
        sampSendDialogResponse(dialogId, 1, cont, nil)
    end)
end
Найти то шамал он может, когда шлет ответ через sampSendDialogResponse ничего не происходит
 

Vadimka3636

Известный
54
36
как можно узнать побиты ли части авто? для дверей и колес нашёл, для панелей(бамперы, фары и стекла) - нет
 

nikusik

Новичок
22
0
Привет всем! В общем делаю так сказать репорт хелпер, сейчас занимаюсь ловлером репорта, у меня возникла проблемка.
Рассказываю: у меня в имгуи окне есть две кнопки - ON и OFF которые как раз контролируют работу репорта, при нажатии ON дается значение areport = 1, а при OFF значение areport = 0 (в самом начале до main уже прописано что areport = 0). При включенном ловлере он ждет пока появится в чате [A] [REPORT] - вот код
Lua:
function sampev.onServerMessage(color, text)
    if text:find("%[A%] %[REPORT%]") then
        printStyledString('REPORT++', 2000, 5)
    if areport == 1 then
    sampSendChat("/arep")

    end
    end
    end
видно то что он ввел команду /arep, это команда открывает Обращения к администрации, теперь скрипт по диалогу должен увидеть наличие любого текста с словом "(Доступный)" - именно в скобках, даю код -
Lua:
function sampev.onShowDialog(dialogID, style, title, button1, button2, text)
if areport == 1 then
        if title:find("Обращения к администрации") then
        
            for line in text:gmatch("[^\n]+") do
                if line:find("(Доступный)") then
                    sampSendDialogResponse(id, 1, line, _)
                end
            end
 
        end
    end
вроде бы все правильно, но при появлении репорта этот текст в чате не отображается, тоесть как будто скрипт забирает сообщение о появлении репорта (если ловлер выключен то нормально сообщение о репорте показывается), и самое главное то что он прописывает /arep, заходит в Обращения к Администрации, но не нажимает на репорт и просто остается в окне ОБращений.
очень нужна ваша помощь, помогите пожалуйста!!!
 

YourAssistant

Участник
145
17
Где можно посмотреть все статусы загрузки?
Lua:
 local dlstatus = require('moonloader').download_status
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,235
12,655
Где можно посмотреть все статусы загрузки?
Lua:
 local dlstatus = require('moonloader').download_status
lib\moonloader.lua

Lua:
local download_status = {
    STATUS_FINDINGRESOURCE = 1,
    STATUS_CONNECTING = 2,
    STATUS_REDIRECTING = 3,
    STATUS_BEGINDOWNLOADDATA = 4,
    STATUS_DOWNLOADINGDATA = 5,
    STATUS_ENDDOWNLOADDATA = 6,
    STATUS_BEGINDOWNLOADCOMPONENTS = 7,
    STATUS_INSTALLINGCOMPONENTS = 8,
    STATUS_ENDDOWNLOADCOMPONENTS = 9,
    STATUS_USINGCACHEDCOPY = 10,
    STATUS_SENDINGREQUEST = 11,
    STATUS_CLASSIDAVAILABLE = 12,
    STATUS_MIMETYPEAVAILABLE = 13,
    STATUS_CACHEFILENAMEAVAILABLE = 14,
    STATUS_BEGINSYNCOPERATION = 15,
    STATUS_ENDSYNCOPERATION = 16,
    STATUS_BEGINUPLOADDATA = 17,
    STATUS_UPLOADINGDATA = 18,
    STATUS_ENDUPLOADDATA = 19,
    STATUS_PROTOCOLCLASSID = 20,
    STATUS_ENCODING = 21,
    STATUS_VERIFIEDMIMETYPEAVAILABLE = 22,
    STATUS_CLASSINSTALLLOCATION = 23,
    STATUS_DECODING = 24,
    STATUS_LOADINGMIMEHANDLER = 25,
    STATUS_CONTENTDISPOSITIONATTACH = 26,
    STATUS_FILTERREPORTMIMETYPE = 27,
    STATUS_CLSIDCANINSTANTIATE = 28,
    STATUS_IUNKNOWNAVAILABLE = 29,
    STATUS_DIRECTBIND = 30,
    STATUS_RAWMIMETYPE = 31,
    STATUS_PROXYDETECTING = 32,
    STATUS_ACCEPTRANGES = 33,
    STATUS_COOKIE_SENT = 34,
    STATUS_COMPACT_POLICY_RECEIVED = 35,
    STATUS_COOKIE_SUPPRESSED = 36,
    STATUS_COOKIE_STATE_UNKNOWN = 37,
    STATUS_COOKIE_STATE_ACCEPT = 38,
    STATUS_COOKIE_STATE_REJECT = 39,
    STATUS_COOKIE_STATE_PROMPT = 40,
    STATUS_COOKIE_STATE_LEASH = 41,
    STATUS_COOKIE_STATE_DOWNGRADE = 42,
    STATUS_POLICY_HREF = 43,
    STATUS_P3P_HEADER = 44,
    STATUS_SESSION_COOKIE_RECEIVED = 45,
    STATUS_PERSISTENT_COOKIE_RECEIVED = 46,
    STATUS_SESSION_COOKIES_ALLOWED = 47,
    STATUS_CACHECONTROL = 48,
    STATUS_CONTENTDISPOSITIONFILENAME = 49,
    STATUS_MIMETEXTPLAINMISMATCH = 50,
    STATUS_PUBLISHERAVAILABLE = 51,
    STATUS_DISPLAYNAMEAVAILABLE = 52,
    STATUS_SSLUX_NAVBLOCKED = 53,
    STATUS_SERVER_MIMETYPEAVAILABLE = 54,
    STATUS_SNIFFED_CLASSIDAVAILABLE = 55,
    STATUS_64BIT_PROGRESS = 56,
    STATUSEX_STARTBINDING = 57,
    STATUSEX_ENDDOWNLOAD = 58,
    STATUSEX_LOWRESOURCE = 59,
    STATUSEX_DATAAVAILABLE = 60,
}

что означает значение aspectRatio в AimSync? Я знаю что aspectRatio это соотношение сторон, но почему значение этого параметра 192?
 
Последнее редактирование:
  • Нравится
Реакции: YourAssistant

JustFedot

legends never die 🕊️
357
379
Доброй ночи. Необходимо узнать кол-во присоеденённых к поезду(в котором я) в данный момент.(может меняться).
Нашел getTrainCarriage но не понял как использовать.
 

Rice.

Известный
Модератор
1,757
1,706
  • Нравится
Реакции: sat0ry

DedPoet

Участник
100
23
Всем привет, есть скрипт от Akionka для автологина. Можете помочь обьяснить как вытаскивать значения в json в imgui.InputText? Чтобы пароль менялся при смене сервера в imgui.InputText.
 

Вложения

  • autologin (1).lua
    54.4 KB · Просмотры: 6