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

Smeruxa

t.me/smeruxa
Проверенный
1,381
729
Как можно проверить, скачана ли та или инная библиотека и если нет, то скачать?
Библиотека? Пожалуйста
Lua:
if doesDirectoryExist(getWorkingDirectory().."\\lib\\library.lua") then
    print("exist")
else
    local CODE_LIBRARY = [[
    code
    ]]
    local f = io.open(getWorkingDirectory()..'\\lib\\library.lua', 'w')
    if f then
        f:write(CODE_LIBRARY)
        f:close()
    else
        return
    end
end
 

|| NN - NoName ||

Известный
1,049
635
Библиотека? Пожалуйста
Lua:
if doesDirectoryExist(getWorkingDirectory().."\\lib\\library.lua") then
    print("exist")
else
    local CODE_LIBRARY = [[
    code
    ]]
    local f = io.open(getWorkingDirectory()..'\\lib\\library.lua', 'w')
    if f then
        f:write(CODE_LIBRARY)
        f:close()
    else
        return
    end
end
как мне сделать так, чтобы он скачал библиотеку, если её нет.
 

Smeruxa

t.me/smeruxa
Проверенный
1,381
729
как мне сделать так, чтобы он скачал библиотеку, если её нет.
я тебе еще лучше вариант просто предложил, я тебе дал пример. просто открой файл скопируй код и вставь
Если хочешь прям скачать используй функцию
int index = downloadUrlToFile(string url, string file, function statusCallback)
 

Gorskin

{FFDEAD}
Проверенный
1,344
1,190
Подскажите как можно найти текст из локального диалога?
 

PanSeek

t.me/dailypanseek
Всефорумный модератор
908
1,777
как мне сделать так, чтобы он скачал библиотеку, если её нет.
Можно еще так. Как пример.
Lua:
local result, imgui = pcall(require, 'mimgui')

if not result then
    downloadUrlToFile(string url, string file, function statusCallback) -- зачастую выводят error('Not found lib mimgui') или что-то вроде такого
end
 
  • Нравится
Реакции: James Saula

sadbones

Известный
374
174
Как поставить метку на карте?
Lua:
setTargetBlipCoordinates(float x, float y, float z)
ESC > Карта. И правой кнопкой мыши по любому месту.
clown
 
  • Влюблен
Реакции: SurnikSur

Sanchez.

Известный
705
189
Код:
script_name('AccentManager')
script_author('Sanchez.')
script_description('Accent')

require "lib.moonloader"

local encoding = require 'encoding'
local inicfg = require 'inicfg'
local imgui = require 'imgui'
local sampev = require 'lib.samp.events'
local tag = "{00BFFF}AccentManager: "
encoding.default = 'CP1251'
u8 = encoding.UTF8

local main_window_state = imgui.ImBool(false)
local sw, sh = getScreenResolution()

local mainIni = inicfg.load({
    config = {
    accentstatus = false,
    accent = 0,
 }
 }, "AccentManager")

local accenton = imgui.ImBool(mainIni.config.accentstatus)
local text_buffer = imgui.ImBuffer(tostring(mainIni.config.accent), 40)

if not doesFileExist('moonloader/config/AccentManager.ini') then inicfg.save(mainIni, 'AccentManager.ini') end

function main()

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

    sampAddChatMessage(tag .. "{FFFFFF}Скрипт успешно загружен! Автор: {00BFFF}Sanchez.",-1)

    imgui.Process = false

    sampRegisterChatCommand("am", function()
        main_window_state.v = not main_window_state.v

        imgui.Process = main_window_state.v


    end)

    while true do
        wait(0)
        if main_window_state.v == false then

            imgui.Process = false

        end
    end

end

function imgui.OnDrawFrame()
    imgui.SetNextWindowSize(imgui.ImVec2(300, 200), imgui.Cond.FirstUseEver)

    imgui.SetNextWindowPos(imgui.ImVec2((sw / 2), sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))

    imgui.Begin(u8"AccentManager", main_window_state, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)

    imgui.BeginChild("accent", imgui.ImVec2(-1, -1), true)
    
    imgui.SameLine(80) imgui.Text(u8"Настройки акцента")

    if imgui.Checkbox(u8"Включить/отключить акцент", accenton) then
        SaveIni()
    end
    imgui.Text(u8"Ваш акцент: ") imgui.SameLine()
    imgui.PushItemWidth(157.00)
    imgui.InputText("", text_buffer)
    imgui.PopItemWidth()
    SaveIni()

    imgui.EndChild()

    imgui.End()
end

function seriy_theme()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4
    local ImVec2 = imgui.ImVec2
 
     style.WindowPadding = ImVec2(15, 15)
     style.WindowRounding = 15.0
     style.FramePadding = ImVec2(5, 5)
     style.ItemSpacing = ImVec2(12, 8)
     style.ItemInnerSpacing = ImVec2(8, 6)
     style.IndentSpacing = 25.0
     style.ScrollbarSize = 15.0
     style.ScrollbarRounding = 15.0
     style.GrabMinSize = 15.0
     style.GrabRounding = 7.0
     style.ChildWindowRounding = 8.0
     style.FrameRounding = 6.0
  
 
       colors[clr.Text] = ImVec4(0.95, 0.96, 0.98, 1.00)
       colors[clr.TextDisabled] = ImVec4(0.36, 0.42, 0.47, 1.00)
       colors[clr.WindowBg] = ImVec4(0.11, 0.15, 0.17, 1.00)
       colors[clr.ChildWindowBg] = ImVec4(0.15, 0.18, 0.22, 1.00)
       colors[clr.PopupBg] = ImVec4(0.08, 0.08, 0.08, 0.94)
       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.FrameBg] = ImVec4(0.20, 0.25, 0.29, 1.00)
       colors[clr.FrameBgHovered] = ImVec4(0.12, 0.20, 0.28, 1.00)
       colors[clr.FrameBgActive] = ImVec4(0.09, 0.12, 0.14, 1.00)
       colors[clr.TitleBg] = ImVec4(0.09, 0.12, 0.14, 0.65)
       colors[clr.TitleBgCollapsed] = ImVec4(0.00, 0.00, 0.00, 0.51)
       colors[clr.TitleBgActive] = ImVec4(0.08, 0.10, 0.12, 1.00)
       colors[clr.MenuBarBg] = ImVec4(0.15, 0.18, 0.22, 1.00)
       colors[clr.ScrollbarBg] = ImVec4(0.02, 0.02, 0.02, 0.39)
       colors[clr.ScrollbarGrab] = ImVec4(0.20, 0.25, 0.29, 1.00)
       colors[clr.ScrollbarGrabHovered] = ImVec4(0.18, 0.22, 0.25, 1.00)
       colors[clr.ScrollbarGrabActive] = ImVec4(0.09, 0.21, 0.31, 1.00)
       colors[clr.ComboBg] = ImVec4(0.20, 0.25, 0.29, 1.00)
       colors[clr.CheckMark] = ImVec4(0.28, 0.56, 1.00, 1.00)
       colors[clr.SliderGrab] = ImVec4(0.28, 0.56, 1.00, 1.00)
       colors[clr.SliderGrabActive] = ImVec4(0.37, 0.61, 1.00, 1.00)
       colors[clr.Button] = ImVec4(0.20, 0.25, 0.29, 1.00)
       colors[clr.ButtonHovered] = ImVec4(0.28, 0.56, 1.00, 1.00)
       colors[clr.ButtonActive] = ImVec4(0.06, 0.53, 0.98, 1.00)
       colors[clr.Header] = ImVec4(0.20, 0.25, 0.29, 0.55)
       colors[clr.HeaderHovered] = ImVec4(0.26, 0.59, 0.98, 0.80)
       colors[clr.HeaderActive] = ImVec4(0.26, 0.59, 0.98, 1.00)
       colors[clr.ResizeGrip] = ImVec4(0.26, 0.59, 0.98, 0.25)
       colors[clr.ResizeGripHovered] = ImVec4(0.26, 0.59, 0.98, 0.67)
       colors[clr.ResizeGripActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
       colors[clr.CloseButton] = ImVec4(0.40, 0.39, 0.38, 0.16)
       colors[clr.CloseButtonHovered] = ImVec4(0.40, 0.39, 0.38, 0.39)
       colors[clr.CloseButtonActive] = ImVec4(0.40, 0.39, 0.38, 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.TextSelectedBg] = ImVec4(0.25, 1.00, 0.00, 0.43)
       colors[clr.ModalWindowDarkening] = ImVec4(1.00, 0.98, 0.95, 0.73)
 end
 seriy_theme()

function sampev.onSendChat(text)
    if accenton.v then
        return {"[" .. mainIni.config.accent .. "]: " .. text}
    end

end

function SaveIni()
    mainIni.config.accentstatus = accenton.v
    mainIni.config.accent = text_buffer.v
    inicfg.save(mainIni, "AccentManager.ini")
end
Пишу скрипт для акцента. В имгуи меню я пишу акцент, и когда я пишу в чат, то вместо русского акцента пишет каракули. Как декодировать?
 

Smeruxa

t.me/smeruxa
Проверенный
1,381
729
Код:
script_name('AccentManager')
script_author('Sanchez.')
script_description('Accent')

require "lib.moonloader"

local encoding = require 'encoding'
local inicfg = require 'inicfg'
local imgui = require 'imgui'
local sampev = require 'lib.samp.events'
local tag = "{00BFFF}AccentManager: "
encoding.default = 'CP1251'
u8 = encoding.UTF8

local main_window_state = imgui.ImBool(false)
local sw, sh = getScreenResolution()

local mainIni = inicfg.load({
    config = {
    accentstatus = false,
    accent = 0,
}
}, "AccentManager")

local accenton = imgui.ImBool(mainIni.config.accentstatus)
local text_buffer = imgui.ImBuffer(tostring(mainIni.config.accent), 40)

if not doesFileExist('moonloader/config/AccentManager.ini') then inicfg.save(mainIni, 'AccentManager.ini') end

function main()

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

    sampAddChatMessage(tag .. "{FFFFFF}Скрипт успешно загружен! Автор: {00BFFF}Sanchez.",-1)

    imgui.Process = false

    sampRegisterChatCommand("am", function()
        main_window_state.v = not main_window_state.v

        imgui.Process = main_window_state.v


    end)

    while true do
        wait(0)
        if main_window_state.v == false then

            imgui.Process = false

        end
    end

end

function imgui.OnDrawFrame()
    imgui.SetNextWindowSize(imgui.ImVec2(300, 200), imgui.Cond.FirstUseEver)

    imgui.SetNextWindowPos(imgui.ImVec2((sw / 2), sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))

    imgui.Begin(u8"AccentManager", main_window_state, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)

    imgui.BeginChild("accent", imgui.ImVec2(-1, -1), true)
   
    imgui.SameLine(80) imgui.Text(u8"Настройки акцента")

    if imgui.Checkbox(u8"Включить/отключить акцент", accenton) then
        SaveIni()
    end
    imgui.Text(u8"Ваш акцент: ") imgui.SameLine()
    imgui.PushItemWidth(157.00)
    imgui.InputText("", text_buffer)
    imgui.PopItemWidth()
    SaveIni()

    imgui.EndChild()

    imgui.End()
end

function seriy_theme()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4
    local ImVec2 = imgui.ImVec2

     style.WindowPadding = ImVec2(15, 15)
     style.WindowRounding = 15.0
     style.FramePadding = ImVec2(5, 5)
     style.ItemSpacing = ImVec2(12, 8)
     style.ItemInnerSpacing = ImVec2(8, 6)
     style.IndentSpacing = 25.0
     style.ScrollbarSize = 15.0
     style.ScrollbarRounding = 15.0
     style.GrabMinSize = 15.0
     style.GrabRounding = 7.0
     style.ChildWindowRounding = 8.0
     style.FrameRounding = 6.0
 

       colors[clr.Text] = ImVec4(0.95, 0.96, 0.98, 1.00)
       colors[clr.TextDisabled] = ImVec4(0.36, 0.42, 0.47, 1.00)
       colors[clr.WindowBg] = ImVec4(0.11, 0.15, 0.17, 1.00)
       colors[clr.ChildWindowBg] = ImVec4(0.15, 0.18, 0.22, 1.00)
       colors[clr.PopupBg] = ImVec4(0.08, 0.08, 0.08, 0.94)
       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.FrameBg] = ImVec4(0.20, 0.25, 0.29, 1.00)
       colors[clr.FrameBgHovered] = ImVec4(0.12, 0.20, 0.28, 1.00)
       colors[clr.FrameBgActive] = ImVec4(0.09, 0.12, 0.14, 1.00)
       colors[clr.TitleBg] = ImVec4(0.09, 0.12, 0.14, 0.65)
       colors[clr.TitleBgCollapsed] = ImVec4(0.00, 0.00, 0.00, 0.51)
       colors[clr.TitleBgActive] = ImVec4(0.08, 0.10, 0.12, 1.00)
       colors[clr.MenuBarBg] = ImVec4(0.15, 0.18, 0.22, 1.00)
       colors[clr.ScrollbarBg] = ImVec4(0.02, 0.02, 0.02, 0.39)
       colors[clr.ScrollbarGrab] = ImVec4(0.20, 0.25, 0.29, 1.00)
       colors[clr.ScrollbarGrabHovered] = ImVec4(0.18, 0.22, 0.25, 1.00)
       colors[clr.ScrollbarGrabActive] = ImVec4(0.09, 0.21, 0.31, 1.00)
       colors[clr.ComboBg] = ImVec4(0.20, 0.25, 0.29, 1.00)
       colors[clr.CheckMark] = ImVec4(0.28, 0.56, 1.00, 1.00)
       colors[clr.SliderGrab] = ImVec4(0.28, 0.56, 1.00, 1.00)
       colors[clr.SliderGrabActive] = ImVec4(0.37, 0.61, 1.00, 1.00)
       colors[clr.Button] = ImVec4(0.20, 0.25, 0.29, 1.00)
       colors[clr.ButtonHovered] = ImVec4(0.28, 0.56, 1.00, 1.00)
       colors[clr.ButtonActive] = ImVec4(0.06, 0.53, 0.98, 1.00)
       colors[clr.Header] = ImVec4(0.20, 0.25, 0.29, 0.55)
       colors[clr.HeaderHovered] = ImVec4(0.26, 0.59, 0.98, 0.80)
       colors[clr.HeaderActive] = ImVec4(0.26, 0.59, 0.98, 1.00)
       colors[clr.ResizeGrip] = ImVec4(0.26, 0.59, 0.98, 0.25)
       colors[clr.ResizeGripHovered] = ImVec4(0.26, 0.59, 0.98, 0.67)
       colors[clr.ResizeGripActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
       colors[clr.CloseButton] = ImVec4(0.40, 0.39, 0.38, 0.16)
       colors[clr.CloseButtonHovered] = ImVec4(0.40, 0.39, 0.38, 0.39)
       colors[clr.CloseButtonActive] = ImVec4(0.40, 0.39, 0.38, 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.TextSelectedBg] = ImVec4(0.25, 1.00, 0.00, 0.43)
       colors[clr.ModalWindowDarkening] = ImVec4(1.00, 0.98, 0.95, 0.73)
end
seriy_theme()

function sampev.onSendChat(text)
    if accenton.v then
        return {"[" .. mainIni.config.accent .. "]: " .. text}
    end

end

function SaveIni()
    mainIni.config.accentstatus = accenton.v
    mainIni.config.accent = text_buffer.v
    inicfg.save(mainIni, "AccentManager.ini")
end
Пишу скрипт для акцента. В имгуи меню я пишу акцент, и когда я пишу в чат, то вместо русского акцента пишет каракули. Как декодировать?
u8:decode
 

Sanchez.

Известный
705
189
Киньте тему про гиперссылку. Типо текст "BlastHack" и перекидывает на сайт бластхака