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

Ononimus

Потрачен
60
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Бл, чел…
Тебе сказали смотреть все уроки по несколько раз каждый на ютуб канале The Champ Guess

А посмотрел бы внимательно гайды - не писал бы таких вопросов
Lua:
--остальной код вырезал чтобы ты увидел

-- Само Imgui окно --

function imgui.OnDrawFrame()
    sampSendChat('/myrating')
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(555, 180), imgui.Cond.FirstUseEver)
    imgui.Begin(u8"Репорт PLUS", main_window_state, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoCollapse)
    imgui.Text(u8'Репорт от: ' .. mainIni.config.nick)
    imgui.Text(u8'Репорт: ' .. u8(mainIni.config.report))
    imgui.Text(' ')
    imgui.PushItemWidth(220)
    if imgui.InputText(u8'Ответить на репорт', text_buffer, imgui.InputTextFlags.EnterReturnsTrue) then
        imgui.PopItemWidth(50)
        mainIni.config.otvet = text_buffer.v
        inicfg.save(mainIni, directIni)
        sampSendChat('/pm ' .. mainIni.config.id .. ' ' .. u8:decode(mainIni.config.otvet), -1)
    end
    imgui.Text(' ')
    imgui.SetCursorPos(imgui.ImVec2(450, 150))
    if imgui.HotKey('##1', ActiveClockMenu, tLastKey, 100) then
        rkeys.changeHotKey(bindClock, ActiveClockMenu.v)
        mainIni.config.bindClock = encodeJson(ActiveClockMenu.v)
        inicfg.save(mainIni, directIni)
    end
    imgui.SameLine(320)
    imgui.Text(u8'Комбинация клавиш:')
    imgui.SameLine(0)
    imgui.SetCursorPos(imgui.ImVec2(350, 80))
    imgui.BeginChild(u8'Ваша статистика', imgui.ImVec2(200, 65), true)
    imgui.Text(u8'Ваш ник: ' .. nick .. '[' .. idp .. ']')
    imgui.Text(u8'Дата: ' .. os.date("%d") .. '.' .. os.date("%m") .. '.' .. os.date("%Y"))
    imgui.Text(u8'Общее кол-во репортов: ' .. mainIni.config.raiting)
    imgui.EndChild()
    imgui.End()
end
не робит :)))
 
  • Злость
Реакции: YarikVL

Smeruxa

smeruxa.ru
Проверенный
1,428
788
и как это сделать? не мой скрипт просто
он у тебя декомпилированный, ты ни как его не запустишь, только переписывать

вместо
Lua:
 if nick then
        mainIni.config.nick = nick
        inicfg.save(mainIni, directIni)
    end
    if id then
        mainIni.config.id = id
        inicfg.save(mainIni, directIni)
    end
    if report then
        mainIni.config.report = report
        inicfg.save(mainIni, directIni)
    end
сделай

Lua:
    mainIni.config.nick = nick
    mainIni.config.id = id
    mainIni.config.report = report
    inicfg.save(mainIni, directIni)
Чел, пожалуйста, не пиши если не знаешь точно, это же бред
 
  • Нравится
Реакции: copypaste_scripter

Ononimus

Потрачен
60
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ребят хелпуйте почему кикает за флуд калл бэк
код:
local sampev = require 'lib.samp.events'
local inicfg = require 'inicfg'
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
CP1251 = encoding.CP1251

-- ini файл --

local directIni = 'moonloader\\config\\report-plus.ini'
local mainIni = inicfg.load({
    config = {
        bindClock = "[18,82]",
        nick = Nick_Name,
        id = 0,
        raiting = 0,
        report = Помогите,
        otvet = Иду
    }
}, directIni)
if not doesFileExist("moonloader/config/report-plus.ini") then inicfg.save(mainIni, "report-plus.ini") end

-- Imgui окно --

local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(tostring(mainIni.config.otvet), 256)
local sw, sh = getScreenResolution()
local rkeys = require 'rkeys'
imgui.HotKey = require ('imgui_addons').HotKey
local tLastKeys = {}
local ActiveClockMenu = {
    v = decodeJson(mainIni.config.bindClock)
}

-- Жёлтое Imgui окно --

function apply_custom_style()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4
 
    style.WindowRounding = 2.0
    style.WindowTitleAlign = imgui.ImVec2(0.5, 0.84)
    style.ChildWindowRounding = 2.0
    style.FrameRounding = 2.0
    style.ItemSpacing = imgui.ImVec2(5.0, 4.0)
    style.ScrollbarSize = 13.0
    style.ScrollbarRounding = 0
    style.GrabMinSize = 8.0
    style.GrabRounding = 1.0

    colors[clr.FrameBg]                = ImVec4(0.76, 0.6, 0, 0.74)--
    colors[clr.FrameBgHovered]         = ImVec4(0.84, 0.68, 0, 0.83)--
    colors[clr.FrameBgActive]          = ImVec4(0.92, 0.77, 0, 0.87)--
    colors[clr.TitleBg]                = ImVec4(0.04, 0.04, 0.04, 1.00)--
    colors[clr.TitleBgActive]          = ImVec4(0.92, 0.77, 0, 0.85)--
    colors[clr.TitleBgCollapsed]       = ImVec4(0.00, 0.00, 0.00, 0.51)--
    colors[clr.CheckMark]              = ImVec4(1.00, 1.00, 1.00, 1.00)
    colors[clr.SliderGrab]             = ImVec4(0.84, 0.68, 0, 1.00)
    colors[clr.SliderGrabActive]       = ImVec4(0.92, 0.77, 0, 1.00)
    colors[clr.Button]                 = ImVec4(0.76, 0.6, 0, 0.85)
    colors[clr.ButtonHovered]          = ImVec4(0.84, 0.68, 0, 1.00)
    colors[clr.ButtonActive]           = ImVec4(0.92, 0.77, 0, 1.00)
    colors[clr.Header]                 = ImVec4(0.84, 0.68, 0, 0.75)
    colors[clr.HeaderHovered]          = ImVec4(0.84, 0.68, 0, 0.90)
    colors[clr.HeaderActive]           = ImVec4(0.92, 0.77, 0, 1.00)
    colors[clr.Separator]              = colors[clr.Border]
    colors[clr.SeparatorHovered]       = ImVec4(0.84, 0.68, 0, 0.78)
    colors[clr.SeparatorActive]        = ImVec4(0.84, 0.68, 0, 1.00)
    colors[clr.ResizeGrip]             = ImVec4(0.76, 0.6, 0, 0.25)
    colors[clr.ResizeGripHovered]      = ImVec4(0.84, 0.68, 0, 0.67)
    colors[clr.ResizeGripActive]       = ImVec4(0.92, 0.77, 0, 0.95)
    colors[clr.TextSelectedBg]         = ImVec4(0.52, 0.34, 0, 0.85)
    colors[clr.Text]                   = ImVec4(1.00, 1.00, 1.00, 1.00)
    colors[clr.TextDisabled]           = ImVec4(0.50, 0.50, 0.50, 1.00)
    colors[clr.WindowBg]               = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.ChildWindowBg]          = ImVec4(1.00, 1.00, 1.00, 0.00)
    colors[clr.PopupBg]                = ImVec4(0.08, 0.08, 0.08, 0.94)
    colors[clr.ComboBg]                = colors[clr.PopupBg]
    colors[clr.Border]                 = ImVec4(0.43, 0.43, 0.50, 0.50)
    colors[clr.BorderShadow]           = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.MenuBarBg]              = ImVec4(0.14, 0.14, 0.14, 1.00)
    colors[clr.ScrollbarBg]            = ImVec4(0.02, 0.02, 0.02, 0.53)
    colors[clr.ScrollbarGrab]          = ImVec4(0.31, 0.31, 0.31, 1.00)
    colors[clr.ScrollbarGrabHovered]   = ImVec4(0.41, 0.41, 0.41, 1.00)
    colors[clr.ScrollbarGrabActive]    = ImVec4(0.51, 0.51, 0.51, 1.00)
    colors[clr.CloseButton]            = ImVec4(0.41, 0.41, 0.41, 0.50)
    colors[clr.CloseButtonHovered]     = ImVec4(0.98, 0.39, 0.36, 1.00)
    colors[clr.CloseButtonActive]      = ImVec4(0.98, 0.39, 0.36, 1.00)
    colors[clr.PlotLines]              = ImVec4(0.61, 0.61, 0.61, 1.00)
    colors[clr.PlotLinesHovered]       = ImVec4(1.00, 0.43, 0.35, 1.00)
    colors[clr.PlotHistogram]          = ImVec4(0.90, 0.70, 0.00, 1.00)
    colors[clr.PlotHistogramHovered]   = ImVec4(1.00, 0.60, 0.00, 1.00)
    colors[clr.ModalWindowDarkening]   = ImVec4(0.80, 0.80, 0.80, 0.35)
end
apply_custom_style()

-- Главная Функция --

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    sampAddChatMessage('{ffff00}[Репорт PLUS] {FFFFFF}Скрипт успешно загружен!')
    sampAddChatMessage('{ffff00}[Репорт PLUS] {FFFFFF}Активация: /as или ' .. table.concat(rkeys.getKeysName(ActiveClockMenu.v), " + "))
    sampAddChatMessage('{ffff00}[Репорт PLUS] {FFFFFF}Автор: Sadow')

    sampRegisterChatCommand('as', cmd_as)

    imgui.Process = false

    bindClock = rkeys.registerHotKey(ActiveClockMenu.v, true, clockFunc)


    while true do
        wait(0)

        if main_window_state.v == false then
            imgui.Process = false
        end

        while not isSampAvailable() do
            wait(0)
           end
           _, idp = sampGetPlayerIdByCharHandle(PLAYER_PED)
           nick = sampGetPlayerNickname(idp)

    end
end

-- Команда /as --

function cmd_as(arg)
    main_window_state.v = not main_window_state.v
    imgui.Process = main_window_state.v
end

-- Функция с комбинацией клавиш --

function clockFunc()
    cmd_as()
end

-- Переменные необходимые для Imgui окна --

function sampev.onServerMessage(color, text)
    local text = text:gsub('{......}', '')
    if text:find('Ваш рейтинг игрового помощника: (%d+)') then
        mainIni.config.raiting = text:match('Ваш рейтинг игрового помощника: (%d+)')
        inicfg.save(mainIni, directIni)
    end
    if text:find('%[Вопрос%] (.+)%[(%d+)%]: (.+)') then
        mainIni.config.nick, mainIni.config.id, mainIni.config.report = text:match('%[Вопрос%] (.+)%[(%d+)%]: (.+)')
        inicfg.save(mainIni, directIni)
    end
    if text:match('%[Вопрос%] (.+)') then
        sampAddChatMessage('{ffff00}[Репорт PLUS] {FFFFFF}Чтобы ответить на репорт введите /as или ' .. table.concat(rkeys.getKeysName(ActiveClockMenu.v), " + "))
    end
end

-- Функция информации в Imgui окне --

function imgui.Ques(text)
    imgui.SameLine()
    imgui.TextDisabled("(?)")
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.TextUnformatted(u8(text))
        imgui.EndTooltip()
    end
end

-- Само Imgui окно --

function imgui.OnDrawFrame()
    sampSendChat('/myrating')
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(555, 180), imgui.Cond.FirstUseEver)
    imgui.Begin(u8"Репорт PLUS", main_window_state, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoCollapse)
    imgui.Text(u8'Репорт от: ' .. mainIni.config.nick)
    imgui.Text(u8'Репорт: ' .. u8(mainIni.config.report))
    imgui.Text(' ')
    imgui.PushItemWidth(220)
    if imgui.InputText(u8'Ответить на репорт', text_buffer, imgui.InputTextFlags.EnterReturnsTrue) then
        imgui.PopItemWidth(50)
        mainIni.config.otvet = text_buffer.v
        inicfg.save(mainIni, directIni)
        sampSendChat('/pm ' .. mainIni.config.id .. ' ' .. u8:decode(mainIni.config.otvet))
    end
    imgui.Text(' ')
    imgui.SetCursorPos(imgui.ImVec2(450, 150))
    if imgui.HotKey('##1', ActiveClockMenu, tLastKey, 100) then
        rkeys.changeHotKey(bindClock, ActiveClockMenu.v)
        mainIni.config.bindClock = encodeJson(ActiveClockMenu.v)
        inicfg.save(mainIni, directIni)
    end
    imgui.SameLine(320)
    imgui.Text(u8'Комбинация клавиш:')
    imgui.SameLine(0)
    imgui.SetCursorPos(imgui.ImVec2(350, 80))
    imgui.BeginChild(u8'Ваша статистика', imgui.ImVec2(200, 65), true)
    imgui.Text(u8'Ваш ник: ' .. nick .. '[' .. idp .. ']')
    imgui.Text(u8'Дата: ' .. os.date("%d") .. '.' .. os.date("%m") .. '.' .. os.date("%Y"))
    imgui.Text(u8'Общее кол-во репортов: ' .. mainIni.config.raiting)
    imgui.EndChild()
    imgui.End()
end


этот скрипт ловит репорты и выводит в имгуи окно
 
  • Bug
Реакции: xiavej и YarikVL

Smeruxa

smeruxa.ru
Проверенный
1,428
788
есть гайд или что то где смогу научится делать это? или это ваще возиожно? @Smeruxa
возможно
Вспомни как ты свои скрипты пишешь и переписывай относительно того скрипта, это не сложно
Просто на сколько я помню там порядок иногда путается и простые вещи могут расширяться на неск-ко строк, например: setCharCoordinates(x, y, z) могут разбиваться на v1 = x; v2 = y; v3 = z; setCharCoordinates(v1, v2, v3)
 
  • Нравится
Реакции: copypaste_scripter

copypaste_scripter

Известный
1,431
290
возможно
Вспомни как ты свои скрипты пишешь и переписывай относительно того скрипта, это не сложно
Просто на сколько я помню там порядок иногда путается и простые вещи могут расширяться на неск-ко строк, например: setCharCoordinates(x, y, z) могут разбиваться на v1 = x; v2 = y; v3 = z; setCharCoordinates(v1, v2, v3)
а почему не будет работать сразу такой скрипт? ведь нет разниц названия переменных?
 

Smeruxa

smeruxa.ru
Проверенный
1,428
788
а почему не будет работать сразу такой скрипт? ведь нет разниц названия переменных?
потому что потому. А так вроде там переменные просто повторяются и многа многа недочетов, там с одного места на другое прыгает код
 
  • Нравится
Реакции: copypaste_scripter

copypaste_scripter

Известный
1,431
290
можно как то сделать таймер афк? типо если окно свернуто гта чтобы пошел отсчет и выскакало окно что ВЕРНИСЬ В ИГРУ АТО ПРОЕБЕШЬ ПД

чет не нашел функцию чтобы узнать свернута игра или нет
 

F0RQU1N and

Известный
1,297
500
можно как то сделать таймер афк? типо если окно свернуто гта чтобы пошел отсчет и выскакало окно что ВЕРНИСЬ В ИГРУ АТО ПРОЕБЕШЬ ПД

чет не нашел функцию чтобы узнать свернута игра или нет
1663495646346.png

хз как ты искал)
 
  • Нравится
Реакции: copypaste_scripter