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

UBP

Известный
331
170
объясни пж что да где там

а можешь объяснить пж как сделать вкладки без for? типо названия то я разные хочу, или можно через массив сделать разные названия?
ля, от души, теперь понял как

как можно проверить какой аргумент введен в testCheat?
TestCheat.v
 

XRLM

Известный
2,548
865
я думаю ты не так понял мой вопрос. я хочу чтобы при команде /arg 123 выполнялось sampAddCgatMessage('Arg: '..tonumber(arg), -1), sampRegisterChatCommand мне не подходит, потому что хочу сделать так, if test then if testCheat('') then в беск цикле. мб с помощью массива можно как то это реализовать?
 

UBP

Известный
331
170
я думаю ты не так понял мой вопрос. я хочу чтобы при команде /arg 123 выполнялось sampAddCgatMessage('Arg: '..tonumber(arg), -1), sampRegisterChatCommand мне не подходит, потому что хочу сделать так, if test then if testCheat('') then в беск цикле. мб с помощью массива можно как то это реализовать?
Не понятно. If testCheat == “ “ проверка равно ли стрингу . Что тебе нужно вынести? Кусок кода дай как ты пытаешься реализовать это
 

XRLM

Известный
2,548
865
Не понятно. If testCheat == “ “ проверка равно ли стрингу . Что тебе нужно вынести? Кусок кода дай как ты пытаешься реализовать это
Lua:
local test = false
function main()
    sampRegisterChatCommand('test', function() --к примеру так
        test = not test
    end)
    while true do wait(0)
        if test then
            sampRegisterChatCommand('arg', function(arg)) -- вместо этого testCheat('arg', function(arg)) хочу, но такого не существует
                sampAddChatMessage('Аргумент: '..tonumber(arg), -1)
            end
        end
    end
end[/CODE=lua]
 

UBP

Известный
331
170
Lua:
local test = false
function main()
    sampRegisterChatCommand('test', function() --к примеру так
        test = not test
    end)
    while true do wait(0)
        if test then
            sampRegisterChatCommand('arg', function(arg)) -- вместо этого testCheat('arg', function(arg)) хочу, но такого не существует
                sampAddChatMessage('Аргумент: '..tonumber(arg), -1)
            end
        end
    end
end[/CODE=lua]
Нихуя не понятно, зачем тебе это
 

XRLM

Известный
2,548
865
как совместить это
Lua:
imgui.Text(u8'Сказать "Привет" на ')
imgui.SameLine()
if imgui.HotKey("##img.HOTKEYS.privet", img.HOTKEYS.privet) then
    rkeys.changeHotKey(ID_PRIVET, img.HOTKEYS.privet.v)
    ini.HOTKEYS.privet = encodeJson(img.HOTKEYS.privet.v)
    inicfg.save(ini, filename_ini)
end
imgui.SameLine()
if imgui.ToggleButton(u8'##1', privet) then end
чтобы получилось это
1661580774053.png
? или на много лучше чем это

Нихуя не понятно, зачем тебе это
ну это в пример такая хуйня, я хочу активацию на сокр команду, к примеру /usedrugs, сделать, и там нужен аргумент обязательно. тип если написал /us 6, то /usedrugs 6, можно по отдельности писать testCheat('us 1') testCheat('us 2') и тд., но я думаю что есть способы проще
 

UBP

Известный
331
170
как совместить это
Lua:
imgui.Text(u8'Сказать "Привет" на ')
imgui.SameLine()
if imgui.HotKey("##img.HOTKEYS.privet", img.HOTKEYS.privet) then
    rkeys.changeHotKey(ID_PRIVET, img.HOTKEYS.privet.v)
    ini.HOTKEYS.privet = encodeJson(img.HOTKEYS.privet.v)
    inicfg.save(ini, filename_ini)
end
imgui.SameLine()
if imgui.ToggleButton(u8'##1', privet) then end
чтобы получилось это Посмотреть вложение 165376 ? или на много лучше чем это


