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

Rice.

Известный
Модератор
1,756
1,624
Функция:
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

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

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

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

chapo

чопа сребдс // @moujeek
Модератор
8,866
11,562
Где можно посмотреть все статусы загрузки?
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

Известный
337
336
Доброй ночи. Необходимо узнать кол-во присоеденённых к поезду(в котором я) в данный момент.(может меняться).
Нашел getTrainCarriage но не понял как использовать.
 

sat0ry

Известный
1,092
293
Здарова мужики, как хукнуть этот текст? ;-;
1648624718749.png
 

Rice.

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

DedPoet

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

Вложения

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

chapo

чопа сребдс // @moujeek
Модератор
8,866
11,562
Почему не меняется размер шрифта в Mimgui?
Lua:
imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
    imgui.DarkTheme()
    local fontpath = getFolderPath(0x14) .. '\\ProggyCleanConsole.ttf'

    --==[ FONT ]==--
    local defGlyph = imgui.GetIO().Fonts.ConfigData.Data[0].GlyphRanges
    imgui.GetIO().Fonts:Clear()
    local font_config = imgui.ImFontConfig()
    font_config.SizePixels = 14.0 -- если изменить 14 на любое другое число, то ничего не изменится
    font_config.GlyphExtraSpacing.x = 0.1
    local def = imgui.GetIO().Fonts:AddFontFromFileTTF(fontpath, font_config.SizePixels, font_config, defGlyph)
end)
 

Rice.

Известный
Модератор
1,756
1,624
Всем привет, есть скрипт от Akionka для автологина. Можете помочь обьяснить как вытаскивать значения в json в imgui.InputText? Чтобы пароль менялся при смене сервера в imgui.InputText.
Я бы сделал так:
Lua:
-- Предположим, что у тебя на данный момент такая таблица:
-- В каждой строчке будут данные вида: Проект, Сервер, Ник, Пароль.
local base = {
    {'Arizona', 'Yuma', 'Yuki_Rice', '123456'},
    {'Arizona', 'Mesa', 'Tomas_Shelby', '228777'}
}

-- Вторая таблица - список серверов
-- В каждой строчке будут данные вида: Сервер, IP (без порта)
local servers = {
    {'Yuma', '185.169.134.107'},
    {'Mesa', '185.169.134.59'}
}

-- Остальные переменные
local nick, server, pass, name_server = '', '', '', ''

-- main()
nick = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) -- Получаем ник игрока при запуске
server = select(1, sampGetCurrentServerAddress()) -- Получаем IP сервера
for i = 1, #servers do -- Получаем название нашего сервера
    if tostring(servers[i][2]) == tostring(server) then
        name_server = servers[i][1]
    end
end
for i = 1, #base do -- Получаем пароль от нашего аккаунта
    if (tostring(base[i][3]) == tostring(nick)) and (tostring(base[i][2]) == tostring(name_server)) then
        pass = base[i][4]
    end
end
print(pass) -- Выводит наш пароль
UPD:
Lua:
-- Осталось только ввести наш пароль в инпут
-- Дополнение к коду выше:
password = imgui.ImBuffer(pass, 256) -- ДОБАВЛЯТЬ ПОСЛЕ ПОЛУЧЕНИЯ ПАРОЛЯ

-- Imgui:
imgui.InputText('Password', password)
 
Последнее редактирование: