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

sizeoftrickster

Известный
Проверенный
138
598
Как узнать все хендлы тачек в зоне стрима я знал. Мне бы способ как над ними всеми их id поставить
Lua:
require('moonloader')

function main()

    local font = renderCreateFont('Arial', 10, 5)

    while (true) do
        --[[
            Wiki -> https://wiki.blast.hk/ru/moonloader/lua/getAllVehicles
            Перебираем массив хэндлов транспорта, value = Handle
        ]]--
        for key, value in ipairs(getAllVehicles()) do
            --[[ Проверяем на наличие транспорта на экране ]]
            if (isCarOnScreen(value)) then
                --[[ Получаем 3D Coords транспорта ]]
                local posX, posY, posZ = getCarCoordinates(value)
                --[[ Получаем Screen Coords транспорта ]]
                local x, y = convert3DCoordsToScreen(posX, posY, posZ)
                renderFontDrawText(font, string.format('Car: %s | ID: %d\nServerID: %d', getGxtText(getNameOfVehicleModel(getCarModel(value))), getCarModel(value), select(2, sampGetVehicleIdByCarHandle(value))), x, y, -1)
            end
        end
        wait(0)
    end
end
 
  • Нравится
Реакции: DeKzer
D

deleted-user-216129

Гость
Возможно ли реализовать нейросеть на луа?
Конечно. Но имеет ли это смысл в ГТА(если ты конечно про неё). Когда я пытался запустить - фпс при обучение конкретно так проседал.
Вот код нейронки (самой простенькой).

Как экспортировать шрифт в base85? Просто у фипа в fa-icons.lua название есть, а файл с помощью которого он это сделал - не нашёл.
Код фипа:
-- Exported using binary_to_compressed_lua.cpp
gitlab.com

Как экспортировать шрифт в base85? Просто у фипа в fa-icons.lua название есть, а файл с помощью которого он это сделал - не нашёл.
Код фипа:
-- Exported using binary_to_compressed_lua.cpp
gitlab.com
Решение
1. Качаем файл с темы про картинки в mimgui
2. Открываем папку с файлом в cmd
3. Пишем « b2c_lua.exe -base85 ШРИФТ.ttf ПЕРЕМЕННАЯ > НАЗВАНИЕ_ФАЙЛА.lua »
4. Смотрим что получилось в файле который вы указали выше (НАЗВАНИЕ_ФАЙЛА.lua)
 
Последнее редактирование модератором:

Markelov9999

Участник
73
2
Берёшь любой HEX цвет и добавляешь к нему 0x
Например берём белый цвет (FFFFFF). Итог: 0xFFFFFF
Это то понятно.
Но к примеру на рендерах на игроках у меня лично в скрипте не работает HEX код.
У когда который работает, который привёл выше, на 2 символа больше чем в HEX
 

Rice.

Известный
Модератор
1,760
1,712
Это то понятно.
Но к примеру на рендерах на игроках у меня лично в скрипте не работает HEX код.
У когда который работает, который привёл выше, на 2 символа больше чем в HEX
0xFF и цвет. Пример: 0xFFFF0000 (FF0000 - красный)
 
  • Нравится
Реакции: Markelov9999

Kegwineye.

Участник
478
21
тут нихуя не написано как сделать так же
134094
 

Rice.

Известный
Модератор
1,760
1,712
тут нихуя не написано как сделать так же
134094
Что тебе именно нужно? Почему мы должны гадать? Тебе скинули тему с исходником, там всё нормально написано, как сделать уведомление. Если тебе не это нужно, то ты так и скажи.
 

Kegwineye.

Участник
478
21
там тоже..

Что тебе именно нужно? Почему мы должны гадать? Тебе скинули тему с исходником, там всё нормально написано, как сделать уведомление. Если тебе не это нужно, то ты так и скажи.
мне нужно приблеженное к тому имгуи нотификейшону.
 

Rice.

Известный
Модератор
1,760
1,712
там тоже..


мне нужно приблеженное к тому имгуи нотификейшону.
Открываешь тему (https://www.blast.hk/threads/21619/) > читаешь её > смотришь пример > открываешь свой луа скрипт > пытаешься написать код.
Необязательно идти за всеми вопросами сюда. Ты должен учиться, а не копипастить ответы от других пользователей.
UPD: Можешь попробовать эту версию - https://www.blast.hk/threads/25927/
 

Corrygan228

Участник
132
9
Хотел сделать чекер, не могу понять в чём ошибка...
Вроде всё правильно, но если прописываю /leaders и включаю чекбокс, то текст видно
Lua:
local sampev = require 'samp.events'

--imgui.OnDrawFrame()
    imgui.Checkbox(u8'Включить чекер', leader_checker)

function sampev.OnServerMessage(color, text)
    if leader_checker.v == true and text:find('Лидеры онлайн:') then
        return false
    end

    if leader_checker.v == true and text:find('{FFFFFF}(%W+ %W+)%[(%d+)%] %- {(.*)}(.*) | Номер: (%d+){FFFFFF}') then
        ld_name, ld_surname, ld_id, ld_clr, ld_org, ld_number = text:match('{FFFFFF}(%W+ %W+)%[(%d+)%] %- {(.*)}(.*) | Номер: (%d+){FFFFFF}')
        return false
    end
end
Текст из чат лога:
Лидеры онлайн:
{FFFFFF}Кален Триплекс[385] - {DF01D7}Черная кошка | Номер: 4786806{FFFFFF}
{FFFFFF}Айс МакБан[472] - {04B404}Фантомасы | Номер: 8490209{FFFFFF}
 

moreveal

Известный
988
721
Lua:
function onScriptTerminate(s, q)
    if s == thisScript() and not q then
        thisScript():reload()
    end
end
Скрипт может быть намеренно выключен с помощью ScriptManager, например, и тогда он запустится вновь. Мне нужно, чтобы он перезапускался лишь после того, как крашнулся(