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

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,132
Да ну.. крч смотри.
При нажатии кнопки J идет act =true
если act = true и в чате есть сообщение "говорит" тогда
sampAddChatMessage("dsfsdfdsfds",-1)
act = false
но не так как ты кинул(
Так бля я кидал такой код...
Lua:
-- В начало скрипта
local sampev = require 'lib.samp.events'
act = false -- Не активен.

-- В беск. цикл
    if wasKeyPressed(VK_J) then -- Если нажата буква J, тогда
    act = true
    end

-- Вне main
function sampev.onServerMessage(color, text)
    if text:find("говорит ") and act then -- Если в чате есть слово "говорит" и act равен true, тогда
        sampAddChatMessage("dsfsdfdsfds",-1) -- В чат пишется "dsfsdfdsfds"
    end
end
 

Сырник

Известный
222
77
Так бля я кидал такой код...
Lua:
-- В начало скрипта
local sampev = require 'lib.samp.events'
act = false -- Не активен.

-- В беск. цикл
    if wasKeyPressed(VK_J) then -- Если нажата буква J, тогда
    act = true
    end

-- Вне main
function sampev.onServerMessage(color, text)
    if text:find("говорит ") and act then -- Если в чате есть слово "говорит" и act равен true, тогда
        sampAddChatMessage("dsfsdfdsfds",-1) -- В чат пишется "dsfsdfdsfds"
    end
end
так он не работает(
 

mld

Участник
99
11
Как открыть диалог (ид диалога есть)и схукать слово "some text" ?
 

BARRY BRADLEY

Известный
711
176
Возможно ли как то проверить надет ли шлем? Проверять через модель трудно, так как много шлемов которые защищают.
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,132
как узнать что за звук проигрывается(серверный звук) и блокировать его?
p.s: звуки типа когда когда тебе админ пишет (на арп) или телефон звонит
 

.Makarov.

Известный
188
36
Здравствуйте. Вот на Азазонке есть отдел коммерции в телефоне. И мне нужно чтоб при открытии диалога с списком слетевших домов, все номера домов писались в чат.
Я тут накидал "быдло-код", который естественно не работает (Знаю что и не сработало бы, только не кидайтесь тапками). Помогите плез чтоб пахало. Заранее спасибо =)

Lua:
function samp.onShowDialog(dialogId,style,title,button1,button2,text)
    if dialogId == 0 and style == 0 and string.find(text,"ID: *{.+}%d+%{.+}") then
        for _, v in pairs(math.modf(tonumber(text:match("ID: *{.+}(%d+)%{.+}")))) do
            sampAddChatMessage('Слетел дом под номером: '..v, -1)
        end
        return false
    end
end
Еще актуально. Help me please
 

.Makarov.

Известный
188
36
скинь скрин диалога и текст из него
Вот скрин диалога
Вот инфа диалога:

Код:
button1 = Принять
title = {BFBBBA}
dialogId = 0
style = 0
button2 =
text = {FFFFFF}
1. Дом        Слетит через: {C9B931}13{FFFFFF} Payday.
2. Дом        Слетит через: {C9B931}4{FFFFFF} Payday.
3. Дом        Слетит через: {C9B931}12{FFFFFF} Payday.
4. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
5. Дом        Слетит через: {C9B931}3{FFFFFF} Payday.
6. Дом        Слетит через: {C9B931}2{FFFFFF} Payday.
7. Дом        Слетит через: {C9B931}5{FFFFFF} Payday.
8. Дом        Слетит через: {C9B931}8{FFFFFF} Payday.
9. Дом        Слетит через: {C9B931}9{FFFFFF} Payday.
10. Дом        Слетит через: {C9B931}9{FFFFFF} Payday.
11. Дом        Слетит через: {C9B931}13{FFFFFF} Payday.
12. Дом        Слетит через: {C9B931}11{FFFFFF} Payday.
13. Дом        Слетит через: {C9B931}5{FFFFFF} Payday.
14. Дом        Слетит через: {C9B931}7{FFFFFF} Payday.
15. Дом        Слетит через: {C9B931}15{FFFFFF} Payday.
16. Дом        Слетит через: {C9B931}13{FFFFFF} Payday.
17. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
18. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
19. Дом        Слетит через: {C9B931}7{FFFFFF} Payday.
20. Дом        Слетит через: {C9B931}7{FFFFFF} Payday.
21. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
22. Дом        Слетит через: {C9B931}5{FFFFFF} Payday.
23. Дом        Слетит через: {C9B931}4{FFFFFF} Payday.
24. Дом        Слетит через: {C9B931}7{FFFFFF} Payday.
25. Дом        Слетит через: {C9B931}12{FFFFFF} Payday.
26. Дом        Слетит через: {C9B931}14{FFFFFF} Payday.
27. Дом        Слетит через: {C9B931}10{FFFFFF} Payday.
28. Дом        Слетит через: {C9B931}5{FFFFFF} Payday.
29. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
30. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
31. Дом        Слетит через: {C9B931}8{FFFFFF} Payday.
32. Дом        Слетит через: {C9B931}5{FFFFFF} Payday.
33. Дом        Слетит через: {C9B931}13{FFFFFF} Payday.
34. Дом        Слетит через: {C9B931}4{FFFFFF} Payday.
35. Дом        Слетит через: {C9B931}13{FFFFFF} Payday.
36. Дом        ID: {C9B931}1001{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
37. Дом        ID: {C9B931}1002{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
38. Дом        ID: {C9B931}1003{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
39. Дом        ID: {C9B931}1004{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
40. Дом        ID: {C9B931}1005{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
41. Дом        ID: {C9B931}1006{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
42. Дом        ID: {C9B931}1007{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
43. Дом        ID: {C9B931}1008{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
44. Дом        ID: {C9B931}1009{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
45. Дом        ID: {C9B931}1011{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
46. Дом        ID: {C9B931}1014{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
Эта информация может быть {1EA3CC}ошибочной.{FFFFFF}

Используйте {1EA3CC}/findihouse ID{FFFFFF}, чтобы найти нужный вам дом. Стоимость {1EA3CC}1500$.{FFFFFF}
{FF5B14}ID{FFFFFF} дома отображается только у {FF5B14}слетевших{FFFFFF} домов!
 

Tox777z

Известный
21
2
Можно как-то открыть окно чата(куда вводишь команду или текст) и чтобы система сама ввела данные, но ты еще указал данные. Например: система откроет окно и введет: "/tazer ", а я игрок дополнит "/tazer 123". 123- id игрока например. на LUA, какая функция?
 

Quasper

Известный
835
354
Вот скрин диалога
Вот инфа диалога:

Код:
button1 = Принять
title = {BFBBBA}
dialogId = 0
style = 0
button2 =
text = {FFFFFF}
1. Дом        Слетит через: {C9B931}13{FFFFFF} Payday.
2. Дом        Слетит через: {C9B931}4{FFFFFF} Payday.
3. Дом        Слетит через: {C9B931}12{FFFFFF} Payday.
4. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
5. Дом        Слетит через: {C9B931}3{FFFFFF} Payday.
6. Дом        Слетит через: {C9B931}2{FFFFFF} Payday.
7. Дом        Слетит через: {C9B931}5{FFFFFF} Payday.
8. Дом        Слетит через: {C9B931}8{FFFFFF} Payday.
9. Дом        Слетит через: {C9B931}9{FFFFFF} Payday.
10. Дом        Слетит через: {C9B931}9{FFFFFF} Payday.
11. Дом        Слетит через: {C9B931}13{FFFFFF} Payday.
12. Дом        Слетит через: {C9B931}11{FFFFFF} Payday.
13. Дом        Слетит через: {C9B931}5{FFFFFF} Payday.
14. Дом        Слетит через: {C9B931}7{FFFFFF} Payday.
15. Дом        Слетит через: {C9B931}15{FFFFFF} Payday.
16. Дом        Слетит через: {C9B931}13{FFFFFF} Payday.
17. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
18. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
19. Дом        Слетит через: {C9B931}7{FFFFFF} Payday.
20. Дом        Слетит через: {C9B931}7{FFFFFF} Payday.
21. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
22. Дом        Слетит через: {C9B931}5{FFFFFF} Payday.
23. Дом        Слетит через: {C9B931}4{FFFFFF} Payday.
24. Дом        Слетит через: {C9B931}7{FFFFFF} Payday.
25. Дом        Слетит через: {C9B931}12{FFFFFF} Payday.
26. Дом        Слетит через: {C9B931}14{FFFFFF} Payday.
27. Дом        Слетит через: {C9B931}10{FFFFFF} Payday.
28. Дом        Слетит через: {C9B931}5{FFFFFF} Payday.
29. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
30. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
31. Дом        Слетит через: {C9B931}8{FFFFFF} Payday.
32. Дом        Слетит через: {C9B931}5{FFFFFF} Payday.
33. Дом        Слетит через: {C9B931}13{FFFFFF} Payday.
34. Дом        Слетит через: {C9B931}4{FFFFFF} Payday.
35. Дом        Слетит через: {C9B931}13{FFFFFF} Payday.
36. Дом        ID: {C9B931}1001{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
37. Дом        ID: {C9B931}1002{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
38. Дом        ID: {C9B931}1003{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
39. Дом        ID: {C9B931}1004{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
40. Дом        ID: {C9B931}1005{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
41. Дом        ID: {C9B931}1006{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
42. Дом        ID: {C9B931}1007{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
43. Дом        ID: {C9B931}1008{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
44. Дом        ID: {C9B931}1009{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
45. Дом        ID: {C9B931}1011{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
46. Дом        ID: {C9B931}1014{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
Эта информация может быть {1EA3CC}ошибочной.{FFFFFF}

Используйте {1EA3CC}/findihouse ID{FFFFFF}, чтобы найти нужный вам дом. Стоимость {1EA3CC}1500$.{FFFFFF}
{FF5B14}ID{FFFFFF} дома отображается только у {FF5B14}слетевших{FFFFFF} домов!
Lua:
for item in string.gmatch(text, "[^\r\n]+") do
  houseId = item:match("{.+}(%d+){.+}%s+%[{.+}Слетел{.+}%]")
  if houseId then
    sampAddChatMessage("Слетел дом ID: " .. houseId, -1)
  end
end
вот этот цикл заюзаешь после проверок диалога
Можно как-то открыть окно чата(куда вводишь команду или текст) и чтобы система сама ввела данные, но ты еще указал данные. Например: система откроет окно и введет: "/tazer ", а я игрок дополнит "/tazer 123". 123- id игрока например. на LUA, какая функция?
Lua:
sampSetChatInputText("/tazer ")
sampSetChatInputEnabled(true)
 
Последнее редактирование:
  • Нравится
Реакции: .Makarov.

Adler

Участник
38
14
Как округлить скорость транспорта в getCarSpeed до целых чисел?
 

Adler

Участник
38
14
math.floor(значение) - огругление вниз
math.ceil(значение) - огругление вверх
Можно пример куда вставлять math.floor? Просто до этого не работал с округлением.
Желательно показать для моего применения.
Сама функция скорости:
local car = storeCarCharIsInNoSave(PLAYER_PED)
local speed = getCarSpeed(car)
Lua:
renderFontDrawText(my_font, 'Скорость: '..speed..'', x2, y2, 0xFFFFFFFF)
 

BARRY BRADLEY

Известный
711
176
Как получить % этих полосок (голод, сытость, гигиена):

41551


Пробовал разобрать https://blast.hk/threads/24764/ но не понял смысл кода. Заранее спасибо
 

Vespan

Чешский луашер
Проверенный
2,120
1,720
Как сделать рандом
Что когда я написал в коде от 1 до 3,и когда нажал на кнопку/ввёл команду,выбралась цыфра от 1-3(одна цыфра,ну тип рандома)