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

Nelit

Потрачен
252
39
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
У тебя она локальная, она используется в данном случае, только в той функции. Делай глобальной, либо ранее ее объявляй.
пробовал объявлять ранее в начале кода. Всё равно не работает
 

PanSeek

t.me/dailypanseek
Всефорумный модератор
908
1,776
пробовал объявлять ранее в начале кода. Всё равно не работает
Lua:
script_name('Test')
script_author('Nelit')

require 'lib.moonloader'
local sampev = require 'lib.samp.events'

local perem = 0

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('test', function() sampAddChatMessage(perem, -1) end)
    wait(-1)
end

function sampev.onServerMessage(color, text)
    if text:find('%[Информация%] %{FFFFFF%}Вы сняли со своего банковского счета (%d+)%$') then
        perem = text:match('%[Информация%] %{FFFFFF%}Вы сняли со своего банковского счета (%d+)%$')
    end
end
Так?
 
  • Нравится
Реакции: James Saula

Vintik

Через тернии к звёздам
Проверенный
1,556
1,027
пишет nill...
Код:
Lua:
script_name('Test')
script_author('Nelit')

require 'lib.moonloader'
local sampev = require 'lib.samp.events'

function main()
    repeat wait(0) until isSampAvailable()

    sampRegisterChatCommand('test', sendSum)

    while true do
        wait(0)

    end
end

function sampev.onServerMessage(color, text)
    local perem = string.match(text, '[Информация] Вы сняли со своего банковского счета (%d+$)') -- [[ or text:match('Вы заработали (%d+$)') ]]
end

function sendSum()
    sampAddChatMessage(tostring(perem), -1)
end
Посмотреть вложение 92442
Lua:
local _, perem = string.match(text, '[Информация] Вы сняли со своего банковского счета (%d+$)') -- [[ or text:match('Вы заработали (%d+$)') ]]
Возможно.
 

ROBERT PUSHER

Известный
305
213
пробовал объявлять ранее в начале кода. Всё равно не работает
Не работает потому-что нужно парсить вместе с цветом текста, в твоём случае он в начале. Выводи всю строку не в print, а в другое что-нибудь, например

Код:
function sampev.onServerMessage(color, text)
    if text:find('Вы сняли со своего банковского счета') then
        setClipboardText(text) -- текст скопируется в буфер обмена (ОБЯЗ. Включить русскую раскладку)
    end
end
 

Nelit

Потрачен
252
39
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
script_name('Test')
script_author('Nelit')

require 'lib.moonloader'
local sampev = require 'lib.samp.events'

local perem = 0

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('test', function() sampAddChatMessage(perem, -1) end)
    wait(-1)
end

function sampev.onServerMessage(color, text)
    if text:find('%[Информация%] %{FFFFFF%}Вы сняли со своего банковского счета (%d+)%$') then
        perem = text:match('%[Информация%] %{FFFFFF%}Вы сняли со своего банковского счета (%d+)%$')
    end
end
Так?
Да. Прям так
 

KIBERSTALKER

Участник
30
2
Я же тебе кидал нормальный код. Что за куча ненужных переменных вместо одной и где можно использовать цикл вместо быдлокода. Зря видимо переписывал скрипт, никому это не надо.
Емае, не в этом дело. Пофиг на ненужную фигню. У меня курсор появляется при запуске
 

Myroslaw

Известный
133
5
[ML] (error) lua.lua: D:\kichiro11KlowPC\moonloader\lua.lua:4: bad argument #1 to 'find' (string expected, got nil)
stack traceback:
[C]: in function 'find'
D:\kichiro11KlowPC\moonloader\lua.lua:4: in function <D:\kichiro11KlowPC\moonloader\lua.lua:1>
[ML] (error) lua.lua: Script died due to an error. (1E5F8A8C)
Lua:
function main()
    while true do
        wait(0)
    if string.find(str, 'Доставьте хворост на ферму.', 1, true) then
        wait(7000)
        sampAddChatMessage('Кд прошло, можешь доставлять')
    end
    end
