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

ARMOR

kjor32 is legend
Модератор
4,845
6,065
Но если сажусь в авто, все отлично. Кикает когда сажусь в лодку/мавер, так как на них нету фар.
Нужно сделать проверку именно в тачке ли я, или за другим т/с
Lua:
bool result = isCharInAnyBoat(Ped ped) -- Проверка на то в лодке пед, или нет
bool result = isCharInAnyHeli(Ped ped) -- Проверка на то в вертолете пед, или нет
bool result = isCharInAnyPlane(Ped ped) -- Проверка на то в самолете пед, или нет
bool result = isCharOnAnyBike(Ped ped) -- Проверка на то в велосепеде пед, или нет
 

Vadimka3636

Известный
48
35
Но если сажусь в авто, все отлично. Кикает когда сажусь в лодку/мавер, так как на них нету фар.
Нужно сделать проверку именно в тачке ли я, или за другим т/с
Я так понял, что ischarinanycar делает проверку не на авто, а на любой транспорт. Сделайте исключение на функции, которые в комментарии выше, думаю должно заработать
 

Vadimka3636

Известный
48
35
Сделал так:
Lua:
if isCharInAnyCar(PLAYER_PED) and not isCharInAnyBoat(PLAYER_PED) and not isCharInAnyHeli(PLAYER_PED) and not isCharInAnyPlane(PLAYER_PED) and not isCharOnAnyBike(PLAYER_PED) and isCarEngineOn(storeCarCharIsInNoSave(playerPed)) and not isCarLightsOn(storeCarCharIsInNoSave(playerPed)) then
    sampSendChat("/lights")
end
Вроде работает, не кикает

Теперь у меня следущий вопрос)
Пример:
text = "Просто рандомный текст"
sampAddChatMessage(text,-1)
У меня есть переменная с текстом, как мне получить из неё только 2 первых буквы?
Чтоб в чат вывело только "Пр"
string.sub(text, 1, 2) -- вроде так
 

Mico

Активный
246
46
Как исправить?
Код:
imgui.PushFont(fa_font2)
imgui.Button(fa.ICON_FA_ANGLE_LEFT..' Test')
imgui.PopFont()

Поскольку у меня в скрипте разные размеры иконок, то надо постоянно менять размер, но если в кнопке имеется текст, то текст исчезает. А размер иконки меняется. А мне надо, чтобы текст не пропадал.
 

Muzaffar4ik

Новичок
4
0
Всем привет, недавно у меня появились 2 вопроса, спросите вы когда? В 2 часа ночи. Так вот, как сделать так чтобы при виде текста в чате бот прописал команду? А теперь второй вопрос, как мы знаем если авто дривер подходит ли он для лодок? Искал для лодок авто дривер но не нашел(. Помогите кто может буду очень благодарен!
 

Rice.

https://t.me/riceoff
Модератор
1,681
1,388
Как исправить?
Код:
imgui.PushFont(fa_font2)
imgui.Button(fa.ICON_FA_ANGLE_LEFT..' Test')
imgui.PopFont()

Поскольку у меня в скрипте разные размеры иконок, то надо постоянно менять размер, но если в кнопке имеется текст, то текст исчезает. А размер иконки меняется. А мне надо, чтобы текст не пропадал.
Lua:
local fa_font2 = nil
local fa_glyph_ranges = imgui.ImGlyphRanges({ fa.min_range, fa.max_range })
function imgui.BeforeDrawFrame()
    local font_config = imgui.ImFontConfig()
    font_config.MergeMode = true

    if fa_font2 == nil then
        fa_font2 = imgui.GetIO().Fonts:AddFontFromFileTTF('moonloader/resource/fonts/fa-solid-900.ttf', 30, font_config, fa_glyph_ranges)
        fa_font2 = imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14) .. '\\trebucbd.ttf', 30, nil, imgui.GetIO().Fonts:GetGlyphRangesCyrillic())
    end
end

Lua:
imgui.PushFont(fa_font2)
imgui.Button(fa.ICON_FA_ANGLE_LEFT..' Test')
imgui.PopFont()

Попробуй.
 

Mico

Активный
246
46
Lua:
local fa_font2 = nil
local fa_glyph_ranges = imgui.ImGlyphRanges({ fa.min_range, fa.max_range })
function imgui.BeforeDrawFrame()
    local font_config = imgui.ImFontConfig()
    font_config.MergeMode = true

    if fa_font2 == nil then
        fa_font2 = imgui.GetIO().Fonts:AddFontFromFileTTF('moonloader/resource/fonts/fa-solid-900.ttf', 30, font_config, fa_glyph_ranges)
        fa_font2 = imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14) .. '\\trebucbd.ttf', 30, nil, imgui.GetIO().Fonts:GetGlyphRangesCyrillic())
    end
end

Lua:
imgui.PushFont(fa_font2)
imgui.Button(fa.ICON_FA_ANGLE_LEFT..' Test')
imgui.PopFont()

Попробуй.
Вместо иконки - знак вопроса.
 

qdIbp

Автор темы
Проверенный
1,387
1,139
Вместо иконки - знак вопроса.
Прошу к ознакомлению
 

Mico

Активный
246
46
Прошу к ознакомлению
дело в том что у меня иконки в скрипте разных размеров ( в основном меню - большие), в другом месте они меньше, а если через PushFont делать, то текст исчезает
 

Rice.

https://t.me/riceoff
Модератор
1,681
1,388
дело в том что у меня иконки в скрипте разных размеров ( в основном меню - большие), в другом месте они меньше, а если через PushFont делать, то текст исчезает
Ты же не вот так поставил?
Lua:
imgui.PushFont(fa_font2)
imgui.Button(u8(fa.ICON_FA_ANGLE_LEFT..' Test'))
imgui.PopFont()
А вот так:
Lua:
imgui.PushFont(fa_font2)
imgui.Button(fa.ICON_FA_ANGLE_LEFT .. u8' Test')
imgui.PopFont()
 

Alkoigel

Участник
116
15
Ребята как сделать так чтобы при виде такста в чате прописалась команда

Lua:
local sampev = require("lib.samp.events")

function sampev.onServerMessage(color, text)
 if text:find("текст сервера (.+)") then
  sampAddChatMessage("текст на который заменить"..text, -1)
  return false
 end
end

если хочешь именно команду серверу -замени SampAddChatMessage на SampSendChat("text btw. command")
 
Последнее редактирование:

Mico

Активный
246
46
Ты же не вот так поставил?
Lua:
imgui.PushFont(fa_font2)
imgui.Button(u8(fa.ICON_FA_ANGLE_LEFT..' Test'))
imgui.PopFont()
А вот так:
Lua:
imgui.PushFont(fa_font2)
imgui.Button(fa.ICON_FA_ANGLE_LEFT .. u8' Test')
imgui.PopFont()
Ну я еще не настолько "гений", чтобы перед иконкой ставить u8))


Самое лучшее решение - перейти на mimgui
 

IT clown

Участник
45
2
Как сделать чтобы при активном тоггл баттоне, появлялась кнопка, а при выключено пропадала

1656698638833.png
1656698665785.png
Lua:
if imgui.ToggleButton(u8"Включить", u8"Выключить", var3) then
    Obhod = not Obhod
    if Obhod then
        sampAddChatMessage("запущен",-1)
    else
        sampAddChatMessage("выключен",-1)
    end
end
imgui.SameLine()
imgui.Text(u8'                                  ')
imgui.SameLine()
if imgui.Button(u8"Релог") then -- Кодируем название кнопки

function imgui.ToggleButton(label, label_true, bool, a_speed)
    local p  = imgui.GetCursorScreenPos()
    local dl = imgui.GetWindowDrawList()
 
    local bebrochka = false

    local label      = label or ""                          -- Текст false
    local label_true = label_true or ""                     -- Текст true
    local h          = imgui.GetTextLineHeightWithSpacing() -- Высота кнопки
    local w          = h * 1.7                              -- Ширина кнопки
    local r          = h / 2                                -- Радиус кружка
    local s          = a_speed or 0.2                       -- Скорость анимации
 
    local function ImSaturate(f)
        return f < 0.0 and 0.0 or (f > 1.0 and 1.0 or f)
    end
 
    local x_begin = bool[0] and 1.0 or 0.0
    local t_begin = bool[0] and 0.0 or 1.0
 
    if LastTime == nil then
        LastTime = {}
    end
    if LastActive == nil then
        LastActive = {}
    end
 
    if imgui.InvisibleButton(label, imgui.ImVec2(w, h)) then
        bool[0] = not bool[0]
        LastTime[label] = os.clock()
        LastActive[label] = true
        bebrochka = true
    end

    if LastActive[label] then
        local time = os.clock() - LastTime[label]
        if time <= s then
            local anim = ImSaturate(time / s)
            x_begin = bool[0] and anim or 1.0 - anim
            t_begin = bool[0] and 1.0 - anim or anim
        else
            LastActive[label] = false
        end
    end
 
    local bg_color = imgui.ImVec4(x_begin * 0.13, x_begin * 0.9, x_begin * 0.13, imgui.IsItemHovered(0) and 0.7 or 0.9) -- Цвет прямоугольника
    local t_color  = imgui.ImVec4(1, 1, 1, x_begin) -- Цвет текста при false
    local t2_color = imgui.ImVec4(1, 1, 1, t_begin) -- Цвет текста при true
 
    dl:AddRectFilled(imgui.ImVec2(p.x, p.y), imgui.ImVec2(p.x + w, p.y + h), imgui.GetColorU32Vec4(bg_color), r)
    dl:AddCircleFilled(imgui.ImVec2(p.x + r + x_begin * (w - r * 2), p.y + r), t_begin < 0.5 and x_begin * r or t_begin * r, imgui.GetColorU32Vec4(imgui.ImVec4(0.9, 0.9, 0.9, 1.0)), r + 5)
    dl:AddText(imgui.ImVec2(p.x + w + r, p.y + r - (r / 2) - (imgui.CalcTextSize(label).y / 4)), imgui.GetColorU32Vec4(t_color), label_true)
    dl:AddText(imgui.ImVec2(p.x + w + r, p.y + r - (r / 2) - (imgui.CalcTextSize(label).y / 4)), imgui.GetColorU32Vec4(t2_color), label)
    return bebrochka
end