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

ewin

Известный
673
371
почему wait не работает? пишу для ракбота

123:
function onRunCommand(cmd)
    id = 147
    if cmd:find('!run') then
        print('Sitting')
        sendVehicleEnter(id)
    end
    wait(1000)
    if id == 147 then
        setVehicle(id, 0)
    end
end
дополняю ответ выше
создавай поток следующим образом:
Lua:
lua_thread.create(function()
  --code
end)
 

Revavi

Участник
101
24
Код:
function sampev.onServerMessage(color, text)
    local _, myID = sampGetPlayerIdByCharHandle(PLAYER_PED)
    local myNickname = sampGetPlayerNickname(myID)
    myID = tostring(myID)
    if string.sub(text, 1, 70+#myNickname+#myID) == '{1DBAF2}[Семья (Новости)] '..myNickname..'['..myID..']:{B9C1B8} пригласил в семью нового члена: ' then
        msg(1)
        playerNick = string.sub(text, 70+#myNickname+#myID, #text)
        if (string.sub(playerNick, #playerNick, #playerNick-4)):find('%[') then
            msg(2)
            if (string.sub(playerNick, #playerNick, #playerNick-5)):find('%[') then
                msg(3)
                playerNickname = string.sub(playerNick, #playerNick, #playerNick-6)
            else
                msg(4)
                playerNickname = string.sub(playerNick, #playerNick, #playerNick-5)
            end
        else
            msg(5)
            playerNickname = string.sub(playerNick, #playerNick, #playerNick-4)
        end
        playerID = string.sub(playerNick, #playerNickname+1, #playerNickname-2)
        msg(playerNick)
        msg(playerNickname)
        msg(playerID)
    end
end

Почему при инвайте человека в фаму пишет так:
1(правильно)
2 или 3/4/5(правильно)
Nick_Name[id]!(правильно)
*пусто*(неправильно)
Nick_Name[id](неправильно)

Должно быть:
1
2 или 3/4/5
Nick_name[id]!
Nick_name
id

Как сделать чтобы правильно было?
 
  • Злость
Реакции: qdIbp

Nixbones

Активный
109
37
Как чекнуть айди инты в которой ты находишься? (если это возможно)
 
  • Ха-ха
Реакции: qdIbp

Gelver

Участник
34
1
Как удалить серверные обьекты по указанному id , либо указанному model ? так чтобы при появлении нужного обьекта скрипт их удалял автоматически
 

kyrtion

Известный
897
318
Код:
function sampev.onServerMessage(color, text)
    local _, myID = sampGetPlayerIdByCharHandle(PLAYER_PED)
    local myNickname = sampGetPlayerNickname(myID)
    myID = tostring(myID)
    if string.sub(text, 1, 70+#myNickname+#myID) == '{1DBAF2}[Семья (Новости)] '..myNickname..'['..myID..']:{B9C1B8} пригласил в семью нового члена: ' then
        msg(1)
        playerNick = string.sub(text, 70+#myNickname+#myID, #text)
        if (string.sub(playerNick, #playerNick, #playerNick-4)):find('%[') then
            msg(2)
            if (string.sub(playerNick, #playerNick, #playerNick-5)):find('%[') then
                msg(3)
                playerNickname = string.sub(playerNick, #playerNick, #playerNick-6)
            else
                msg(4)
                playerNickname = string.sub(playerNick, #playerNick, #playerNick-5)
            end
        else
            msg(5)
            playerNickname = string.sub(playerNick, #playerNick, #playerNick-4)
        end
        playerID = string.sub(playerNick, #playerNickname+1, #playerNickname-2)
        msg(playerNick)
        msg(playerNickname)
        msg(playerID)
    end
end

Почему при инвайте человека в фаму пишет так:
1(правильно)
2 или 3/4/5(правильно)
Nick_Name[id]!(правильно)
*пусто*(неправильно)
Nick_Name[id](неправильно)

Должно быть:
1
2 или 3/4/5
Nick_name[id]!
Nick_name
id

Как сделать чтобы правильно было?
ну у тебя почти стало гЫвн0код
скажи, что нужно сделать и какие нужно выводить данные?


home/kyrtion/Games/SAMP/moonloader/sample.lua:
function sampev.onWindowMessage(color, text)
    local _, myID = sampGetPlayerIdByCharHandle(PLAYER_PED)
    local myNickname = sampGetPlayerNickname(myID)
    myID = tostring(myID)

    -- Если ТЫ пригласил чела, то хукает это:
    if text:find('%{1DBAF2%}%[Семья %(Новости%)%] '..myNickname..'%['..myID..'%]%:%{B9C1B8%} пригласил в семью нового члена%: (.+)%[(%d+)%]%!') then
        -- infoPlayer_MyNick -> Твой ник
        -- infoPlayer_MyID -> Твой ID
        -- infoPlayer_InviteNick -> Ник приглашённого
        -- infoPlayer_InviteID -> ID приглашённого
        local msg = text:gsub('%{......%}', '') -- исключаем цветной хекс с чата
        local infoPlayer_MyNick, infoPlayer_MyID, infoPlayer_InviteNick, infoPlayer_InviteID = msg:match('%[Семья %(Новости%)%] (.+)%[(%d+)%]%: пригласил в семью нового члена%: (.+)%[(%d+)%]%!$') -- $ обозначает что это конец строка
        -- Дальше что-то пишешь код, типа проверка что-то
        return true
    end
end
 
Последнее редактирование:

qdIbp

Автор темы
Проверенный
1,434
1,174
ну у тебя почти стало гЫвн0код
скажи, что нужно сделать и какие нужно выводить данные?


home/kyrtion/Games/SAMP/moonloader/sample.lua:
function sampev.onWindowMessage(color, text)
    local _, myID = sampGetPlayerIdByCharHandle(PLAYER_PED)
    local myNickname = sampGetPlayerNickname(myID)
    myID = tostring(myID)

    -- Если ТЫ пригласил чела, то хукает это:
    if text:find('%{1DBAF2%}%[Семья %(Новости%)%] '..myNickname..'%['..myID..'%]%:%{B9C1B8%} пригласил в семью нового члена%: (.+)%[(%d+)%]%!') then
        -- infoPlayer_MyNick -> Твой ник
        -- infoPlayer_MyID -> Твой ID
        -- infoPlayer_InviteNick -> Ник приглашённого
        -- infoPlayer_InviteID -> ID приглашённого
        local msg = text:gsub('%{......%}', '') -- исключаем цветной хекс с чата
        local infoPlayer_MyNick, infoPlayer_MyID, infoPlayer_InviteNick, infoPlayer_InviteID = msg:match('%[Семья %(Новости%)%] (.+)%[(%d+)%]%: пригласил в семью нового члена%: (.+)%[(%d+)%]%!$') -- $ обозначает что это конец строка
        -- Дальше что-то пишешь код, типа проверка что-то
        return true
    end
end
Лучше так
%{......%}
Ну как кот решает так он и мяучит
 
  • Вау
Реакции: kyrtion

F0RQU1N and

Известный
1,309
498
как его повернуть то?
1658720341207.png

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

qdIbp

Автор темы
Проверенный
1,434
1,174
да все уже, а как его повернуть то
Кого повернуть? Объект?
Если объект тогда руками
как пользовался если ты не нашёл эту функцию?Посмотреть вложение 159177
Тебе же отправили функцию поворота объекта

Если ты не понимаешь как использовать функцию ты так и напиши, не надо повторно спрашивать одно и тоже
 
  • Нравится
Реакции: F0RQU1N and

Willy4ka

вилличка
Модератор
411
719
Кого повернуть? Объект?
Если объект тогда руками

Тебе же отправили функцию поворота объекта

Если ты не понимаешь как использовать функцию ты так и напиши, не надо повторно спрашивать одно и тоже
да я протупил прост, сори
 
  • Нравится
Реакции: qdIbp

Daddyy

Известный
239
53
Как на ракботе можно получить список с id автомобилей в зоне стрима с нужным мне type'ом?
 

F0RQU1N and

Известный
1,309
498
  • Нравится
Реакции: Daddyy

F L I P S T A R

Участник
62
1
Столкнулся с проблемой при поиске строки в чате с использованием string.find, а именно скрипт не работает, если надо найти строчку с русскими символами. Пытался найти английские слова, все отлично работает, цифры тоже ищет, но на русские слова не реагирует.
Мне подсказали изменить кодировку на Windows 1251.
Вроде изменил кодировку в Notepad++, а по прежнему не работает.
В чем проблема?