Вопросы по 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

Потрачен
251
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

Потрачен
251
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,998
1,340
Нахуй ты его в 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
Всефорумный модератор
912
1,803
Емае, не в этом дело. Пофиг на ненужную фигню. У меня курсор появляется при запуске
Пофиг, а код курит в сторонке и задыхается. То что я кидал, там с курсором все нормально. Меньше переменных, проще читается код и его меньше практически в 2 раза. И в твоем случае, можно сделать функцию, где у тебя отправляется сообщение после нажатий на кнопку, чтоб не писать постоянно это все.
 
  • Нравится
Реакции: James Saula

kriv

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

frit

Известный
388
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
221
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
 

#Kai-

Известный
698
292
Нужна функция проверки нахождения игрока в определенных координатах по радиусу.
 

Myroslaw

Известный
133
5
Lua:
local event = require 'lib.samp.events'

function main()
    lua_thread.create(xui)
    while true do
        wait(0)
    
    end
end

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

bottom_text

Известный
676
325
Lua:
local event = require 'lib.samp.events'

function main()
    lua_thread.create(xui)
    while true do
        wait(0)
   
    end
end

function xui()
    function event.onServerMessage(color, text)
            if text:find("Доставьте хворост на ферму.") then
                wait(7000)
            sampAddChatMessage("Кд прошло, можешь доставлять", -1)
        end
    end
end
как вот ето можно одушевить(сделать что б роботало)?
Lua:
local event = require 'lib.samp.events'

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

Myroslaw

Известный
133
5
Lua:
local event = require 'lib.samp.events'

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