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

T1cKz

Известный
595
245
Как сделать так что бы трейлер сразу цеплялся на фуру(на дрп тип)
 

Adventurer

Известный
151
69
Возможно ли через Луа скрипт вывести картинку на экран?
Очень просто, если речь идет об imgui.

Lua:
--В начале скрипта, где ты указываешь окна, прочие переменные, и так далее:

if doesFileExist(getGameDirectory() .. '\\moonloader\\images\\picture_main.png') then -- условие, существует ли заданная картинка
    picture_main= imgui.CreateTextureFromFile(getGameDirectory() .. '\\moonloader\\images\\picture_main.png') --загружается из директории moonloader\images\
else
    --тут можно написать, чтобы эта картинка скачивалась с файлового хостинга, а затем перезапускать скрипт
    picture_main= nil
end


--это уже прописываешь в готовом окне, в функции OnDrawFrame
if picture_main then -- если все окей, то показывает изображение, иначе - ошибка "не удается..."
      imgui.Image(picture_main, imgui.ImVec2(270, 80)) --[[270 - это длина; 80 - высота]]
else
      imgui.Text(u8"Не удается показать изображение.")
end
 
Последнее редактирование:

RipperBob4ik

Новичок
7
0
Сложна :D
Дай скрипт, на то, чтобы при вводе одной команды выбиралось рандомное действие из нескольких прописанных. <3
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,657
2,547
Сложна :D
Дай скрипт, на то, чтобы при вводе одной команды выбиралось рандомное действие из нескольких прописанных. <3
Lua:
math.randomseed(os.time())
local helpd = math.random(1, 10)
if helpd == 1 then
    sampAddChatMessage("[ PHELP ]{ffffff}: Если вы хотите узнать, кто в вас выстрелил последний раз - нажмите кнопку {0088ff}X.", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: Однако, учтите, с киллерами такое не получится.", 0x0088ff)
elseif helpd == 2 then
    sampAddChatMessage("[ PHELP ]{ffffff}: У нас действует свой отдельный чат, в котором могут общаться кто угодно!", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: Для взаимодействия с данным чатом включите его. [{0088ff} /pinfo » Модификации {ffffff}]", 0x0088ff)
elseif helpd == 3 then
    sampAddChatMessage("[ PHELP ]{ffffff}: У нас существует отдельная модификация, именуемая как \'Стробоскопы\'", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: Данная модификация срабатывает при включённых мигалках в транспортном средстве.", 0x0088ff)
elseif helpd == 4 then
    sampAddChatMessage("[ PHELP ]{ffffff}: Данный скрипт обновляется часто, по этому если у вас есть идея по улучшению или обнаружили недоработку.", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: Вы можете обратиться к основателю скрипта через соц.сеть VK. [ {0088ff}vk.com/thenortonpclife{ffffff} ]", 0x0088ff)
elseif helpd == 5 then
    sampAddChatMessage("[ PHELP ]{ffffff}: У нас действует система горячих клавиш, подробнее в [ /pinfo » Основная информация » Горячие клавиши ]", 0x0088ff)
elseif helpd == 6 then
    sampAddChatMessage("[ PHELP ]{ffffff}: Не работают горячие клавиши? Проверьте включённость NUMLOCK, она должна быть включена.", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: А так-же, если у вас установлен биндер - выключите его.", 0x0088ff)
elseif helpd == 7 then
    sampAddChatMessage("[ PHELP ]{ffffff}: Обращайте внимание на версию Police Helper, вполне возможно, что скрипт обновился и были добавлены новые функции.", 0x0088ff)
elseif helpd == 8 then
    sampAddChatMessage("[ PHELP ]{ffffff}: Если у вас Police Helper иногда показывает в SMS одну версию, а в другой раз показывает другую, то будьте внимательны.", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: Вполне возможно, что в первом - версия установщика, а во втором - версия самого скрипта.", 0x0088ff)
elseif helpd == 9 then
    sampAddChatMessage("[ PHELP ]{ffffff}: Быстрое меню 1.0 и 2.0 срабатывают только при появлении зелёного треугольника над головой персонажа.", 0x0088ff)
elseif helpd == 10 then
    sampAddChatMessage("[ PHELP ]{ffffff}: Пожалуйста, будьте адекватны в чате Police Helper, не оскорбляйте, не пишите включенным CAPSLOCK-ом.", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: В чате запрещена торговля, если вы хотите обсудить цену с другом - используйте [{0088ff} /kw или /ksms Ник Текст{ffffff} ]", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: В противном случае вы можете получить блокировку чата от 5 минут до бесконечности.", 0x0088ff)
end
 

RipperBob4ik

Новичок
7
0
Lua:
math.randomseed(os.time())
local helpd = math.random(1, 10)
if helpd == 1 then
    sampAddChatMessage("[ PHELP ]{ffffff}: Если вы хотите узнать, кто в вас выстрелил последний раз - нажмите кнопку {0088ff}X.", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: Однако, учтите, с киллерами такое не получится.", 0x0088ff)
elseif helpd == 2 then
    sampAddChatMessage("[ PHELP ]{ffffff}: У нас действует свой отдельный чат, в котором могут общаться кто угодно!", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: Для взаимодействия с данным чатом включите его. [{0088ff} /pinfo » Модификации {ffffff}]", 0x0088ff)
elseif helpd == 3 then
    sampAddChatMessage("[ PHELP ]{ffffff}: У нас существует отдельная модификация, именуемая как \'Стробоскопы\'", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: Данная модификация срабатывает при включённых мигалках в транспортном средстве.", 0x0088ff)
elseif helpd == 4 then
    sampAddChatMessage("[ PHELP ]{ffffff}: Данный скрипт обновляется часто, по этому если у вас есть идея по улучшению или обнаружили недоработку.", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: Вы можете обратиться к основателю скрипта через соц.сеть VK. [ {0088ff}vk.com/thenortonpclife{ffffff} ]", 0x0088ff)
elseif helpd == 5 then
    sampAddChatMessage("[ PHELP ]{ffffff}: У нас действует система горячих клавиш, подробнее в [ /pinfo » Основная информация » Горячие клавиши ]", 0x0088ff)
elseif helpd == 6 then
    sampAddChatMessage("[ PHELP ]{ffffff}: Не работают горячие клавиши? Проверьте включённость NUMLOCK, она должна быть включена.", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: А так-же, если у вас установлен биндер - выключите его.", 0x0088ff)
elseif helpd == 7 then
    sampAddChatMessage("[ PHELP ]{ffffff}: Обращайте внимание на версию Police Helper, вполне возможно, что скрипт обновился и были добавлены новые функции.", 0x0088ff)
elseif helpd == 8 then
    sampAddChatMessage("[ PHELP ]{ffffff}: Если у вас Police Helper иногда показывает в SMS одну версию, а в другой раз показывает другую, то будьте внимательны.", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: Вполне возможно, что в первом - версия установщика, а во втором - версия самого скрипта.", 0x0088ff)
elseif helpd == 9 then
    sampAddChatMessage("[ PHELP ]{ffffff}: Быстрое меню 1.0 и 2.0 срабатывают только при появлении зелёного треугольника над головой персонажа.", 0x0088ff)
elseif helpd == 10 then
    sampAddChatMessage("[ PHELP ]{ffffff}: Пожалуйста, будьте адекватны в чате Police Helper, не оскорбляйте, не пишите включенным CAPSLOCK-ом.", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: В чате запрещена торговля, если вы хотите обсудить цену с другом - используйте [{0088ff} /kw или /ksms Ник Текст{ffffff} ]", 0x0088ff)
    sampAddChatMessage("[ PHELP ]{ffffff}: В противном случае вы можете получить блокировку чата от 5 минут до бесконечности.", 0x0088ff)
end
Я ж говорю, он от времени работает, а мне надо от ввода команды( Я уже делал так.
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,657
2,547
Я ж говорю, он от времени работает, а мне надо от ввода команды( Я уже делал так.
Lua:
sampRegisterChatCommand('hello', function()
    math.randomseed(os.time())
    local helpd = math.random(1, 10)
    if helpd == 1 then
        sampAddChatMessage("[ PHELP ]{ffffff}: Если вы хотите узнать, кто в вас выстрелил последний раз - нажмите кнопку {0088ff}X.", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: Однако, учтите, с киллерами такое не получится.", 0x0088ff)
    elseif helpd == 2 then
        sampAddChatMessage("[ PHELP ]{ffffff}: У нас действует свой отдельный чат, в котором могут общаться кто угодно!", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: Для взаимодействия с данным чатом включите его. [{0088ff} /pinfo » Модификации {ffffff}]", 0x0088ff)
    elseif helpd == 3 then
        sampAddChatMessage("[ PHELP ]{ffffff}: У нас существует отдельная модификация, именуемая как \'Стробоскопы\'", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: Данная модификация срабатывает при включённых мигалках в транспортном средстве.", 0x0088ff)
    elseif helpd == 4 then
        sampAddChatMessage("[ PHELP ]{ffffff}: Данный скрипт обновляется часто, по этому если у вас есть идея по улучшению или обнаружили недоработку.", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: Вы можете обратиться к основателю скрипта через соц.сеть VK. [ {0088ff}vk.com/thenortonpclife{ffffff} ]", 0x0088ff)
    elseif helpd == 5 then
        sampAddChatMessage("[ PHELP ]{ffffff}: У нас действует система горячих клавиш, подробнее в [ /pinfo » Основная информация » Горячие клавиши ]", 0x0088ff)
    elseif helpd == 6 then
        sampAddChatMessage("[ PHELP ]{ffffff}: Не работают горячие клавиши? Проверьте включённость NUMLOCK, она должна быть включена.", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: А так-же, если у вас установлен биндер - выключите его.", 0x0088ff)
    elseif helpd == 7 then
        sampAddChatMessage("[ PHELP ]{ffffff}: Обращайте внимание на версию Police Helper, вполне возможно, что скрипт обновился и были добавлены новые функции.", 0x0088ff)
    elseif helpd == 8 then
        sampAddChatMessage("[ PHELP ]{ffffff}: Если у вас Police Helper иногда показывает в SMS одну версию, а в другой раз показывает другую, то будьте внимательны.", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: Вполне возможно, что в первом - версия установщика, а во втором - версия самого скрипта.", 0x0088ff)
    elseif helpd == 9 then
        sampAddChatMessage("[ PHELP ]{ffffff}: Быстрое меню 1.0 и 2.0 срабатывают только при появлении зелёного треугольника над головой персонажа.", 0x0088ff)
    elseif helpd == 10 then
        sampAddChatMessage("[ PHELP ]{ffffff}: Пожалуйста, будьте адекватны в чате Police Helper, не оскорбляйте, не пишите включенным CAPSLOCK-ом.", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: В чате запрещена торговля, если вы хотите обсудить цену с другом - используйте [{0088ff} /kw или /ksms Ник Текст{ffffff} ]", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: В противном случае вы можете получить блокировку чата от 5 минут до бесконечности.", 0x0088ff)
    end
end)
?!?!? Если ты про math.randomseed(os.time()), то это seed, а не момент, когда начинается.
 
  • Нравится
Реакции: RipperBob4ik

checkdasound

Известный
Проверенный
963
410
Что не так?
Lua:
function main()
    while true do
        wait(0)
        if isKeyJustPressed(0x72) then -- F3
            sampSendChat('/q')
        end
    end
end
 

RipperBob4ik

Новичок
7
0
Lua:
sampRegisterChatCommand('hello', function()
    math.randomseed(os.time())
    local helpd = math.random(1, 10)
    if helpd == 1 then
        sampAddChatMessage("[ PHELP ]{ffffff}: Если вы хотите узнать, кто в вас выстрелил последний раз - нажмите кнопку {0088ff}X.", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: Однако, учтите, с киллерами такое не получится.", 0x0088ff)
    elseif helpd == 2 then
        sampAddChatMessage("[ PHELP ]{ffffff}: У нас действует свой отдельный чат, в котором могут общаться кто угодно!", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: Для взаимодействия с данным чатом включите его. [{0088ff} /pinfo » Модификации {ffffff}]", 0x0088ff)
    elseif helpd == 3 then
        sampAddChatMessage("[ PHELP ]{ffffff}: У нас существует отдельная модификация, именуемая как \'Стробоскопы\'", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: Данная модификация срабатывает при включённых мигалках в транспортном средстве.", 0x0088ff)
    elseif helpd == 4 then
        sampAddChatMessage("[ PHELP ]{ffffff}: Данный скрипт обновляется часто, по этому если у вас есть идея по улучшению или обнаружили недоработку.", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: Вы можете обратиться к основателю скрипта через соц.сеть VK. [ {0088ff}vk.com/thenortonpclife{ffffff} ]", 0x0088ff)
    elseif helpd == 5 then
        sampAddChatMessage("[ PHELP ]{ffffff}: У нас действует система горячих клавиш, подробнее в [ /pinfo » Основная информация » Горячие клавиши ]", 0x0088ff)
    elseif helpd == 6 then
        sampAddChatMessage("[ PHELP ]{ffffff}: Не работают горячие клавиши? Проверьте включённость NUMLOCK, она должна быть включена.", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: А так-же, если у вас установлен биндер - выключите его.", 0x0088ff)
    elseif helpd == 7 then
        sampAddChatMessage("[ PHELP ]{ffffff}: Обращайте внимание на версию Police Helper, вполне возможно, что скрипт обновился и были добавлены новые функции.", 0x0088ff)
    elseif helpd == 8 then
        sampAddChatMessage("[ PHELP ]{ffffff}: Если у вас Police Helper иногда показывает в SMS одну версию, а в другой раз показывает другую, то будьте внимательны.", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: Вполне возможно, что в первом - версия установщика, а во втором - версия самого скрипта.", 0x0088ff)
    elseif helpd == 9 then
        sampAddChatMessage("[ PHELP ]{ffffff}: Быстрое меню 1.0 и 2.0 срабатывают только при появлении зелёного треугольника над головой персонажа.", 0x0088ff)
    elseif helpd == 10 then
        sampAddChatMessage("[ PHELP ]{ffffff}: Пожалуйста, будьте адекватны в чате Police Helper, не оскорбляйте, не пишите включенным CAPSLOCK-ом.", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: В чате запрещена торговля, если вы хотите обсудить цену с другом - используйте [{0088ff} /kw или /ksms Ник Текст{ffffff} ]", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: В противном случае вы можете получить блокировку чата от 5 минут до бесконечности.", 0x0088ff)
    end
end)
?!?!? Если ты про math.randomseed(os.time()), то это seed, а не момент, когда начинается.
Воо, от души. Нет, я не про math.randomseed. Он не реагировал на команду, а по сути я просто SampRegisterChatCommand перенёс чуть ниже к самому коду и заработало... Мэджик.