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

Pasquale Developer

Известный
109
8
Выдает ошибку, помогите исправить..
lua:
function main()
    while not sampIsLocalPlayerSpawned() do wait(10) end
            wait(10)
            sampAddChatMessage("{FF0000}[LUA] {FF8C00}Приветствую: " .. nick .. " [" .. id.. "]", 0xFFFF0000)
            wait(10)
            sampAddChatMessage("{FF0000}[LUA] {FF8C00}Автор скрипта: Timofey Pankratov", 0xFFFF0000)
     
      while true do  
        wait(2000)
        if getCharHealth (PLAYER_PED) <= 45 then
            lua_thread.create(function()
                sampSendChat('/healme')
                wait(2000) -- задержка чтобы не зафлудило и подождало, иначе аптечек не останется
            end) -- оно не успевает получить данные
        end
        if text:find('Не флудите') then
            lua_thread.create(function()
                wait(3000)
                sampSendChat('Кхм..')
            end)
        end
end
end


function main() - 31 строчка
if text:find('Не флудите') then - 46 cтрочка

[14:26:19.023278] (error) hardhelper: ...P] GameWorld - GTA San Andreas\moonloader\hardhelper.lua:46: attempt to index global 'text' (a nil value)
stack traceback:
...P] GameWorld - GTA San Andreas\moonloader\hardhelper.lua: in function <...P] GameWorld - GTA San Andreas\moonloader\hardhelper.lua:31>
[14:26:19.023278] (error) hardhelper: Script died due to an error. (2AAAAEFC)
 

Pasquale Developer

Известный
109
8
У тебя одни заморочки в коде, всегда можно сделать куда легче.

text:find используется лишь в хуке onServerMessage, так-же ты из неоткуда берешь аргументы nick, id.
Исправил но что-то не так пишет

Код:
encoding.default = 'CP1251'
u8 = encoding.UTF8
script_name("hardhelper")
script_authors("PANKRAT")
script_version("0.1")   

_, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
nick = sampGetPlayerNickname(id)
nick = nick:gsub("_", " ")

ip, port = sampGetCurrentServerAddress()
ip = ip..":"..port
if ip ~= "54.37.142.73:7777" then
    thisScript():unload()
end

function main()
    while not sampIsLocalPlayerSpawned() do wait(10) end
            wait(10)
            sampAddChatMessage("{FF0000}[LUA] {FF8C00}Приветствую: " .. nick .. " [" .. id.. "]", 0xFFFF0000)
            wait(10)
            sampAddChatMessage("{FF0000}[LUA] {FF8C00}Автор скрипта: Timofey Pankratov", 0xFFFF0000)
      
      while true do   
        wait(2000)
        if getCharHealth (PLAYER_PED) <= 45 then
            lua_thread.create(function()
                sampSendChat('/healme')
                wait(2000) -- задержка чтобы не зафлудило и подождало, иначе аптечек не останется
            end) -- оно не успевает получить данные
        end
end
end
 

Moorich

Потрачен
96
11
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ребят, как вернуть управление персонажем, допустим при вызове /phone на аризоне замораживается управление персонажем, как его вернуть?
 

TSIDEX

Известный
86
8
Подскажите функцию, чтобы определённая системная строка в чат не шла
И допустим я прописал не ту команду и побежали отыгровки, как их можно остановить?
 

KaLaSH

Известный
3
1
Тут в основе был флудер который каптил , хотелось бы передалть под ловлю . ( Вообще не шарю в Луа )
Вроде все нормально флудит , ловит - но когда идет флуд отключается чат ( любой вид его )
Хотелось бы как-то добавить в исключение при флуде что бы показывало фразу "Неоплаченное частное имущество выставлено на продажу"
Как это сделать ?)

Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    status = 0
    delay = 450
    sampRegisterChatCommand("bh", toggle)
    while true do
        wait(0)
        if not isPauseMenuActive() and isPlayerPlaying(playerHandle) then
            if status == 1 then  
                printStringNow("BuyHouse: ~g~working...", delay+100)          
                sampSendChat("/buyhouse")
                wait(delay)
            end
        end
    end
end

function ev.onServerMessage(color, text)
    if status == 1 then
        if text:find('Поздравляем с покупкой') then toggle() return end
        if color ~= -1 then return false end  
    end
end

function toggle()
    if status == 0 then
        status = 1
    else
        status = 0
        printStringNow("BuyHouse: ~r~OFF-white", 3000)
    end
end
 
Последнее редактирование:

1fs1

Участник
40
0
Вы купили 1 г травы за 100$ | У вас 10 г

Как записать в string.find?

Lua:
text:find("Вы купили (%d+) г травы за (%d+)$ | У вас (%d+) г")

этот пример не работает
 

Izvinisb

Известный
Проверенный
963
599
Вы купили 1 г травы за 100$ | У вас 10 г

Как записать в string.find?

Lua:
text:find("Вы купили (%d+) г травы за (%d+)$ | У вас (%d+) г")

этот пример не работает
Если не работает - значит дело в руках. Возьми и поищи как записывать через string.find, этот вопрос задавался тут сотни раз.
Lua:
text:find("Вы купили (%d+) г травы за (%d+)%$ | У вас (%d+) г")
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,132
получай ник после загрузки сампа или же в самой отыгровке
sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(1))):gsub('_', ' ')
Я его так и получал.
Lua:
function main ()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
    mynick = sampGetPlayerNickname(myid)
Может он не успевает из-за маленькой задержки?
 

1fs1

Участник
40
0
Проблема решена. Ответ: нужно было мне сравнивать цвет тоже. Из-за этого не работало.
 
Последнее редактирование: