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

Neon3333

Известный
181
71
Как называется элемент в имгуи, который можно сворачивать и разворачивать?
Посмотреть вложение 75421
Lua:
if imgui.CollapsingHeader("Header") then

    -- Тут все элементы, которые хочешь в него запихать(будут доступны, когда он открыт)

end
Возможно ли как то спарсить текст с большой страницы (вес 9МБ) без пролага при получении ее? Либо получить определение кол-во символов с неё (на php пробовал, получилось).
Тут много инфы по запросам, найдешь то что тебе надо, там несколько вариантов реализации всего этого
Можно ссылку на гайд с диалогами, чтобы разобраться как с ними работать на ЛУА

За ранее спасибо

Как через requests получить "прогруженную" страницу? Страница, текст которой мне нужно получить, выдает текст только после загрузки, а не в исходном коде
Вопрос вообще непонятен, переформулируй.
Если ты имеешь ввиду, что ты уже прогружал эту страницу, что сохрани ее html куда тебе надо.
нет ты не так понял, что бы звездочки писались я сделал, но мне нужно что бы при нажатии на кнопку звездочки убирались и появлялись символы
Все я так понял, кому-то в падлу было тему прочитать внимательно.
 
Последнее редактирование:
  • Нравится
Реакции: Wei Huang и |DEVIL|

Wei Huang

Участник
21
0
Lua:
if imgui.CollapsingHeader("Header") then

    -- Тут все элементы, которые хочешь в него запихать(будут доступны, когда он открыт)

end

Тут много инфы по запросам, найдешь то что тебе надо, там несколько вариантов реализации всего этого


Эх, хотел именно почитать про это видео знаю, но спасибо за потраченное время :3
 

Neon3333

Известный
181
71
Эх, хотел именно почитать про это видео знаю, но спасибо за потраченное время :3
Готовых топиков, посвящённых именно диалогам не знаю, поищи на бх по названиям функций, либо же задай тут конкретный вопрос по поводу определённой функции.
 
  • Нравится
Реакции: Wei Huang

Wei Huang

Участник
21
0
Готовых топиков, посвящённых именно диалогам не знаю, поищи на бх по названиям функций, либо же задай тут конкретный вопрос по поводу определённой функции.
Понял Окей, мне просто нужно работать с статистикой персонажа, там материалы например.
 

Neon3333

Известный
181
71
Понял Окей, мне просто нужно работать с статистикой персонажа, там материалы например.
Есть событие
Lua:
onShowDialog(id, style, title, btn1, btn2, text)

Если тебе, допустим, необходимо получить какие-то данные, то:
1. Узнаешь ид нужного тебе диалога.
2. Проверяешь, тот ли диалог сейчас открыт.
3. Парсишь с помощью
Lua:
text:match("шаблон") (или же string.match(text, "шаблон"))
необходимые тебе данные
 

Иллидан

Новичок
4
0
я думаю лучше хранить список в таблице и перебирать её for`ом
это код функции)
просто без function Button1_OnClick() и end в начале и конце.

GetNumWhoResults() - это результаты запроса игроков в сети(любых) который отображается в виде списка, в котором у каждого игрока есть имя.

А цикл перебирает этот список имён по порядку, через
c,g=GetWhoInfo(i); где с это переменная в которую помещается 1 имя за шаг цикла, а i это порядковый номер имени в списке.
myMacro - как временный динамический контейнер, в который мне нужно помещать этот список имён игроков через цикл, через строку и перед именем в начале каждой строки добавить текст "/пригласить", тоесть что бы цикл создавал список, в котором каждая строка начинается на "/пригласить" и заканчивается именем получаемым из переменной c

список игроков из GetNumWhoResults() при выполнении этой функции, каждый раз меняется, т.к. это список онлайн-игроков

это всё находится на 1 кнопке, а после нажатия по ней создаётся текстовый список, который помещается в myMacro и далее, по нижнему коду, создаётся фрейм отдельной кнопки(макрос) при нажатии которой, текст из myMacro обрабатывается и выполняется движком игры, на защищённом уровне, как если бы это была не модификация а родная часть клиента
+, лучше хранить в txt файле, а в коде записать его в таблицу и перебирать for`om.
можно пример, как это сделать?
Просто список имён игроков берётся сразу в игре из её же интерфейса и всё время обновляется, т.к. онлайн игроки меняются.
 

KashMar

Новичок
22
1
Ребят, есть какой-то сервер, чде модно выводить сообщения в чат? Мне нужно проверить работоспособность в sampev.onServerMessage. Или как это можно сделать? Просто на том сервере куда я это делаю, событие происходит очень редко.
 

ufdhbi

Известный
Проверенный
1,455
861
Ребят, есть какой-то сервер, чде модно выводить сообщения в чат? Мне нужно проверить работоспособность в sampev.onServerMessage. Или как это можно сделать? Просто на том сервере куда я это делаю, событие происходит очень редко.
Сам посылай искомую строчку в чат
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,731
4,720
Ребят, есть какой-то сервер, чде модно выводить сообщения в чат? Мне нужно проверить работоспособность в sampev.onServerMessage. Или как это можно сделать? Просто на том сервере куда я это делаю, событие происходит очень редко.
Эмулируй приходящее рпц
 

NoName_001

Участник
152
20
1. Можно ли сделать imgui.CollapsingHeader сразу развернутым(ну или как то воздействовать на него, чтобы можно было через ини сохранять его активность/пассивность)?

2. Как в printstring использовать русские символы?

3. Как сделать в данном коде
Lua:
imgui.OnFrame(function() return ckWallhack[0] and not isGamePaused() and isSampAvailable() and #getAllChars() > 1 end, function()
    theme()
    size = #getAllChars()
    imgui.PushStyleColor(imgui.Col.WindowBg, imgui.ImVec4(0, 0, 0, 0.25))
    imgui.SetNextWindowSize(imgui.ImVec2(200,size))
    imgui.Begin(u8'Список игроков в зоне стрима:')
    local peds = getAllChars()
    for z, v in pairs(peds) do
        local result2, idmwh = sampGetPlayerIdByCharHandle(v)
        if result2 and idmwh ~= sampGetPlayerIdByCharHandle(PLAYER_PED) then
            local exists, handle = sampGetCharHandleBySampPlayerId(idmwh)
            if doesCharExist(handle) then
                local color = sampGetPlayerColor(idmwh)
                if color == 5.53648127e8 then color = 0x99FDFDFD end -- white
                if color == 8025703 then color = 0xFF3333 end -- mask
                if color == 33554432 or color == 419430400 or color == 385875968 then color = 0x90000000 end -- spy-fbi
                local name = sampGetPlayerNickname(idmwh)
                local X, Y, Z = getCharCoordinates(handle)
                local x, y = convert3DCoordsToScreen(X, Y, Z)
                if not sampIsPlayerPaused(idmwh) then
                    imgui.Text(name..'['..idmwh..']')
                else
                    imgui.Text(name..'['..idmwh..'] (AFK)')
                end
            end
        end
    end
    imgui.End()
end).HideCursor = true
автоматический выбор размера(т.е чем больше imgui.Text(), тем больше окно)?
 

ufdhbi

Известный
Проверенный
1,455
861
Это как, можно пример?
Lua:
function emul_server_message(color, msg)
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt32(bs, color)
    raknetBitStreamWriteInt32(bs, msg:len())
    raknetBitStreamWriteString(bs, msg)
    raknetEmulRpcReceiveBitStream(93, bs)
end
1. Можно ли сделать imgui.CollapsingHeader сразу развернутым(ну или как то воздействовать на него, чтобы можно было через ини сохранять его активность/пассивность)?

2. Как в printstring использовать русские символы?

3. Как сделать в данном коде
Lua:
imgui.OnFrame(function() return ckWallhack[0] and not isGamePaused() and isSampAvailable() and #getAllChars() > 1 end, function()
    theme()
    size = #getAllChars()
    imgui.PushStyleColor(imgui.Col.WindowBg, imgui.ImVec4(0, 0, 0, 0.25))
    imgui.SetNextWindowSize(imgui.ImVec2(200,size))
    imgui.Begin(u8'Список игроков в зоне стрима:')
    local peds = getAllChars()
    for z, v in pairs(peds) do
        local result2, idmwh = sampGetPlayerIdByCharHandle(v)
        if result2 and idmwh ~= sampGetPlayerIdByCharHandle(PLAYER_PED) then
            local exists, handle = sampGetCharHandleBySampPlayerId(idmwh)
            if doesCharExist(handle) then
                local color = sampGetPlayerColor(idmwh)
                if color == 5.53648127e8 then color = 0x99FDFDFD end -- white
                if color == 8025703 then color = 0xFF3333 end -- mask
                if color == 33554432 or color == 419430400 or color == 385875968 then color = 0x90000000 end -- spy-fbi
                local name = sampGetPlayerNickname(idmwh)
                local X, Y, Z = getCharCoordinates(handle)
                local x, y = convert3DCoordsToScreen(X, Y, Z)
                if not sampIsPlayerPaused(idmwh) then
                    imgui.Text(name..'['..idmwh..']')
                else
                    imgui.Text(name..'['..idmwh..'] (AFK)')
                end
            end
        end
    end
    imgui.End()
end).HideCursor = true
автоматический выбор размера(т.е чем больше imgui.Text(), тем больше окно)?
1. imgui.CollapsingHeader("Test", true)
2. В полезных сниппетах выкладывали функцию для конвертации
3. imgui.Begin(u8'Список игроков в зоне стрима:', ckWallhack, imgui.WindowFlags.AlwaysAutoResize)
 
  • Нравится
Реакции: NoName_001

Neon3333

Известный
181
71
1. Можно ли сделать imgui.CollapsingHeader сразу развернутым(ну или как то воздействовать на него, чтобы можно было через ини сохранять его активность/пассивность)?

2. Как в printstring использовать русские символы?

3. Как сделать в данном коде
Lua:
imgui.OnFrame(function() return ckWallhack[0] and not isGamePaused() and isSampAvailable() and #getAllChars() > 1 end, function()
    theme()
    size = #getAllChars()
    imgui.PushStyleColor(imgui.Col.WindowBg, imgui.ImVec4(0, 0, 0, 0.25))
    imgui.SetNextWindowSize(imgui.ImVec2(200,size))
    imgui.Begin(u8'Список игроков в зоне стрима:')
    local peds = getAllChars()
    for z, v in pairs(peds) do
        local result2, idmwh = sampGetPlayerIdByCharHandle(v)
        if result2 and idmwh ~= sampGetPlayerIdByCharHandle(PLAYER_PED) then
            local exists, handle = sampGetCharHandleBySampPlayerId(idmwh)
            if doesCharExist(handle) then
                local color = sampGetPlayerColor(idmwh)
                if color == 5.53648127e8 then color = 0x99FDFDFD end -- white
                if color == 8025703 then color = 0xFF3333 end -- mask
                if color == 33554432 or color == 419430400 or color == 385875968 then color = 0x90000000 end -- spy-fbi
                local name = sampGetPlayerNickname(idmwh)
                local X, Y, Z = getCharCoordinates(handle)
                local x, y = convert3DCoordsToScreen(X, Y, Z)
                if not sampIsPlayerPaused(idmwh) then
                    imgui.Text(name..'['..idmwh..']')
                else
                    imgui.Text(name..'['..idmwh..'] (AFK)')
                end
            end
        end
    end
    imgui.End()
end).HideCursor = true
автоматический выбор размера(т.е чем больше imgui.Text(), тем больше окно)?
Тебе нужно
1. Можно ли сделать imgui.CollapsingHeader сразу развернутым(ну или как то воздействовать на него, чтобы можно было через ини сохранять его активность/пассивность)?

2. Как в printstring использовать русские символы?

3. Как сделать в данном коде
Lua:
imgui.OnFrame(function() return ckWallhack[0] and not isGamePaused() and isSampAvailable() and #getAllChars() > 1 end, function()
    theme()
    size = #getAllChars()
    imgui.PushStyleColor(imgui.Col.WindowBg, imgui.ImVec4(0, 0, 0, 0.25))
    imgui.SetNextWindowSize(imgui.ImVec2(200,size))
    imgui.Begin(u8'Список игроков в зоне стрима:')
    local peds = getAllChars()
    for z, v in pairs(peds) do
        local result2, idmwh = sampGetPlayerIdByCharHandle(v)
        if result2 and idmwh ~= sampGetPlayerIdByCharHandle(PLAYER_PED) then
            local exists, handle = sampGetCharHandleBySampPlayerId(idmwh)
            if doesCharExist(handle) then
                local color = sampGetPlayerColor(idmwh)
                if color == 5.53648127e8 then color = 0x99FDFDFD end -- white
                if color == 8025703 then color = 0xFF3333 end -- mask
                if color == 33554432 or color == 419430400 or color == 385875968 then color = 0x90000000 end -- spy-fbi
                local name = sampGetPlayerNickname(idmwh)
                local X, Y, Z = getCharCoordinates(handle)
                local x, y = convert3DCoordsToScreen(X, Y, Z)
                if not sampIsPlayerPaused(idmwh) then
                    imgui.Text(name..'['..idmwh..']')
                else
                    imgui.Text(name..'['..idmwh..'] (AFK)')
                end
            end
        end
    end
    imgui.End()
end).HideCursor = true
автоматический выбор размера(т.е чем больше imgui.Text(), тем больше окно)?
Lua:
imgui.OnFrame(function() return ckWallhack[0] and not isGamePaused() and isSampAvailable() and #getAllChars() > 1 end, function()
    theme()
    size = #getAllChars()
    imgui.PushStyleColor(imgui.Col.WindowBg, imgui.ImVec4(0, 0, 0, 0.25))
    imgui.SetNextWindowSize(imgui.ImVec2(width,height))
    imgui.Begin(u8'Список игроков в зоне стрима:')
    local peds = getAllChars()
    for z, v in pairs(peds) do
        local result2, idmwh = sampGetPlayerIdByCharHandle(v)
        if result2 and idmwh ~= sampGetPlayerIdByCharHandle(PLAYER_PED) then
            local exists, handle = sampGetCharHandleBySampPlayerId(idmwh)
            if doesCharExist(handle) then
                local color = sampGetPlayerColor(idmwh)
                if color == 5.53648127e8 then color = 0x99FDFDFD end -- white
                if color == 8025703 then color = 0xFF3333 end -- mask
                if color == 33554432 or color == 419430400 or color == 385875968 then color = 0x90000000 end -- spy-fbi
                local name = sampGetPlayerNickname(idmwh)
                local X, Y, Z = getCharCoordinates(handle)
                local x, y = convert3DCoordsToScreen(X, Y, Z)
                if sampIsPlayerPaused(idmwh) then status = "(AFK)" else status = "" end
                    local text = name..'['..idmwh..'] '..status
                    imgui.Text(text)
                    width = imgui.CalcTextSize(text).x -- переменную width объяви где-то и корректируй как тебе нужно, с учетом CalcTextSize(text).x
                end
            end
        end
    end
    imgui.End()
end).HideCursor = true
 

D.Makarov

Участник
146
3
как сделать активацию командой а не кнопкой помогите пожалуйста ребят
Lua:
result, button, list, input = sampHasDialogRespond(229)
        if result and button == 1 then
            if list == 0 then -- Если выбран 1 пункт то..
                sampSendChat('Здравствуйте, Младший Специалист г. San-Fiero Conor McGregor.')
                wait(1000)
                sampSendChat('Могу я увидеть вашу мед.карту?')
            elseif list == 1 then
                sampSendChat("/me взял мед.карту от человека напротив")
                wait(1000)
                sampSendChat("/anim 21")
                wait(3000)
                sampSendChat('/me осмотрел мед.карту на наличие болезней')
                wait(3000)
                sampSendChat('Прошу вас пройти на весы.')
            elseif list == 2 then
                sampSendChat("/do Какой вес у человека стоящего на весах?")
                wait(1000)
                sampSendChat('/n /do У "Ваше Имя и Фамилия" масса тела "Количество" кг.')
            elseif list == 3 then
                sampSendChat("Теперь измерим рост.")
                wait(1000)
                sampSendChat("/do Какой рост у человека?")
                wait(1000)
                sampSendChat('/n /do У "Ваше Имя и Фамилия" рост "Ваш рост" см.')
            elseif list == 4 then
                sampSendChat("Проведём психологическую проверку.")
                wait(1000)
                sampSendChat("Вы когда-то умирали?")
            elseif list == 5 then
                sampSendChat("Вы будете стрелять во врага который находится в толпе мирных жителей?")
            elseif list == 6 then
                sampSendChat('/me поставил(а) в медицинской карте печать "Годен"')
                wait(1000)
                sampSendChat("Поздравляю, Вы прошли мед. комиссию, проходите дальше.")
            elseif list == 7 then
                sampSendChat("К сожалению, Вы не являетесь годным к службе в армии.")
                wait(1000)
                sampSendChat('/me поставил(а) в медицинской карте печать "Не годен"')
            end
        end

        if isKeyDown(0x02) and isKeyJustPressed(VK_P) then
            sampShowDialog(229, "Мед.Проверка", 'Приветствие \nВзять мед. карту \nВес \nРост \nПроверка на МГ - 1 \nПроверка на МГ - 2 \nГоден \nНе годен \0', "Выбрать", "Закрыть", 2)
        end