ну это в пример такая хуйня, я хочу активацию на сокр команду, к примеру /usedrugs, сделать, и там нужен аргумент обязательно. тип если написал /us 6, то /usedrugs 6, можно по отдельности писать testCheat('us 1') testCheat('us 2') и тд., но я думаю что есть способы проще
Lua:
sampRegisterChatCommand("us", function(text) if Enable.v then sampSendChat("/usedrugs "..text) end end)
 

XRLM

Известный
2,548
865
Lua:
sampRegisterChatCommand("us", function(text) if Enable.v then sampSendChat("/usedrugs "..text) end end)
ну бля, ты все равно не понял меня. я активирую test, если test == true то в беск цикле if testCheat('us') then, sampRegisterChatCommand тут не подходит. крч похуй, говнокод сделаю такой
можно по отдельности писать testCheat('us 1') testCheat('us 2') и тд.
 

LazyK

Участник
39
44
Как можно имитировать краш игры? Если вдруг админ тепнет то что бы в логах было что именно крашнуло
 

LazyK

Участник
39
44
как обозначить длину imgui.InputText?
возможно то что вам нужно
 
  • Нравится
Реакции: XRLM

XRLM

Известный
2,548
865
возможно то что вам нужно
да, спасибо
 
  • Нравится
Реакции: LazyK

deveeh

Новичок
22
6
Короче проблема, если активен один чекбокс, то не могут работать в других чекбоксах подчекбоксики, подробнее в видео

вот код:
imgui.Begin('PR Manager | by deveeh', window, imgui.WindowFlags.NoResize)
            imgui.Checkbox(u8'Сообщения для VIP Чата (/vr)', settings.vr)
            if settings.vr.v then
                imgui.Text(u8'    Сообщение:')
                imgui.Text(u8'    ')
                imgui.SameLine()
                imgui.InputText('##MSG', settings.vrmsg)
                imgui.Text(u8'    ')
                imgui.SameLine()
                imgui.Checkbox(u8'Второе сообщение', settings.vr2)
                if settings.vr2.v then
                    imgui.Text(u8'        Сообщение:')
                    imgui.Text(u8'        ')
                    imgui.SameLine()
                    imgui.InputText('##MSG2', settings.vrmsg2)
                end
            end
            imgui.Checkbox(u8'Сообщения для FAMILY чата (/fam, /al)', settings.fam)
            if settings.fam.v then
                imgui.Text(u8'    Сообщение:')
                imgui.Text(u8'    ')
                imgui.SameLine()
                imgui.InputText('##MSGFAM', settings.fammsg)
                imgui.Text(u8'    ')
                imgui.SameLine()
                imgui.Checkbox(u8'Второе сообщение', settings.al)
                if settings.al.v then
                    imgui.Text(u8'        Сообщение:')
                    imgui.Text(u8'        ')
                    imgui.SameLine()
                    imgui.InputText('##MSGAL', settings.almsg)
                end
            end
            imgui.Checkbox(u8'Сообщения для объявлений (/ad)', settings.ad)
            if settings.ad.v then
                imgui.Text(u8'    Сообщение:')
                imgui.Text(u8'    ')
                imgui.SameLine()
                imgui.InputText('##MSGAD', settings.admsg)
                imgui.Text(u8'    ')
                imgui.SameLine()
                imgui.Checkbox(u8'Второе сообщение', settings.ad2)
                if settings.ad2.v then
                    imgui.Text(u8'        Сообщение:')
                    imgui.Text(u8'        ')
                    imgui.SameLine()
                    imgui.InputText('##MSGAD2', settings.admsg2)
                end
            end
            imgui.Text(u8'Задержка:')
            imgui.SameLine()
            imgui.PushItemWidth(83)
            imgui.InputInt('##delay', settings.delay)
            imgui.PopItemWidth()
            if imgui.IsItemHovered() then
                imgui.BeginTooltip()
                    imgui.Text(u8'Задержка между отправлением сообщений (секунды)')
                imgui.EndTooltip()
            end
        imgui.End()
 

Gorskin

{Reverse Developer} ✓
Проверенный
1,251
1,054
Короче проблема, если активен один чекбокс, то не могут работать в других чекбоксах подчекбоксики, подробнее в видео

вот код:
imgui.Begin('PR Manager | by deveeh', window, imgui.WindowFlags.NoResize)
            imgui.Checkbox(u8'Сообщения для VIP Чата (/vr)', settings.vr)
            if settings.vr.v then
                imgui.Text(u8'    Сообщение:')
                imgui.Text(u8'    ')
                imgui.SameLine()
                imgui.InputText('##MSG', settings.vrmsg)
                imgui.Text(u8'    ')
                imgui.SameLine()
                imgui.Checkbox(u8'Второе сообщение', settings.vr2)
                if settings.vr2.v then
                    imgui.Text(u8'        Сообщение:')
                    imgui.Text(u8'        ')
                    imgui.SameLine()
                    imgui.InputText('##MSG2', settings.vrmsg2)
                end
            end
            imgui.Checkbox(u8'Сообщения для FAMILY чата (/fam, /al)', settings.fam)
            if settings.fam.v then
                imgui.Text(u8'    Сообщение:')
                imgui.Text(u8'    ')
                imgui.SameLine()
                imgui.InputText('##MSGFAM', settings.fammsg)
                imgui.Text(u8'    ')
                imgui.SameLine()
                imgui.Checkbox(u8'Второе сообщение', settings.al)
                if settings.al.v then
                    imgui.Text(u8'        Сообщение:')
                    imgui.Text(u8'        ')
                    imgui.SameLine()
                    imgui.InputText('##MSGAL', settings.almsg)
                end
            end
            imgui.Checkbox(u8'Сообщения для объявлений (/ad)', settings.ad)
            if settings.ad.v then
                imgui.Text(u8'    Сообщение:')
                imgui.Text(u8'    ')
                imgui.SameLine()
                imgui.InputText('##MSGAD', settings.admsg)
                imgui.Text(u8'    ')
                imgui.SameLine()
                imgui.Checkbox(u8'Второе сообщение', settings.ad2)
                if settings.ad2.v then
                    imgui.Text(u8'        Сообщение:')
                    imgui.Text(u8'        ')
                    imgui.SameLine()
                    imgui.InputText('##MSGAD2', settings.admsg2)
                end
            end
            imgui.Text(u8'Задержка:')
            imgui.SameLine()
            imgui.PushItemWidth(83)
            imgui.InputInt('##delay', settings.delay)
            imgui.PopItemWidth()
            if imgui.IsItemHovered() then
                imgui.BeginTooltip()
                    imgui.Text(u8'Задержка между отправлением сообщений (секунды)')
                imgui.EndTooltip()
            end
        imgui.End()
У тебя чекбоксы с словом "Второе сообщение" имеют одинаковые названия, называй каждый такой чекбокс добавляя ##1, ##2 и т.д в меню не будет видно ## и всё что идёт за ними.
Пример:
Lua:
imgui.Checkbox(u8'Второе сообщение##1', settings.vr2)
imgui.Checkbox(u8'Второе сообщение##2', settings.vr2)
 

deveeh

Новичок
22
6
У тебя чекбоксы с словом "Второе сообщение" имеют одинаковые названия, называй каждый такой чекбокс добавляя ##1, ##2 и т.д в меню не будет видно ## и всё что идёт за ними.
Пример:
Lua:
imgui.Checkbox(u8'Второе сообщение##1', settings.vr2)
imgui.Checkbox(u8'Второе сообщение##2', settings.vr2)
понял, не заметил, спасибо
 
Последнее редактирование: