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

blatnoyb

Известный
55
5
Парни, кто знает, как теперь с помощью эмулятора лаунчера аризоны авторизоваться на сервере после их фикса? Возможно, есть хоть какая-то подсказка?
 

vuyy

Активный
136
56
их состояние ведь хранится где-то? Вот простой пример с таблицей
Lua:
--вне тела мимгуи
local buttons = {
    {name = 'buttonOne', status = false},
    {name = 'buttonTwo', status = false},
    {name = 'buttonThree', status = false},
}

--в мимгуи
for k, v in pairs(buttons) do
    if imgui.stBut(v.name,v.status) then
        v.status = not v.status
    end
end
бля хотел ток что удалить соо, уже разобрался я оч тупо там сделал
(у меня стояло типо если 1 кнопка нажата другие false)
 
Последнее редактирование:
  • Нравится
  • Клоун
Реакции: Air_Official и MLycoris

Daniel Andersen

Новичок
2
0
Привет. Подскажите, пожалуйста, можно ли изменить facingangle свой при помощи луа? Если да, то как возможно это сделать?
 

tyukapa

Активный
299
65
Не находит текст: (без цвета)
Haruma_Okomito купил у вас Гражданский талон (1 шт.), вы получили $10 от продажи (комиссия 4 процент(а))
Код:
Lua:
text:find('(%w+_%w+) купил у вас (.+)%((%d+) шт.), вы получили $(%d+) от продажи (комиссия (%d) процент(а))')
 

хуега)

РП игрок
Модератор
2,568
2,269
Не находит текст: (без цвета)
Haruma_Okomito купил у вас Гражданский талон (1 шт.), вы получили $10 от продажи (комиссия 4 процент(а))
Код:
Lua:
text:find('(%w+_%w+) купил у вас (.+)%((%d+) шт.), вы получили $(%d+) от продажи (комиссия (%d) процент(а))')
скобки надо экранировать
Lua:
text = "Haruma_Okomito купил у вас Гражданский талон (1 шт.), вы получили $10 от продажи (комиссия 4 процент(а))"
print(text:find('(%w+_%w+) купил у вас (.+) %((%d+) шт.%), вы получили $(%d+) от продажи %(комиссия (%d) процент%(а%)%)'))
 
  • Влюблен
Реакции: tyukapa

tyukapa

Активный
299
65
скобки надо экранировать
Lua:
text = "Haruma_Okomito купил у вас Гражданский талон (1 шт.), вы получили $10 от продажи (комиссия 4 процент(а))"
print(text:find('(%w+_%w+) купил у вас (.+) %((%d+) шт.%), вы получили $(%d+) от продажи %(комиссия (%d) процент%(а%)%)'))
Почему-то пишет только ник, чат лог:
Haruma_Okomito купил у вас Пиво (1 шт.), вы получили $10 от продажи (комиссия 4 процент(а))

Код:
Lua:
        if text:find('(%w+_%w+) купил у вас (.+) %((%d+) шт.%), вы получили $(%d+) от продажи %(комиссия (%d) процент%(а%)%)') then
            local sellcrmess = text:match('(%w+_%w+) купил у вас (.+) %((%d+) шт.%), вы получили $(%d+) от продажи %(комиссия (%d) процент%(а%)%)')
            ini.config.sellcrmess = sellcrmess
            inicfg.save(ini, 'dimasex.ini')
            wait(1000)
            sendTelegramNotification(ini.config.sellcrmess)
        end

скрин:
1709401237206.png
 

хуега)

РП игрок
Модератор
2,568
2,269
Почему-то пишет только ник, чат лог:
Haruma_Okomito купил у вас Пиво (1 шт.), вы получили $10 от продажи (комиссия 4 процент(а))

Код:
Lua:
        if text:find('(%w+_%w+) купил у вас (.+) %((%d+) шт.%), вы получили $(%d+) от продажи %(комиссия (%d) процент%(а%)%)') then
            local sellcrmess = text:match('(%w+_%w+) купил у вас (.+) %((%d+) шт.%), вы получили $(%d+) от продажи %(комиссия (%d) процент%(а%)%)')
            ini.config.sellcrmess = sellcrmess
            inicfg.save(ini, 'dimasex.ini')
            wait(1000)
            sendTelegramNotification(ini.config.sellcrmess)
        end

скрин:
Посмотреть вложение 233499
Lua:
local nickname, object, quantity, profit, commission = text:match('(%w+_%w+) купил у вас (.+) %((%d+) шт.%), вы получили $(%d+) от продажи %(комиссия (%d) процент%(а%)%)')
 
  • Влюблен
Реакции: tyukapa

tyukapa

Активный
299
65
Lua:
local nickname, object, quantity, profit, commission = text:match('(%w+_%w+) купил у вас (.+) %((%d+) шт.%), вы получили $(%d+) от продажи %(комиссия (%d) процент%(а%)%)')
как это все в ini сохранить? типо
Lua:
ini.config.nickname = nicmname
ini.config.quantity = quantity
--итд?
--как это все выводить в sendTelegramNotification тогда? пример любой
 

хуега)

РП игрок
Модератор
2,568
2,269
как это все в ini сохранить? типо
Lua:
ini.config.nickname = nicmname
ini.config.quantity = quantity
--итд?
--как это все выводить в sendTelegramNotification тогда? пример любой
объединяй все в одну строку при помощи .. либо string.format
Lua:
sendTelegramNotification(var1 .. var2 .. var3)
 
  • Нравится
Реакции: tyukapa и recxvery

tyukapa

Активный
299
65

Как исправить это проблему?
.lua:146: attempt to concatenate upvalue 'chat_id' (a userdata value)

чат ид сохраняю в ини, скрипт не видит
Lua:
-- код

local file = 'dimasex.ini'
local directIni = ('moonloader\\config\\dimasex.ini')
local ini = inicfg.load({
    config = {
        stats = '',
    },
    bot = {
        token_tg = 'токен сюда для теста ставил, также все',
        chatid_tg = 'чат ид сюда для теста ставил, также все'
    }
}, "dimasex.ini")
inicfg.save(ini, 'dimasex.ini')

local token = imgui.ImBuffer(tostring(ini.bot.token_tg), 256)
local chat_id = imgui.ImBuffer(tostring(ini.bot.chatid_tg), 256)

-- код

function getLastUpdate()
    async_http_request('https://api.telegram.org/bot'..token..'/getUpdates?chat_id='..chat_id..'&offset=-1','',function(result) -- тут ошибка (146 строка)
        if result then
            local proc_table = decodeJson(result)
            if proc_table.ok then
                if #proc_table.result > 0 then
                    local res_table = proc_table.result[1]
                    if res_table then
                        updateid = res_table.update_id
                    end
                else
                    updateid = 1
                end
            end
        end
        actop1 = not actcop1
    end)
end

-- код

function imgui.OnDrawFrame()
    -- код
            if imgui.InputText(u8"Token", token) then
                ini.bot.token_tg = token.v
                inicfg.save(ini, 'dimasex.ini')
            end
            if imgui.InputText(u8"User ID", chat_id) then
                ini.bot.chatid_tg = chat_id.v
                inicfg.save(ini, 'dimasex.ini')
            end
 
Последнее редактирование модератором:
  • Злость
Реакции: recxvery

хуега)

РП игрок
Модератор
2,568
2,269
сяб


Как исправить это проблему?
.lua:146: attempt to concatenate upvalue 'chat_id' (a userdata value)

чат ид сохраняю в ини, скрипт не видит
Lua:
-- код

local file = 'dimasex.ini'
local directIni = ('moonloader\\config\\dimasex.ini')
local ini = inicfg.load({
    config = {
        stats = '',
    },
    bot = {
        token_tg = 'токен сюда для теста ставил, также все',
        chatid_tg = 'чат ид сюда для теста ставил, также все'
    }
}, "dimasex.ini")
inicfg.save(ini, 'dimasex.ini')

local token = imgui.ImBuffer(tostring(ini.bot.token_tg), 256)
local chat_id = imgui.ImBuffer(tostring(ini.bot.chatid_tg), 256)

-- код

function getLastUpdate()
    async_http_request('https://api.telegram.org/bot'..token..'/getUpdates?chat_id='..chat_id..'&offset=-1','',function(result) -- тут ошибка (146 строка)
        if result then
            local proc_table = decodeJson(result)
            if proc_table.ok then
                if #proc_table.result > 0 then
                    local res_table = proc_table.result[1]
                    if res_table then
                        updateid = res_table.update_id
                    end
                else
                    updateid = 1
                end
            end
        end
        actop1 = not actcop1
    end)
end

-- код

function imgui.OnDrawFrame()
    -- код
            if imgui.InputText(u8"Token", token) then
                ini.bot.token_tg = token.v
                inicfg.save(ini, 'dimasex.ini')
            end
            if imgui.InputText(u8"User ID", chat_id) then
                ini.bot.chatid_tg = chat_id.v
                inicfg.save(ini, 'dimasex.ini')
            end
chat_id.v
 
  • Влюблен
Реакции: tyukapa

Require

Участник
54
1
Помогите пожалуйста почему этот скрипт не защищает от рванки?
Lua:
function removeSampPlayer(pid)
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt16(bs, pid)
    raknetEmulRpcReceiveBitStream(163, bs) -- 163: RPC_ScrWorldPlayerRemove
    raknetDeleteBitStream(bs)
end

function sampev.onPlayerSync(id, data)
    if checkboxone[0] then
        local x, y, z = getCharCoordinates(PLAYER_PED)
        if x - data.position.x > -1.5 and x - data.position.x < 1.5 then
            if (data.moveSpeed.x >= 1.5 or data.moveSpeed.x <= -1.5) or (data.moveSpeed.y >= 1.5 or data.moveSpeed.y <= -1.5) or (data.moveSpeed.z >= 0.5 or data.moveSpeed.z <= -0.5) then
                if not player_id[id] then
                    player_id[id] = true
                    target_id = id
                    removeSampPlayer(id)
                end
            end
        end
    end
end
 

recxvery

Участник
90
27
Помогите пожалуйста почему этот скрипт не защищает от рванки?
Lua:
function removeSampPlayer(pid)
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt16(bs, pid)
    raknetEmulRpcReceiveBitStream(163, bs) -- 163: RPC_ScrWorldPlayerRemove
    raknetDeleteBitStream(bs)
end

function sampev.onPlayerSync(id, data)
    if checkboxone[0] then
        local x, y, z = getCharCoordinates(PLAYER_PED)
        if x - data.position.x > -1.5 and x - data.position.x < 1.5 then
            if (data.moveSpeed.x >= 1.5 or data.moveSpeed.x <= -1.5) or (data.moveSpeed.y >= 1.5 or data.moveSpeed.y <= -1.5) or (data.moveSpeed.z >= 0.5 or data.moveSpeed.z <= -0.5) then
                if not player_id[id] then
                    player_id[id] = true
                    target_id = id
                    removeSampPlayer(id)
                end
            end
        end
    end
end
это фулл код что ли?