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

deleted-user-139653

Гость
не могу понять, как работает sampCloseCurrentDialogWithButton(btn_id)? При запуске игры - не закрывается окно автоматом, а при перезапуске скрипта - вообще крашит.
пытался закрывать окно через return false, но тогда почему то перестают реагировать текстдравы до момента открытия любого диалога
пытаюсь закрывать /stats, если это важно
Возможно ставишь return false не в том месте
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
не могу понять, как работает sampCloseCurrentDialogWithButton(btn_id)? При запуске игры - не закрывается окно автоматом, а при перезапуске скрипта - вообще крашит.
пытался закрывать окно через return false, но тогда почему то перестают реагировать текстдравы до момента открытия любого диалога
пытаюсь закрывать /stats, если это важно
Попробуй через sampSendDialogResponse закрыть и потом return false. На всякий, добавь задержку в потоке перед этим хотя бы 10 миллисекунд.
 
  • Нравится
Реакции: Revavi

tyukapa

Активный
300
70
Почему не работает changeBlipColour? когда использую его маркеры просто не ставятся (или че с ними я хз)

Lua:
kladcoords[i] = addBlipForCoord(cx, cy, cz)
changeBlipColour(kladcoords[i], 0xFFFFFFFF)

1685543758658.png


Как сделать так чтобы скрипт заставил персонажа бежать на метку?
 

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,778
2,598

YarikVL

Известный
Проверенный
4,767
1,820
Как сделать так чтобы скрипт заставил персонажа бежать на метку?
Ищешь метку:
Бежишь туда: https://www.blast.hk/threads/37428/#post-366765
 
  • Нравится
Реакции: whyega52 и tyukapa

chromiusj

прогресс невозможен без пива
Модератор
5,553
3,867
как получить смещение от координат на функции getCharCoordinates()?
возможно долбаебский вопрос,допустим если X отклонилась на 1 координату,то вызвался бы там синий экран смерти,или просто написало,что отклонилось на 1 координату
актуально кстати
также может быть можно это как то реализовать с помощью этого и получения координат выше?
неактуально смог разобраться с ischarstopped,хотя мне ега еще рассказал про хук анимок ну я подумаю кароче
 
Последнее редактирование:

Макс | Lycorn

Участник
166
13
Подскажите, как делается биндер? Мне нужно, что-бы текст который написали в InputTextMultiline отправлялся в чат по кмд/кнопке которую указали, и с задержкой так же.
Lua:
local bindersettings = {
    commands = {
        bindercmd1 = imgui.ImBuffer(256)
    },
    hotkeys = {
        binderhotkey1 = imgui.ImBuffer(256)
    },
    delay = {
        binderdelay1 = imgui.ImInt(1000)
    },
    text = {
        bindertext1 = imgui.ImBuffer(256)
    }
}
               


imgui.BeginChild('##bindertext', imgui.ImVec2(620, 387), true)
            imgui.Text(u8'Введите команду:')
            imgui.SameLine()
            imgui.PushItemWidth(150)
            imgui.InputText(u8'##bindercmd', bindersettings.commands.bindercmd1)
            imgui.PopItemWidth()
            imgui.Text(u8'Введите кнопку:')
            imgui.SameLine()
            imgui.PushItemWidth(150)
            imgui.InputText(u8'##binderhotkey', bindersettings.hotkeys.binderhotkey1)
            imgui.PopItemWidth()
            imgui.Text(u8'Введите задержку в секундах')
            imgui.SameLine()
            imgui.PushItemWidth(150)
            imgui.InputInt(u8'##binderdelay', bindersettings.delay.binderdelay1)
            imgui.PopItemWidth()
            imgui.BeginChild('##textbinder', imgui.ImVec2(605,30), true)
            imgui.CenterText(u8'Введите текст')
            imgui.EndChild()
            imgui.InputTextMultiline(u8"##", bindersettings.text.bindertext1, imgui.ImVec2(605,265))
            imgui.EndChild()
 

tyukapa

Активный
300
70
Ищешь метку:
Бежишь туда: https://www.blast.hk/threads/37428/#post-366765
Я бы не парился с меткой, но мне не подходит этот вариант (https://www.blast.hk/threads/37428/#post-366765)

че ты высрал, долбаеб
https://wiki.blast.hk/ru/moonloader/lua/changeBlipColour
 
Последнее редактирование:
  • Эм
Реакции: YarikVL

YarikVL

Известный
Проверенный
4,767
1,820
Я бы не парился с меткой, но мне не подходит этот вариант (https://www.blast.hk/threads/37428/#post-366765)
Чаво? Чем тебе не подходит бег на координаты?
Ты даже не указал какой у тебя чекпоинт, если гоночный то вот я делал тему ( хоть я и спрашивал про поднятие чекпоинта скриптом, но мне скинули туда получение координат )

Получишь координаты чекпоинта - будешь вызывать функцию бега и передавать в неё координаты метки.
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
Подскажите, как делается биндер? Мне нужно, что-бы текст который написали в InputTextMultiline отправлялся в чат по кмд/кнопке которую указали, и с задержкой так же.
Так же, как и обычный биндер.
Lua:
-- while true do
if isKeyJustPressed(_G['VK_'..bindersettings.hotkeys.binderhotkey1]) then
    for line in string.gmatch(bindersettings.text.bindertext1.v, "[^\r\n]+") do
        sampAddChatMessage(u8:decode(line), -1)
        wait(tonumber(bindersettings.delay.binderdelay.v))
    end
end
Для команд то же самое.
Lua:
local sampev = require "lib.samp.events"

function sampev.onSendCommand(command)
    if command == bindersettings.commands.bindercmd1.v then
        for line in string.gmatch(bindersettings.text.bindertext1.v, "[^\r\n]+") do
            lua_thread.create(function()
                sampAddChatMessage(u8:decode(line), -1)
                wait(tonumber(bindersettings.delay.binderdelay.v))
            end)
        end
        return false
    end
end
Но я бы посоветовал не делать эти binder1, binder2, а сделать через цикл for.
Можешь реализацию взять из этого скрипта, тут это есть.
 
  • Нравится
Реакции: whyega52

Julimba

Участник
108
10
qq, пытаюсь сделать автоматическую создания кфг, если его нету, при запуске сразу крашит, в чем моя ошибка?
Lua:
local directIni = getWorkingDirectory() .. '\\MHelper.ini' -- Вверху, рядом с подгрузкой всех библиотек и т.п
local status = inicfg.load(mainIni, 'MHelper.ini')

local mainIni = inicfg.load({
    config = {
    target = 'false',
    GOS = '1500',
    distans = 'false',
    OPG = '2000',
    GHETTO = '2500',
    PLAYERS = '500',
    },
}, directIni) -- где то чуть ниже

if not doesFileExist('moonloader/MHelper.ini') then inicfg.save(mainIni, 'MHelper.ini') end -- в мейне
Крашит игру сразу при запуске игры
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
qq, пытаюсь сделать автоматическую создания кфг, если его нету, при запуске сразу крашит, в чем моя ошибка?
Lua:
local directIni = getWorkingDirectory() .. '\\MHelper.ini' -- Вверху, рядом с подгрузкой всех библиотек и т.п
local status = inicfg.load(mainIni, 'MHelper.ini')

local mainIni = inicfg.load({
    config = {
    target = 'false',
    GOS = '1500',
    distans = 'false',
    OPG = '2000',
    GHETTO = '2500',
    PLAYERS = '500',
    },
}, directIni) -- где то чуть ниже

if not doesFileExist('moonloader/MHelper.ini') then inicfg.save(mainIni, 'MHelper.ini') end -- в мейне
Крашит игру сразу при запуске игры
Наверное потому, что ты во 2-й строке пытаешься получить mainIni с 4-й строки, который ещё не успел появиться.)
Попробуй убери вторую строку, который с
local status начинается.
 
  • Нравится
Реакции: whyega52

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
ничего не поменялось
Уверен, что крашит именно из-за этого?
Замени весь код, что ты скинул - на этот и посмотри. Если ничего не изменится, то, скорее всего, проблема в другом. И посмотри что в логе.
Lua:
local mainIni = inicfg.load({
    config = {
        target = 'false',
        GOS = '1500',
        distans = 'false',
        OPG = '2000',
        GHETTO = '2500',
        PLAYERS = '500',
    }
}, "moonloader/MHelper.ini")

if not doesFileExist('moonloader/MHelper.ini') then
    inicfg.save(mainIni, 'MHelper.ini')
end