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

ufdhbi

Известный
Проверенный
1,455
861
У меня есть 2 таймера они должны снимать с показателей по 1 очку и ждать определенного времени, потом снимать еще и так далее, но проблема в том, что как только проходят 30 секунд , начинает сниматься(как я понимаю) по 1 очку каждый кадр, и из-за этого буквально через 5-6 секунд вижу картину -2000/100. Как это исправить?

--код
Lua:
while true do
        if os.clock() - timer > 30 then
            Hungry = Hungry - 1
        end
        if os.clock() - timer > 30 then
            Thirst = Thirst - 1
        end
        wait(0)
  end
[/lua]
timer присваивай новый после декремента
 
  • Нравится
Реакции: HpP

Dmitriy Makarov

25.05.2021
Проверенный
2,481
1,113
как сделать затемнение экрана когда открыто имгуи окно?
Собсна, вот и ОНО. ;D
Если довести до ума, то будет всё шик. =) Только я понятия не имею, почему затемнение не коснулось верхней и левой части экрана. И еще я заметил, то чат(инпут который) он тоже задевает. Думаю, так и должно быть.
Lua:
-- Суём в начало скрипта куда-нибудь
local window = imgui.ImBool(false) -- Это главное окно
local test = imgui.ImBool(true) -- А это затемнение экрана

-- function main()
sampRegisterChatCommand("hehehe", function() window.v = not window.v end)

-- А это в бесконечный цикл
imgui.Process = window.v -- По идее, затемнение вызовется, если активно главное окно (т.е window)

-- Сам OnDrawFrame()
function imgui.OnDrawFrame()
    if test.v then -- Затемнение, кстати, должно быть выше главного окна, иначе у тебя окно затемнения будет спереди, а главное окно - сзади и его не будет видно.)
        bg() -- Это стиль. Устанавливаем его при вызове этого окна
        local sw, sh = getScreenResolution() -- Тут всякая фиговина
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(3000, 3000), imgui.Cond.FirstUseEver) -- Не удивляйся, я сам не знал какой ему размер поставить.)
        imgui.Begin(u8"", test, imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoBringToFrontOnFocus) -- Тут флаги, мол его нельзя трогать и т.д. Переведи и узнаешь.)
        imgui.End()
    end
    if window.v then -- И само главное окно
        dark_theme() -- Это просто стиль, у тебя может быть любой стиль главного окна
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(690, 240), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"Test", window, imgui.WindowFlags.NoResize) -- Не обращай внимания, чисто ради теста
        imgui.End()
    end
end

-- Сами стили
function bg() -- Стиль "затемнения"
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4
    colors[clr.WindowBg] = ImVec4(0, 0, 0, 0.45)
end

function dark_theme() -- Стиль главного окна. Как я и сказал, у тебя может быть свой стиль главного окна
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4
    style.WindowPadding = imgui.ImVec2(15, 15)
    style.WindowRounding = 1.5
    style.FramePadding = imgui.ImVec2(5, 5)
    style.FrameRounding = 4.0
    style.ItemSpacing = imgui.ImVec2(12, 8)
    style.WindowTitleAlign = imgui.ImVec2(0.5, 0.84)
    style.ItemInnerSpacing = imgui.ImVec2(8, 6)
    style.IndentSpacing = 25.0
    style.ScrollbarSize = 15.0
    style.ScrollbarRounding = 9.0
    style.GrabMinSize = 5.0
    style.GrabRounding = 3.0
    colors[clr.Text] = ImVec4(0.80, 0.80, 0.83, 1.00)
    colors[clr.TextDisabled] = ImVec4(0.24, 0.23, 0.29, 1.00)
    colors[clr.WindowBg] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.ChildWindowBg] = ImVec4(0.07, 0.07, 0.09, 1.00)
    colors[clr.PopupBg] = ImVec4(0.07, 0.07, 0.09, 1.00)
    colors[clr.Border] = ImVec4(0.80, 0.80, 0.83, 0.88)
    colors[clr.BorderShadow] = ImVec4(0.92, 0.91, 0.88, 0.00)
    colors[clr.FrameBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.FrameBgHovered] = ImVec4(0.24, 0.23, 0.29, 1.00)
    colors[clr.FrameBgActive] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.TitleBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.TitleBgCollapsed] = ImVec4(1.00, 0.98, 0.95, 0.75)
    colors[clr.TitleBgActive] = ImVec4(0.07, 0.07, 0.09, 1.00)
    colors[clr.MenuBarBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.ScrollbarBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.ScrollbarGrab] = ImVec4(0.80, 0.80, 0.83, 0.31)
    colors[clr.ScrollbarGrabHovered] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.ScrollbarGrabActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.ComboBg] = ImVec4(0.19, 0.18, 0.21, 1.00)
    colors[clr.CheckMark] = ImVec4(0.80, 0.80, 0.83, 0.31)
    colors[clr.SliderGrab] = ImVec4(0.80, 0.80, 0.83, 0.31)
    colors[clr.SliderGrabActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.Button] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.ButtonHovered] = ImVec4(0.24, 0.23, 0.29, 1.00)
    colors[clr.ButtonActive] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.Header] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.HeaderHovered] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.HeaderActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.ResizeGrip] = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.ResizeGripHovered] = ImVec4(0.56, 0.56, 0.58, 1.00)
    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.40, 0.39, 0.38, 0.63)
    colors[clr.PlotLinesHovered] = ImVec4(0.25, 1.00, 0.00, 1.00)
    colors[clr.PlotHistogram] = ImVec4(0.40, 0.39, 0.38, 0.63)
    colors[clr.PlotHistogramHovered] = ImVec4(0.25, 1.00, 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
 
  • Нравится
Реакции: HpP и enyag

MrBidloKoder

Известный
425
248
Lua:
emul_rpc{'onCreateGangZone', {zoneId = '543'}, {squareStart = {x ='1248.011', y = '2072.804'}}, {squareEnd = {x ='1439.348', y = '2204.319'}}, {color = 'FF0000'}}

Почему нету красной гангзоны на карте? Помогите решить эту проблему. emul rpc взял тут: https://www.blast.hk/threads/13380/post-190867
 

HpP

Известный
368
117
У меня есть две переменные SamoObraz и Gelat, они обе открываются с помощью кнопок в главном imgui-окне. Так вот, как сделать так, что если открыто imgui-окно SamoObraz нельзя бы было открыть Gelat и наоборот.
 

#NoViKoV

Известный
56
9
Братцы, как реализовать активацию по русской команде?

sampRegisterChatCommand('test', cmd_test)
sampRegisterChatCommand('тест'', cmd_test)

Если указывать на прямую в тупую, что свойственно мне, то не работает))
 

damag

Женюсь на официантке в моем любимом баре
Проверенный
1,152
1,194
Братцы, как реализовать активацию по русской команде?

sampRegisterChatCommand('test', cmd_test)
sampRegisterChatCommand('тест'', cmd_test)

Если указывать на прямую в тупую, что свойственно мне, то не работает))
1. ты юзаешь 1 функцию, в двух зарегистрированных кмд.
2. win1251 кодировку надо поставить.
 

wulfandr

Известный
637
260
У меня есть две переменные SamoObraz и Gelat, они обе открываются с помощью кнопок в главном imgui-окне. Так вот, как сделать так, что если открыто imgui-окно SamoObraz нельзя бы было открыть Gelat и наоборот.
if SamoObraz == false then
-- здесь imgui.button с Gelat, и наоборот
end

if Gelat == false then
-- здесь imgui.button с SamoObraz
end
 
  • Нравится
Реакции: HpP

MrBidloKoder

Известный
425
248
Lua:
emul_rpc{'onCreateGangZone', {zoneId = '543'}, {squareStart = {x ='1248.011', y = '2072.804'}}, {squareEnd = {x ='1439.348', y = '2204.319'}}, {color = 'FF0000'}}



Почему нету красной гангзоны на карте? Помогите решить эту проблему. emul rpc взял тут: https://www.blast.hk/threads/13380/post-190867
 

Rei

Известный
Друг
1,593
1,626