end
что не так?
 

Nelit

Потрачен
252
39
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
[ML] (error) lua.lua: D:\kichiro11KlowPC\moonloader\lua.lua:4: bad argument #1 to 'find' (string expected, got nil)
stack traceback:
[C]: in function 'find'
D:\kichiro11KlowPC\moonloader\lua.lua:4: in function <D:\kichiro11KlowPC\moonloader\lua.lua:1>
[ML] (error) lua.lua: Script died due to an error. (1E5F8A8C)
Lua:
function main()
    while true do
        wait(0)
    if string.find(str, 'Доставьте хворост на ферму.', 1, true) then
        wait(7000)
        sampAddChatMessage('Кд прошло, можешь доставлять')
    end
    end
end
что не так?
Нахуй ты его в main впихнул???

Lua:
local sampev = require 'lib.samp.events'

function main()
    -- code main
 
    while true do
        wait(0)
     
    end
end

function sampev.onServerMessage(color, text)
    if string.find(text, 'Доставьте хворост на ферму.', 1, true) then
        lua_thread.create(function()
            wait(7000)
        end)
        sampAddChatMessage('Кд прошло, можешь доставлять')
    end
end
 
Последнее редактирование:

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,920
1,292
Нахуй ты его в main впихнул???

Lua:
local sampev = require 'lib.samp.events'

function main()
    -- code main
 
    while true do
        wait(0)
     
    end
end

function sampev.onServerMessage(color, text)
    if string.find(text, 'Доставьте хворост на ферму.', 1, true) then
        wait(7000)
        sampAddChatMessage('Кд прошло, можешь доставлять')
    end
end
wait вне потока/main, охуенный код
 

PanSeek

t.me/dailypanseek
Всефорумный модератор
908
1,776
Емае, не в этом дело. Пофиг на ненужную фигню. У меня курсор появляется при запуске
Пофиг, а код курит в сторонке и задыхается. То что я кидал, там с курсором все нормально. Меньше переменных, проще читается код и его меньше практически в 2 раза. И в твоем случае, можно сделать функцию, где у тебя отправляется сообщение после нажатий на кнопку, чтоб не писать постоянно это все.
 
  • Нравится
Реакции: James Saula

kriv

Участник
37
3
Покажите нормальный способ использования copas и либы для https запросов. Делаю по инструкции в теме от FYP, но выдает ошибку:
SSLv3 alert handshake failure
 

frit

Известный
389
174
[ML] (error) lua.lua: D:\kichiro11KlowPC\moonloader\lua.lua:4: bad argument #1 to 'find' (string expected, got nil)
stack traceback:
[C]: in function 'find'
D:\kichiro11KlowPC\moonloader\lua.lua:4: in function <D:\kichiro11KlowPC\moonloader\lua.lua:1>
[ML] (error) lua.lua: Script died due to an error. (1E5F8A8C)
Lua:
function main()
    while true do
        wait(0)
    if string.find(str, 'Доставьте хворост на ферму.', 1, true) then
        wait(7000)
        sampAddChatMessage('Кд прошло, можешь доставлять')
    end
    end
end
что не так?
Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
    lua_thread.create(function()
        if text:find("Доставьте хворост на ферму.") then
            wait(7000)
            sampAddChatMessage("Кд прошло, можешь доставлять", -1)
        end
    end)
end
 
  • Нравится
Реакции: Myroslaw

ROBERT PUSHER

Известный
305
213
Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
    lua_thread.create(function()
        if text:find("Доставьте хворост на ферму.") then
            wait(7000)
            sampAddChatMessage("Кд прошло, можешь доставлять", -1)
        end
    end)
end
поток будет создаваться каждый раз с хуком без условия.

Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
    if text:find("Доставьте хворост на ферму.") then
        lua_thread.create(function()
            wait(7000)
            sampAddChatMessage("Кд прошло, можешь доставлять", -1)
        end)
    end
end