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

user390868

Гость
Как узнать находится ли игрок в зоне стрима по его id? Можно ли сделать это без цикла for?
чел. бро. всё это есть в самп луа. когда чел входит в зону стрима и когда выходит из неё. всё просто и по факту. и вообще советую более подробно рассмотреть самп луа. многие недооценивают его как библиотеку. а на самом деле он подходит для реализации самых разных задач. простых и сложных

Lua:
INCOMING_RPCS[RPC.WORLDPLAYERADD]             = {'onPlayerStreamIn', {playerId = 'int16'}, {team = 'int8'}, {model = 'int32'}, {position = 'vector3d'}, {rotation = 'float'}, {color = 'int32'}, {fightingStyle = 'int8'}}
INCOMING_RPCS[RPC.WORLDPLAYERREMOVE]          = {'onPlayerStreamOut', {playerId = 'int16'}}
 

chapo

чопа сребдс // @moujeek
Модератор
8,862
11,550
чел. бро. всё это есть в самп луа. когда чел входит в зону стрима и когда выходит из неё. всё просто и по факту. и вообще советую более подробно рассмотреть самп луа. многие недооценивают его как библиотеку. а на самом деле он подходит для реализации самых разных задач. простых и сложных

Lua:
INCOMING_RPCS[RPC.WORLDPLAYERADD]             = {'onPlayerStreamIn', {playerId = 'int16'}, {team = 'int8'}, {model = 'int32'}, {position = 'vector3d'}, {rotation = 'float'}, {color = 'int32'}, {fightingStyle = 'int8'}}
INCOMING_RPCS[RPC.WORLDPLAYERREMOVE]          = {'onPlayerStreamOut', {playerId = 'int16'}}
мне надо сделать проверку командой, так что от этого нет толку
 
U

user390868

Гость
мне надо сделать проверку командой, так что от этого нет толку
.. ты хочешь слишком просто. будто новичек. и не хочешь думать как разработчик. говоришь толку нет? что тебе мешает использовать информацию из этих вызываемых функций. если айди вывелся в паблике onPlayerStreamIn, то он в любом случае будет в зоне стрима. а если айди вывелся в onPlayerStreamOut. то соответственно чела нет в зоне стрима. берёшь создаёшь пустую таблицу. и заносишь айди челов. которые вошли в зону стрима. а когда челы выходят из зоны стрима. то удаляёшь их айди из таблицы. а потом уже берёшь и создаёшь свою команду и проверяешь нахождения айдишников в таблице и если нет нужного айди. значит и чела нет в зоне стрима. вот тебе и проверка. разбирайся с таблицами. их создание и занесение в них информации и удаление инфы оттуда. чел. развивайся реально. я тебе дал инфу. как можно делать. воспользуешься ты ею или нет. решать тебе
 

Мира

Участник
455
9
имеется данный код.
Lua:
imgui.BufferingBar(0.5, imgui.ImVec2(200, 10), false)
не понимаю как сделать ему "анимацию". хочу, чтобы прибавлялся, то есть было чтобы как-то так:
Lua:
imgui.BufferingBar(0.1, imgui.ImVec2(200, 10), false)
wait(250)
imgui.BufferingBar(0.2, imgui.ImVec2(200, 10), false)
wait(250)
imgui.BufferingBar(0.3, imgui.ImVec2(200, 10), false)
wait(250)
imgui.BufferingBar(0.4, imgui.ImVec2(200, 10), false)
wait(250)
imgui.BufferingBar(0.5, imgui.ImVec2(200, 10), false)
wait(250)
 

Adrian G.

Известный
Проверенный
520
457
Если можно накидайте скриптов, в которых используется библиотека memory. Хочу в них покопаться. Читая на вики про память, пришел к выводу, что я нихуя не понял.
 

Smeruxa

Известный
1,359
721
имеется данный код.
Lua:
imgui.BufferingBar(0.5, imgui.ImVec2(200, 10), false)
не понимаю как сделать ему "анимацию". хочу, чтобы прибавлялся, то есть было чтобы как-то так:
Lua:
imgui.BufferingBar(0.1, imgui.ImVec2(200, 10), false)
wait(250)
imgui.BufferingBar(0.2, imgui.ImVec2(200, 10), false)
wait(250)
imgui.BufferingBar(0.3, imgui.ImVec2(200, 10), false)
wait(250)
imgui.BufferingBar(0.4, imgui.ImVec2(200, 10), false)
wait(250)
imgui.BufferingBar(0.5, imgui.ImVec2(200, 10), false)
wait(250)
цикл for
 

Dashok.

Участник
228
9
При нажатии на Селектбл, краш игры, не ошибка скрипта, а саму игру крашит.

Код окна:
-- [x] -- ImGUI тело. -- [x] --
local W_Windows = sw/1.280
local H_Windows = 1
local text_dialog
function imgui.OnDrawFrame()
    imgui.ShowCursor = check_mouse
    if i_ans_window.v then
        imgui.SetNextWindowPos(imgui.ImVec2(W_Windows, H_Windows), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(550, 270), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"Ответы на ANS", i_ans_window)
        local btn_size = imgui.ImVec2(-0.1, 0)
        imgui.Checkbox(u8"Пожелание", i_back_prefix)
        imgui.BeginChild('##Select Setting', imgui.ImVec2(150, 215), true)
        if imgui.Selectable(u8"Стандартные", beginchild == 1) then beginchild = 1 end
        imgui.Separator()

            --[[else
                if imgui.CollapsingHeader(key) then
                    for key_2, v_2 in pairs(i_ans[key]) do
                        if imgui.Button(key_2, btn_size) then
                            if not i_back_prefix.v then
                                local settext = '{FFFFFF}' .. v_2
                                sampSendDialogResponse(2351, 1, 0, settext)
                            else
                                local settext = '{FFFFFF}' .. v_2 .. ' {AAAAAA}// Приятной игры на "RDS"!'
                                sampSendDialogResponse(2351, 1, 0, settext)
                            end
                        end
                    end
                end
            end
        end]]

         if beginchild == 1 then
            imgui.BeginChild("##Standart", imgui.ImVec2(330, 215), true)
         for key, v in pairs(i_ans) do
            if key == "default" then
                for key_2, v_2 in pairs(i_ans[key]) do
                    if imgui.Button(key_2, btn_size) then
                        if not i_back_prefix.v then
                            local settext = '{FFFFFF}' .. v_2
                            sampSendDialogResponse(2351, 1, 0, settext)
                        else
                            local settext = '{FFFFFF}' .. v_2 .. ' {AAAAAA}// Приятной игры на "RDS"!'
                            sampSendDialogResponse(2351, 1, 0, settext)
                        end
                    end
                end
                end
                end
                end
            imgui.EndChild()
        imgui.End()
    end
 

Smeruxa

Известный
1,359
721
При нажатии на Селектбл, краш игры, не ошибка скрипта, а саму игру крашит.

Код окна:
-- [x] -- ImGUI тело. -- [x] --
local W_Windows = sw/1.280
local H_Windows = 1
local text_dialog
function imgui.OnDrawFrame()
    imgui.ShowCursor = check_mouse
    if i_ans_window.v then
        imgui.SetNextWindowPos(imgui.ImVec2(W_Windows, H_Windows), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(550, 270), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"Ответы на ANS", i_ans_window)
        local btn_size = imgui.ImVec2(-0.1, 0)
        imgui.Checkbox(u8"Пожелание", i_back_prefix)
        imgui.BeginChild('##Select Setting', imgui.ImVec2(150, 215), true)
        if imgui.Selectable(u8"Стандартные", beginchild == 1) then beginchild = 1 end
        imgui.Separator()

            --[[else
                if imgui.CollapsingHeader(key) then
                    for key_2, v_2 in pairs(i_ans[key]) do
                        if imgui.Button(key_2, btn_size) then
                            if not i_back_prefix.v then
                                local settext = '{FFFFFF}' .. v_2
                                sampSendDialogResponse(2351, 1, 0, settext)
                            else
                                local settext = '{FFFFFF}' .. v_2 .. ' {AAAAAA}// Приятной игры на "RDS"!'
                                sampSendDialogResponse(2351, 1, 0, settext)
                            end
                        end
                    end
                end
            end
        end]]

         if beginchild == 1 then
            imgui.BeginChild("##Standart", imgui.ImVec2(330, 215), true)
         for key, v in pairs(i_ans) do
            if key == "default" then
                for key_2, v_2 in pairs(i_ans[key]) do
                    if imgui.Button(key_2, btn_size) then
                        if not i_back_prefix.v then
                            local settext = '{FFFFFF}' .. v_2
                            sampSendDialogResponse(2351, 1, 0, settext)
                        else
                            local settext = '{FFFFFF}' .. v_2 .. ' {AAAAAA}// Приятной игры на "RDS"!'
                            sampSendDialogResponse(2351, 1, 0, settext)
                        end
                    end
                end
                end
                end
                end
            imgui.EndChild()
        imgui.End()
    end
табуляцию исправь, нифига не пойму, вроде EndChild не там стоит
Да, не там стоит
 

Smeruxa

Известный
1,359
721
он клонируется, а не обновляется
Lua:
    for i = 1, 50 do
        imgui.BufferingBar(0.1, imgui.ImVec2(200, 10), false)
        imgui.BufferingBar(0.2, imgui.ImVec2(200, 10), false)
        imgui.BufferingBar(0.3, imgui.ImVec2(200, 10), false)
        imgui.BufferingBar(0.4, imgui.ImVec2(200, 10), false)
        imgui.BufferingBar(0.5, imgui.ImVec2(200, 10), false)
    end
хД
imgui.BufferingBar(i, imgui.ImVec2(200, 10), false)
 

Dashok.

Участник
228
9
Как сделать так что-бы когда окно открыто, курсор не появлялся?
Код скрипта:
if i_info_update.v then
        imgui.ShowCursor = false
        imgui.SetNextWindowPos(imgui.ImVec2(sw/1.13, sh/1.02), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 1))
        imgui.SetNextWindowSize(imgui.ImVec2(250, 150), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"Статистика", i_info_update)
        imgui.Text(u8'Репутация: ')
        imgui.Text(u8'Кол-во ответов: ')
        
        imgui.End()
    end
 

Smeruxa

Известный
1,359
721
Как сделать так что-бы когда окно открыто, курсор не появлялся?
Код скрипта:
if i_info_update.v then
        imgui.ShowCursor = false
        imgui.SetNextWindowPos(imgui.ImVec2(sw/1.13, sh/1.02), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 1))
        imgui.SetNextWindowSize(imgui.ImVec2(250, 150), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"Статистика", i_info_update)
        imgui.Text(u8'Репутация: ')
        imgui.Text(u8'Кол-во ответов: ')
       
        imgui.End()
    end
if window.v then imgui.ShowCursor = false end
 

Vintik

Через тернии к звёздам
Проверенный
1,526
1,010
Как сделать так что-бы когда окно открыто, курсор не появлялся?
Код скрипта:
if i_info_update.v then
        imgui.ShowCursor = false
        imgui.SetNextWindowPos(imgui.ImVec2(sw/1.13, sh/1.02), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 1))
        imgui.SetNextWindowSize(imgui.ImVec2(250, 150), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"Статистика", i_info_update)
        imgui.Text(u8'Репутация: ')
        imgui.Text(u8'Кол-во ответов: ')
       
        imgui.End()
    end
Так у тебя и так стоит imgui.ShowCursor = false