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

Орк

Известный
308
205
1734083476503.png

как отловить пустые сообщения от сервера? ни через hooks, ни через самп евентс не получается
 

chapo

чопа сребдс // @moujeek
Модератор
8,984
11,798
Как адекватно подружить ImGuiListClipper и ImGuiTextFilter? Из-за того что фильтрация находится в клиппере элементы отображаются криво
Lua:
                             local clipper = imgui.ImGuiListClipper(5);
                            clipper:Begin(#Items.list / 5, 120);
                            while (clipper:Step()) do
                                for index = clipper.DisplayStart + 1, clipper.DisplayEnd do
                                    -- print('DisplayEnd', clipper.DisplayEnd)
                                    for row = 1, 5 do
                                        local itemIndex = (index - 1) * 5+row;;
                                        if (itemIndex < #Items.list) then
                                            local item = Items.list[itemIndex];
                                            if (item) then
                                                if (ui.searchFilter:PassFilter(('%s %d %d'):format(item.name, item.model or 0, item.UID or 0))) then
                                                    drawItem(item, itemIndex, alpha);
                                                end
                                            end
                                        end
                                    end
                                end
                            end
 

Орк

Известный
308
205
regex lua: ^%s*$
%s содержит как и \n, \t и прочее
там вроде даже пробела нет

Как адекватно подружить ImGuiListClipper и ImGuiTextFilter? Из-за того что фильтрация находится в клиппере элементы отображаются криво
клиппер это кривая хуйня, разве у тебя таблица на 1000 и больше элементов, чтобы его использовать? Зачем тебе этот клиппер
 

kyrtion

Известный
1,063
381
Проверю, но имел в виду в сообщении пробел даже не возвращает.
я указал в виде регулярное выражение %s*, определяет даже если нет пробела и может быть с пробелом, а также перенос строка, табуляция
включая начиная (^) и конец ($) что гарантирует правильной работе
 
  • Нравится
Реакции: Орк

chapo

чопа сребдс // @moujeek
Модератор
8,984
11,798
Вряд ли кто-то подскажет, попробуй тут поискать https://github.com/search?q=repo:ocornut/imgui+ImGuiListClipper&type=issues
я уже забил хуй и написал свой "аналог". Но падение фпс около 30%
Lua:
local itemIndex = 1;
                            local filterPassedItemsCount = 0;
                            for _, item in ipairs(Items.list) do
                                local isFilterPassed = ui.searchFilter:PassFilter(('%s %d %d'):format(u8(Utils.toLowerCase(u8:decode(item.name))), item.modelId or 0, item.UID or 0));
                                local c = imgui.GetCursorScreenPos();
                                if (isFilterPassed) then
                                    filterPassedItemsCount = filterPassedItemsCount + 1
                                    if (imgui.IsRectVisibleVec2(c, c + imgui.ImVec2(120, 120))) then
                                        if (isFilterPassed) then
                                            drawItem(item, itemIndex, alpha);
                                        end
                                    else
                                        imgui.Dummy(imgui.ImVec2(120, 120));
                                    end
                                    if (itemIndex %5 == 0) then
                                        imgui.SetCursorPos(imgui.ImVec2(15, imgui.GetCursorPosY() + 5));
                                    else
                                        imgui.SameLine(nil, 15);
                                    end
                                    itemIndex = itemIndex + 1;
                                end
                            end

                            imgui.SetCursorPosY(imgui.GetCursorPosY() + 120 + 15);
                            imgui.PushFont(ui.font.bold[20]);
                            imgui.CenterText(filterPassedItemsCount == 0 and u8'Кажется, по вашему запросу ничего не найдено :(' or (ui.searchFilter:IsActive() and u8'Найдено предметов: ' .. filterPassedItemsCount or u8'Всего предметов: ' .. #Items.list));
                            imgui.PopFont();
 
  • Нравится
Реакции: Орк

KyRDa

Участник
89
46
Буду рад, если кто-то расскажет мне возможные причины появления этой ошибки:
error:
C++ exception
stack traceback:
stack traceback:
[C]: in function 'create'
 

papercut

Известный
125
24
Ребят, знает кто, как сделать так, чтобы при нажатии на кнопку открывалось меню (imgui.OpenPopup) и там можно было бы настроить название кнопки и текст, который будет при нажатии на эту кнопку? Открытие этого меню я уже сделала, но вот как сделать создание новых кнопок и текста для них, я что-то понять не могу :(

(На скрине видно то, что получилось на данный момент)
создание новых кнопок или переделывание существующих? В любом случае скинь часть кода чтобы можно было непосредственно помочь
А так при нажатии сохранить просто копируй popup_input.v в the_button_text.v
Что значит
текст, который будет при нажатии на эту кнопку
Тут сто баллов нужен пример кода
 
  • Нравится
Реакции: Emilia<3

Emilia<3

Участник
11
3
создание новых кнопок или переделывание существующих? В любом случае скинь часть кода чтобы можно было непосредственно помочь
А так при нажатии сохранить просто копируй popup_input.v в the_button_text.v
Что значит

Тут сто баллов нужен пример кода
Уже разобралась, взяла часть кода из флудера от Rice. А так этого самого ".v" увы нет на monetloader'е, а я пишу я с телефона, для телефонов
 
  • Нравится
Реакции: papercut

papercut

Известный
125
24
Буду рад, если кто-то расскажет мне возможные причины появления этой ошибки:
error:
C++ exception
stack traceback:
stack traceback:
[C]: in function 'create'
Трейсбек ниже приложи, тут просто написано, что произошла ошибка и все

Посмотреть вложение 259393
как отловить пустые сообщения от сервера? ни через hooks, ни через самп евентс не получается
Если хук из самп ивент срабатывает в принципе (а вообще должен), то текст там должен быть == "", то есть пустой строке
А если не срабатывает, то можно попробовать использовать onreceiverpc
 
Последнее редактирование: