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

P3rsik

Активный
213
32
Lua:
    imgui.Text(u8"Сейчас рванит: RVANKA FOR ALL(VEH)")
как приподать тексту цвет? и где их брать ид цветов
Lua:
function imgui.TextColoredRGB(text, shadow, wrapped)
    local style = imgui.GetStyle()
    local colors = style.Colors

    local designText = function(text)
        local pos = imgui.GetCursorPos()
        for i = 1, 1 do
            imgui.SetCursorPos(imgui.ImVec2(pos.x + i, pos.y))
            imgui.TextColored(imgui.ImVec4(0, 0, 0, 1), text)
            imgui.SetCursorPos(imgui.ImVec2(pos.x - i, pos.y))
            imgui.TextColored(imgui.ImVec4(0, 0, 0, 1), text)
            imgui.SetCursorPos(imgui.ImVec2(pos.x, pos.y + i))
            imgui.TextColored(imgui.ImVec4(0, 0, 0, 1), text)
            imgui.SetCursorPos(imgui.ImVec2(pos.x, pos.y - i))
            imgui.TextColored(imgui.ImVec4(0, 0, 0, 1), text)
        end
        imgui.SetCursorPos(pos)
    end

    text = text:gsub('{(%x%x%x%x%x%x)}', '{%1FF}')
    local render_func = wrapped and imgui_text_wrapped or function(clr, text)
        if clr then imgui.PushStyleColor(ffi.C.ImGuiCol_Text, clr) end
        if shadow then designText(text) end
        imgui.TextUnformatted(text)
        if clr then imgui.PopStyleColor() end
    end

    local split = function(str, delim, plain)
        local tokens, pos, i, plain = {}, 1, 1, not (plain == false)
        repeat
            local npos, epos = string.find(str, delim, pos, plain)
            tokens[i] = string.sub(str, pos, npos and npos - 1)
            pos = epos and epos + 1
            i = i + 1
        until not pos
        return tokens
    end

    local color = colors[ffi.C.ImGuiCol_Text]
    for _, w in ipairs(split(text, '\n')) do
        local start = 1
        local a, b = w:find('{........}', start)
        while a do
            local t = w:sub(start, a - 1)
            if #t > 0 then
                render_func(color, t)
                imgui.SameLine(nil, 0)
            end

            local clr = w:sub(a + 1, b - 1)
            if clr:upper() == 'STANDART' then color = colors[ffi.C.ImGuiCol_Text]
            else
                clr = tonumber(clr, 16)
                if clr then
                    local r = bit.band(bit.rshift(clr, 24), 0xFF)
                    local g = bit.band(bit.rshift(clr, 16), 0xFF)
                    local b = bit.band(bit.rshift(clr, 8), 0xFF)
                    local a = bit.band(clr, 0xFF)
                    color = imgui.ImVec4(r / 255, g / 255, b / 255, a / 255)
                end
            end

            start = b + 1
            a, b = w:find('{........}', start)
        end
        imgui.NewLine()
        if #w >= start then
            imgui.SameLine(nil, 0)
            render_func(color, w:sub(start))
        end
    end
end

--onframe
imgui.TextColoredRGB('{0984d2}Script')

 
  • Нравится
Реакции: Enlizmee

Enlizmee

Активный
480
102
Lua:
imgui.InputText(u8" ", inputid)
if inputid == "" then
    imgui.Text(u8"Введите ID жертвы")
else
    imgui.Text(u8"Жертва: "..sampGetPlayerNickname(inputid)..""..[inputid].."")
end
как облегчить код, давненько в lua не сидел xd
 

W1ll04eison

Участник
328
19
Как читать .txt файл?
Через функцию у меня строки из чата записываются в файл, как это выглядит в файле:

[13.12.2021|20:07:15] <-Grigor_Melkov[199] to Eldar_Mamedov[7]: Да, можно
[13.12.2021|20:20:01] <-Grigor_Melkov[199] to Fedos_Black[12]: Через форум
[13.12.2021|21:00:10] PayDay
и т.д

Как мне вести подсчёт ответов и пойманых PayDay и затем выводить в окне imgui?
Что бы в имгуи это выглядело подобным образом:

Дата: 13.12.2021 | Ответов: 12 | PayDay: 2
Дата: 14.12.2021 | Ответов: 50| PayDay: 12
Дата: 15.12.2021 | Ответов: 2| PayDay: 1

Так же что-бы было разделение по датам(как я написал выше) .

Буду благодарен за помощь
 

YourAssistant

Участник
144
17
Нужна помощь. Если text_chat1 существует, поместить ее в mark_patrol[3], при следующем вызове поместить в mark_patrol[4] и так далее, но не выходит. В чем проблема?

Lua:
local mark_patrol = {"1", "2", "e", "f", "r", "v", "w", "x", "o"}

function cmde()
    local text_chat = sampGetChatString(99)
    if text_chat then
        local text_chat1 = string.match(text_chat, "%u-%d+")
        local sub_ text_chat1 = "ite"
        local k = "3"
        for i = k, k do
            if text_chat1 and text_chat1 ~= sub_ text_chat1 then
                mark_patrol[i] = text_chat1
                local sub_ text_chat1 = text_chat1
                local k = k + 1
            end
        end
    end
    sampAddChatMessage(mark_patrol[3] .. mark_patrol[4] .. mark_patrol[5] .. mark_patrol[6], -1)
end
 

TrixTM

Участник
83
26
Нужна помощь. Если text_chat1 существует, поместить ее в mark_patrol[3], при следующем вызове поместить в mark_patrol[4] и так далее, но не выходит. В чем проблема?

Lua:
local mark_patrol = {"1", "2", "e", "f", "r", "v", "w", "x", "o"}

function cmde()
    local text_chat = sampGetChatString(99)
    if text_chat then
        local text_chat1 = string.match(text_chat, "%u-%d+")
        local sub_ text_chat1 = "ite"
        local k = "3"
        for i = k, k do
            if text_chat1 and text_chat1 ~= sub_ text_chat1 then
                mark_patrol[i] = text_chat1
                local sub_ text_chat1 = text_chat1
                local k = k + 1
            end
        end
    end
    sampAddChatMessage(mark_patrol[3] .. mark_patrol[4] .. mark_patrol[5] .. mark_patrol[6], -1)
end
что это должно делать вообще? в чем суть?
 

chapo

чопа сребдс // @moujeek
Модератор
8,862
11,550
Почему при использовании script.load игра зависает?
Lua:
                local newScript = script.load("D:\\SAMP_CHEATS\\moonloader\\resource\\ENG_v3.55_VisualAccessories_by_chapo_v3.55.lua")
                if newScript == nil then
                    print('script '..toLoad[i]..' was not loaded :(')
                else
                    print(newScript.filename..' loaded!')
                end
 

Mr.Mastire222

Известный
530
260
Почему при использовании script.load игра зависает?
Lua:
                local newScript = script.load("D:\\SAMP_CHEATS\\moonloader\\resource\\ENG_v3.55_VisualAccessories_by_chapo_v3.55.lua")
                if newScript == nil then
                    print('script '..toLoad[i]..' was not loaded :(')
                else
                    print(newScript.filename..' loaded!')
                end
возможно он не может найти библиотеки папку lib?
 

meowprd

Тот самый Котовский
Проверенный
1,278
718
Почему при использовании script.load игра зависает?
Lua:
                local newScript = script.load("D:\\SAMP_CHEATS\\moonloader\\resource\\ENG_v3.55_VisualAccessories_by_chapo_v3.55.lua")
                if newScript == nil then
                    print('script '..toLoad[i]..' was not loaded :(')
                else
                    print(newScript.filename..' loaded!')
                end
А так скрипт сам по себе нормально запускается?
 

chapo

чопа сребдс // @moujeek
Модератор
8,862
11,550
А так скрипт сам по себе нормально запускается?
да. Даже если сделать так, то все работает норм:
Lua:
    sampfuncsRegisterConsoleCommand('loadlua', function(arg)
        script.load(arg)
    end)
а так игра зависает

Скрытое содержимое для пользователя(ей):
 

shrug228

Активный
212
75
Почему при использовании script.load игра зависает?
Lua:
                local newScript = script.load("D:\\SAMP_CHEATS\\moonloader\\resource\\ENG_v3.55_VisualAccessories_by_chapo_v3.55.lua")
                if newScript == nil then
                    print('script '..toLoad[i]..' was not loaded :(')
                else
                    print(newScript.filename..' loaded!')
                end
Использовать, как аргумент просто название скрипта без пути пробовал?
 

meowprd

Тот самый Котовский
Проверенный
1,278
718
да. Даже если сделать так, то все работает норм:
Lua:
    sampfuncsRegisterConsoleCommand('loadlua', function(arg)
        script.load(arg)
    end)
а так игра зависает

*** Скрытый текст не может быть процитирован. ***
Дома буду, закину код, гляну твой за одно
 
  • Влюблен
Реакции: chapo

chapo

чопа сребдс // @moujeek
Модератор
8,862
11,550
Использовать, как аргумент просто название скрипта без пути пробовал?
мне надо загружать скрипты не из папки moonloader, прочитай мой ответ выше (через вызов функции через консоль все работает), проблема не в пути