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

Anton Nixon

Известный
474
48
как сделать чтобы не выводило по два раза
P.S. нужно чтобы в чат писало только второй вариант (*смотреть под спойлером)
2020-06-09 20-21-06-481.png
Lua:
function sampev.onServerMessage(color, text)
    text:find("%[%d%]")
    local id = text:match("(%d)")
    local nck = sampGetPlayerNickname(id)
    local nick = nck:gsub("_", " ")
    for n, s in pairs(badwords) do
        if #s > 0 then
            if text:find(s) then
                for i, k in pairs(badwords) do
                    if k == s then
                        lua_thread.create(function()
                            wait(100)
                            sampAddChatMessage("[AutoCensure]{F5F5DC} "..nick.." ["..id.."] использовал запрещенное слово:{00ffd9} "..k.."!", 0x9000ff)
                            sampAddChatMessage("[AutoCensure]{F5F5DC} Чтобы выдать мут нажмите {008f02}button1{F5F5DC}, для отмены {ab0000}button2", 0x9000ff)
                        end)
                        break
                    end
                end
            end
        end
    end
end
 

krol88

Участник
58
12
Дарова, ёмаё, уже 2 раз сюда пишу. Можете кинуть паттерны под stats в аризоне?
Именно надо ранг во фракции и сама фракция. Вот вам как выглядят эти строки и что нужно получить

Организация: [TV студия] (там где тв студия надо именно записать в переменную)

Должность: Тех.редактор(2) (нужно получить именно РАНГ, то есть то что в скобках, а именно 2)

update: ну и если не жалко можете рассказать как обнулять значение в inicfg каждый новый день
 

Eugene Crabs

Активный
544
30
prover' tak
Lua:
local EntrToAFK = 0
local ev = require"lib.samp.events"


function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end
    while true do
        wait(40)
        if isKeyDown(73) and isKeyJustPressed(17) then -- Ctrl + I
            if EntrToAFK == 1 then
                EntrToAFK = 0
            else
                EntrToAFK = 1
            end
        end
    end
end

function ev.onSendPlayerSync(data) -- (onSendPacket)
    if EntrToAFK == 1 then
        return false
    end
end
Как мной и предполагалось, это ничего не дает
 

Fott

Простреленный
3,466
2,383
как сделать чтобы не выводило по два раза
P.S. нужно чтобы в чат писало только второй вариант (*смотреть под спойлером)
Lua:
function sampev.onServerMessage(color, text)
    text:find("%[%d%]")
    local id = text:match("(%d)")
    local nck = sampGetPlayerNickname(id)
    local nick = nck:gsub("_", " ")
    for n, s in pairs(badwords) do
        if #s > 0 then
            if msg:find(s) then
                for i, k in pairs(badwords) do
                    if k == s then
                        lua_thread.create(function()
                            wait(100)
                            sampAddChatMessage("[AutoCensure]{F5F5DC} "..nick.." ["..id.."] использовал запрещенное слово:{00ffd9} "..k.."!", 0x9000ff)
                            sampAddChatMessage("[AutoCensure]{F5F5DC} Чтобы выдать мут нажмите {008f02}button1{F5F5DC}, для отмены {ab0000}button2", 0x9000ff)
                        end)
                        break
                    end
                end
            end
        end
    end
end
Попробуй
Lua:
function sampev.onServerMessage(color, text)
local id, msg = text:match('.+%[(%d+)]: (.+)')
    if id and msg then
    local nck = sampGetPlayerNickname(id)
    local nick = nck:gsub("_", " ")
    for n, s in pairs(badwords) do
        if #s > 0 then
            if text:find(s) then
                for i, k in pairs(badwords) do
                    if k == s then
                        lua_thread.create(function()
                            wait(100)
                            sampAddChatMessage("[AutoCensure]{F5F5DC} "..nick.." ["..id.."] использовал запрещенное слово:{00ffd9} "..k.."!", 0x9000ff)
                            sampAddChatMessage("[AutoCensure]{F5F5DC} Чтобы выдать мут нажмите {008f02}button1{F5F5DC}, для отмены {ab0000}button2", 0x9000ff)
                        end)
                        break
                    end
                end
            end
        end
    end
end

UPD:Проверил твой код, у меня отправляет каждую строчку 1 раз как и положено, ищи проблему в другом и все таки попробуй мой, он тоже рабочий
 
Последнее редактирование:

Anton Nixon

Известный
474
48
Попробуй
Lua:
function sampev.onServerMessage(color, text)
local id, msg = text:match('.+%[(%d+)]: (.+)')
    if id and msg then
    local nck = sampGetPlayerNickname(id)
    local nick = nck:gsub("_", " ")
    for n, s in pairs(badwords) do
        if #s > 0 then
            if text:find(s) then
                for i, k in pairs(badwords) do
                    if k == s then
                        lua_thread.create(function()
                            wait(100)
                            sampAddChatMessage("[AutoCensure]{F5F5DC} "..nick.." ["..id.."] использовал запрещенное слово:{00ffd9} "..k.."!", 0x9000ff)
                            sampAddChatMessage("[AutoCensure]{F5F5DC} Чтобы выдать мут нажмите {008f02}button1{F5F5DC}, для отмены {ab0000}button2", 0x9000ff)
                        end)
                        break
                    end
                end
            end
        end
    end
end
чет даже вообще не работает, скрипт запускается, но реакции 0
 

Fomikus

Известный
Проверенный
473
346
Как сделать окошко в ImGui чтобы оно висело просто и рендерилось (Курсор не показывается, просто как элемент интерфейса)
 

Joni Scripts

Известный
535
376
Как сделать окошко в ImGui чтобы оно висело просто и рендерилось (Курсор не показывается, просто как элемент интерфейса)
Просто делать imgui.ShowCursor = false, тогда это будет как картинка и ты сможешь бегать и все делать
 
  • Нравится
Реакции: Fomikus

Rei

Известный
Друг
1,616
1,676
чет даже вообще не работает, скрипт запускается, но реакции 0
Есть 3 костыля на выбор

Убрать слово хуйня ( зачем оно нужно, если корень - хуй у тебя уже записан )

В массиве ставить пробелы до и после слов ( тут очевидные минусы )

Добавить переменную-заглушку, которая будет принимать в себя выведенную строчку, а перед выводом проверять ее на совпадение с выводимой, это кста спасет еще и от флуда

По другому не умеем, быдлокод онли
Но вообще, в луа со строчками можно многое вытворять, просто я сам кроме find, match и gsub ничего не знаю
 

Vespan

loneliness
Проверенный
2,135
1,765
Код:
    if string.find(text, 'Гл.Хелпер' or 'Мл.Хелпер') then
        --    renderFontDrawText(my_font, 'Colors:\n{FF0000}Red\n{00FF00}Green\n{0000FF}Blue\n{80FFFFFF}Transparent white', 10, 400, 0xFFFFFFFF)
    end
Как сделать,что бы логировались сообщение з чата Хелперов?
 

Anton Nixon

Известный
474
48
Добавить переменную-заглушку, которая будет принимать в себя выведенную строчку, а перед выводом проверять ее на совпадение с выводимой, это кста спасет еще и от флуда
а можно пример какой-нибудь как это будет выглядеть, а то я сапожка капец))
 

Joni Scripts

Известный
535
376
Код:
    if string.find(text, 'Гл.Хелпер' or 'Мл.Хелпер') then
        --    renderFontDrawText(my_font, 'Colors:\n{FF0000}Red\n{00FF00}Green\n{0000FF}Blue\n{80FFFFFF}Transparent white', 10, 400, 0xFFFFFFFF)
    end
Как сделать,что бы логировались сообщение з чата Хелперов?
Код:
if string:find(text, 'Гл.Хелпер' or 'Мл.Хелпер') then
renderFontDrawText(my_font, 'Colors:\n{FF0000}Red\n{00FF00}Green\n{0000FF}Blue\n{80FFFFFF}Transparent white', 10, 400, 0xFFFFFFFF)
end
а можно пример какой-нибудь как это будет выглядеть, а то я сапожка капец))
ну тип laststr = "куку", и сравниваешь
if text ~= laststr then