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

Sanchez.

Известный
704
187
Ты можешь выводить только старый статус, который ранее был записан.
А потом, я так думаю, в чате явно есть оповещение о смене статуса, можно хукать оттуда.
Чтобы выводить раз в 5 секунд:
Lua:
local lastSend = os.clock()

while true do
    wait(0)
    if os.clock() - lastSend > 5 then
        sampAddChatMessage(status, -1)
        lastSend = os.clock()
    end
end

код не проверял, должно работать
Хорошо, спасибо. Просто мне нужно, чтобы статус автоматически отправлялся в чат, не открывая /stats. Типо где-то нужно написать чтобы типо бесконечно писался /stats с return false. Вот это я хочу реализовать
 

Curtis

Участник
282
10
Помогите сделать простой таймер с текстом, который будет работать даже при афк
 

fantavise

Потрачен
126
98
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Pashyka

Участник
220
17
Хорошо, спасибо. Просто мне нужно, чтобы статус автоматически отправлялся в чат, не открывая /stats. Типо где-то нужно написать чтобы типо бесконечно писался /stats с return false. Вот это я хочу реализовать

Добавь в код, который тебе скинули sampSendChat("/stats")

А далее в хуке диалога после получения переменной пропиши return false
 

Beer Stone

Участник
32
3
Как сделать так, чтобы при написании определённой команды, открывалось окно SAMPFUNCS, и туда вводился текст?
Буду благодарен за помощь.
 

meowprd

Тот самый Котовский
Проверенный
1,280
712
Как сделать так, чтобы при написании определённой команды, открывалось окно SAMPFUNCS, и туда вводился текст?
Буду благодарен за помощь.
смотря какой текст
ты можешь вывести в лог (sampfuncsLog("text"))
ты можешь запустить команду (runSampfuncsConsoleCommand(zstring cmd))
а чтобы открыть консольку надо нажимать виртуальные клавиши (setVirtualKeyDown(idKey, true) wait(25) setVirtualKeyDown(idKey, false))
мне помощь нужна сам сделаю
Помощь - это когда ТЕБЕ помогают написать код, а не когда код пишут ЗА ТЕБЯ.
Понимаешь?
Берешь и изучаешь сам.
 
  • Нравится
Реакции: Pashyka

Dashok.

Участник
228
9
Хочу сделать так, если файл есть в папке, то писалось установлено, если нет то не установлено, но не работает

Lua:
f = io.open(getGameDirectory().."//moonloader//Event.lua","r+")
        if f == nil then
        imgui.TextColoredRGB(u8"{F70303}Не установлен")
        else
        imgui.TextColoredRGB(u8"{38DD19}Установлено")
        
        end
 

Beer Stone

Участник
32
3
Хочу сделать так, если файл есть в папке, то писалось установлено, если нет то не установлено, но не работает

Lua:
f = io.open(getGameDirectory().."//moonloader//Event.lua","r+")
        if f == nil then
        imgui.TextColoredRGB(u8"{F70303}Не установлен")
        else
        imgui.TextColoredRGB(u8"{38DD19}Установлено")
       
        end
Так а не проще просто взять, и добавить первоначальные сообщения в чат по которым можно чётко понять Установлен, или не установлен.
sampSendChat('Скрипт бла бла установлен')
 

Pashyka

Участник
220
17
Так а не проще просто взять, и добавить первоначальные сообщения в чат по которым можно чётко понять Установлен, или не установлен.
sampSendChat('Скрипт бла бла установлен')

sampAddChatMessage("Библиотека/скрипт установлен", - 1)
Ты вывел сообщение от игрока уже в чат, а что выше я написал видно для самого владельца скрипта.
 

Dashok.

Участник
228
9
Так а не проще просто взять, и добавить первоначальные сообщения в чат по которым можно чётко понять Установлен, или не установлен.
sampSendChat('Скрипт бла бла установлен')
Ты не понял, это путь вообще к другому файлу
 

bottom_text

Известный
675
318
Хочу сделать так, если файл есть в папке, то писалось установлено, если нет то не установлено, но не работает

Lua:
f = io.open(getGameDirectory().."//moonloader//Event.lua","r+")
        if f == nil then
        imgui.TextColoredRGB(u8"{F70303}Не установлен")
        else
        imgui.TextColoredRGB(u8"{38DD19}Установлено")
       
        end
https://wiki.blast.hk/moonloader/lua/doesFileExist используй
попробуй это
Lua:
   imgui.TextColoredRGB(doesFileExist(getGameDirectory().."//moonloader//Event.lua") and u8"{F70303}установлен" or u8"{F70303}Не установлен")
 

Dashok.

Участник
228
9
Как сделать удаление папки через os.remove


Lua:
    local path_derect = getWorkingDirectory() .."/config/Events"
    os.remove(path_derect)
    sampAddChatMessage(tag .. "Удаляю папку Event")
 

Gorskin

I shit on you
Проверенный
1,247
1,043
Как сделать удаление папки через os.remove


Lua:
    local path_derect = getWorkingDirectory() .."/config/Events"
    os.remove(path_derect)
    sampAddChatMessage(tag .. "Удаляю папку Event")
У меня так работает, сделай так же:
filedel = getGameDirectory().."//moonloader//AntiRvankaLOG.txt"
                    os.remove(filedel)