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

ARaG0RN

Активный
136
49
Можно ли отследить на lua в сампе зашел ли игрок в меню паузы, свернул ли игру? Именно PLAYER_PED, нужно проверять владельца скрипта на паузу.
 

pwned

Участник
142
5
Как вот такое перевести в imgui ?

kTCQggy.jpg


перевести в такую менюху

tisVNiH.jpg
 
Последнее редактирование:

malis

Участник
41
4
  • Дароу, вопрос есть, если что я только начал изучать ImGui ( минут 20 только )

  • есть короче у меня

    if imgui.Checkbox(u8"Время", butbool) then
    end

    как сделать чтобы при активации чекбокса ( когда поставил галочку ), выводилось окошко которе можно перемещать но нельзя закрывать с точным временем мск ( Допустим брать время с этого сайта: https://time100.ru/ ) с форматом: Час:Минуты:Секунды ( без даты )

  • а при деактивации чекбокса ( убирание галки ) пропадало окошко с временем

  • но если включен чекбокс ( типо окошко есть со временем ) можно было закрыть основное меню но не закрывать окошечко ( время )

  • Я не ебу как это объяснить по человечески (


    UPD: Скрин - https://imgur.com/a/NGRUlBH ( Взят с паблика, но надо примерно сделать также )
 

Psevdonim

Новичок
22
0
Почему не работает?

Lua:
require "lib.sampfuncs"
require "lib.moonloader"

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end

fontMoney = renderCreateFont('Arial', 15, 13)

while true do
    wait(0)

    local x, y = getScreenResolution()

  money = getPlayerMoney(PLAYER_HANDLE)
     renderFontDrawText(fontMoney, "{1bfc48}$ %d", 100, 100, -1)
end
end
 

Petr_Sergeevich

Известный
Проверенный
707
296
Другое дело) Конкретно в этом примере используется:
1. imgui_addons (кнопки переключения) https://blast.hk/threads/27544/#post-299048
2. imgui.BeginChild(...) (рамки, выделение областей)
3. Подсказка (знак вопроса)
Lua:
function imgui.TextQuestion(text)
    imgui.TextDisabled('(?)')|
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end
4. Separator (разделитель)
5. Text
6. Меню-бар (штуки сверху)

А как ты будешь пилить своё меню - дело творческое, вариантов много

Почему не работает?

Lua:
require "lib.sampfuncs"[/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B]require "lib.moonloader"[/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B][/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B]function main()[/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B]    if not isSampfuncsLoaded() or not isSampLoaded() then return end[/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B]    while not isSampAvailable() do wait(0) end[/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B][/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B]fontMoney = renderCreateFont('Arial', 15, 13)[/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B][/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B]while true do[/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B]    wait(0)[/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B][/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B]    local x, y = getScreenResolution()[/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B][/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B]  money = getPlayerMoney(PLAYER_HANDLE)[/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B]     renderFontDrawText(fontMoney, "{1bfc48}$ %d", 100, 100, -1)[/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B]end[/B][/COLOR][/COLOR][/B][/COLOR][/COLOR]
[COLOR=#000000][COLOR=rgb(0, 0, 0)][B][COLOR=#000000][COLOR=rgb(0, 0, 0)][B]end

Lua:
-- ...
while true do
    wait(0)
    local money = getPlayerMoney(PLAYER_HANDLE)
    renderFontDrawText(fontMoney, ("{1BFC48}$%s"):format(money), 100, 100, -1)
end

  • Дароу, вопрос есть, если что я только начал изучать ImGui ( минут 20 только )
  • есть короче у меня

    if imgui.Checkbox(u8"Время", butbool) then
    end

    как сделать чтобы при активации чекбокса ( когда поставил галочку ), выводилось окошко которе можно перемещать но нельзя закрывать с точным временем мск ( Допустим брать время с этого сайта: https://time100.ru/ ) с форматом: Час:Минуты:Секунды ( без даты )

  • а при деактивации чекбокса ( убирание галки ) пропадало окошко с временем

  • но если включен чекбокс ( типо окошко есть со временем ) можно было закрыть основное меню но не закрывать окошечко ( время )

  • Я не ебу как это объяснить по человечески (


    UPD: Скрин - https://imgur.com/a/NGRUlBH ( Взят с паблика, но надо примерно сделать также )
При активации чекбокса, включай дополнительное imgui окно с флагом NoTitleBar, чтобы его нельзя было закрыть.
Точное время по МСК можешь получить функцией:
Lua:
-- Сразу возвращает время в том формате, что ты попросил.
function getCurrentTime()
    return os.date('%H:%M:%S', os.time(os.date('!*t')) + 10800)
end
Третий пункт не совсем понял, тебе нужна анимация после снятия галочки? Зачем ему пропадать "с временем"?
Ну и, конечно, нужно будет изменить значение курсора, если он тебе не нужен, когда окно со временем активно, это можешь сделать в imgui.ShowCursor = ...
 

malis

Участник
41
4
Другое дело) Конкретно в этом примере используется:
1. imgui_addons (кнопки переключения) https://blast.hk/threads/27544/#post-299048
2. imgui.BeginChild(...) (рамки, выделение областей)
3. Подсказка (знак вопроса)
Lua:
function imgui.TextQuestion(text)
    imgui.TextDisabled('(?)')|
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end
4. Separator (разделитель)
5. Text
6. Меню-бар (штуки сверху)

А как ты будешь пилить своё меню - дело творческое, вариантов много



Lua:
-- ...
while true do
    wait(0)
    local money = getPlayerMoney(PLAYER_HANDLE)
    renderFontDrawText(fontMoney, ("{1BFC48}$%s"):format(money), 100, 100, -1)
end


При активации чекбокса, включай дополнительное imgui окно с флагом NoTitleBar, чтобы его нельзя было закрыть.
Точное время по МСК можешь получить функцией:
Lua:
-- Сразу возвращает время в том формате, что ты попросил.
function getCurrentTime()
    return os.date('%H:%M:%S', os.time(os.date('!*t')) + 10800)
end
Третий пункт не совсем понял, тебе нужна анимация после снятия галочки? Зачем ему пропадать "с временем"?
Ну и, конечно, нужно будет изменить значение курсора, если он тебе не нужен, когда окно со временем активно, это можешь сделать в imgui.ShowCursor = ...

Можно немного подробнее? А именно типо с примером , пожалуйста.
 

Greg Bomj

Новичок
14
1
1. Вроде бы вещь простая, но ответ найти никак не могу, как применить анимацию к PLAYER_PED? Здорово, если это будут видеть другие игроки, но подойдут и визуальные анимации. На CLEO всегда было море анимаций, а тут пример найти не получается.

2. Это как?
Dcj4Y.png

3. Видел недавно крайне необычный чит: кто-то спавнил на карте незарегистрированных ботов со скином CJ, у ботов был дефолтный цвет никнейма и они довольно быстро пропадали (на сервере ограничено время для регистрации). Он как-то переместился из "виртуального" мира в основной? Или как?

Заранее спасибо.
 
Последнее редактирование: