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

Fott

Простреленный
3,461
2,374
как скомпилировать файл не под luac, а под lua?
lua - Открытый код, Открытый для просмотра файл.
luac - Закрытый код. Скомпилированный под определенную версию мунлоадера и закрытый для просмотра файл,.
 
  • Нравится
Реакции: user390868

MrBidloKoder

Известный
423
249
1. Брандмауэр, антивирус, антистиллер. Много факторов на самом деле.

2.Обычный запрос на доступность музыки, если все пришло - музыка.
Спасибо за второй ответ, но вопрос был: "как можно это сделать". Твой ответ не помог мне с этим разобраться.
 

MrBidloKoder

Известный
423
249
чувак. открытый код на то и открытый код. его не нужно компилировать. чтобы он работал. такой нет возможности. а если что. то чтобы луа скрипты работали их не нужно вообще комплировать. они так работают. луак делают чтобы скрыть код
чё, ты не тому ответил
 

Angr

Известный
291
99
Спасибо за второй ответ, но вопрос был: "как можно это сделать". Твой ответ не помог мне с этим разобраться.
Я не очень хочу продумывать это, наверное правильно будет сделать воспроизведение твоей музыки(загрузки) после того как игрок заспавнился или как-то иначе
 

enyag

Известный
345
12
lua - Открытый код, Открытый для просмотра файл.
luac - Закрытый код. Скомпилированный под определенную версию мунлоадера и закрытый для просмотра файл,.
я про то, что есть скрипты с форматом lua, а на деле они закрыты
 

MrBidloKoder

Известный
423
249
Вопрос 2: Как сделать проверку на доступность музыки? Допустим я выключаю интернет, захожу в самп, зависает на пару секунд и крашит игру. Но если подключить интернет, то краша не будет. Как это всё пофиксить?
Нужна помощь экспертов
 

MrBidloKoder

Известный
423
249
Что за музыка? Как ее включаешь?
IMG_20201001_173405.jpg
 

Tak

Известный
177
70

Даа, проверил, даже если в отдельном потоке загружать аудио с сайта - самп зависает на 2 секунды.
Как вариант загружать mp3 файл (при загрузки mp3 samp не зависает)

Для проверки на интернет соединение, можно подгружать поток после спавна игрока. (если интернета не будет игрок не подключится к серверу, т.е. не заспавниться)
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
What is the role of changing my character's skin?
Lua:
-- in function main()
sampRegisterChatCommand("sskin", function(param)
    local skinId = tonumber(param)
    if skinId ~= nil then
        local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
        SetPlayerSkin(myid, skinId)
    else
        sampAddChatMessage("Use /sskin [ID]", -1)
    end
end)

-- outside main()
function SetPlayerSkin(id, skin)
    local BS = raknetNewBitStream()
    raknetBitStreamWriteInt32(BS, id)
    raknetBitStreamWriteInt32(BS, skin)
    raknetEmulRpcReceiveBitStream(153, BS)
    raknetDeleteBitStream(BS)
end
 

Trout

Новичок
2
0
Подскажите, в bass.lua BASS_ErrorGetCode() выдает ошибку 4 (BASS_ERROR_BUFLOST), звук не идёт, что делать?
Код базовый, только вывод кода ошибки добавил:
Lua:
script_name("bass library test")

function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do
        wait(0)
    end
    local bass = require "lib.bass" -- загружаем модуль
    local radio = bass.BASS_StreamCreateFile(false, "moonloader/music.mp3", 0, 0, 0)
    bass.BASS_ChannelSetAttribute(radio, BASS_ATTRIB_VOL, 0.1) -- громкость
    bass.BASS_ChannelPlay(radio, false) -- воспроизвести
    sampAddChatMessage(bass.BASS_ErrorGetCode(),-1)
    wait(-1)
end