Вопросы по 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,846
6,100
Но если сажусь в авто, все отлично. Кикает когда сажусь в лодку/мавер, так как на них нету фар.
Нужно сделать проверку именно в тачке ли я, или за другим т/с
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.

Известный
Модератор
1,699
1,467
Как исправить?
Код:
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,388
1,146
Вместо иконки - знак вопроса.
Прошу к ознакомлению
 

Mico

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

Rice.

Известный
Модератор
1,699
1,467
дело в том что у меня иконки в скрипте разных размеров ( в основном меню - большие), в другом месте они меньше, а если через 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