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

M O R R E T I

Известный
22
24
Возможно ли средствами Moonloader / стандарт. Lua или с добавлением библиотеки какой либо, сделать функцию, которая будет делать скриншот окна с GTASA и сохранять это изображение куда либо?

сразу говорю, не SAMP.

Также, как известно, если долгое время ничего не делать( не нажимать клавиши, не крутить камерой и тд ), то игра перейдет в некий режим ожидания, камера начнет трястись и рассматривать "интересные вещи"... Вопрос в том, возможно ли отключить вызов этого режима через работу с memory и тд?
 

BlackHole

Участник
40
7
Почему отправляет только первое сообщение, а остальные не отправляет?


Lua:
function cmd_kj(arg)
    if arg ~= nil then id = arg end
    sampSendChat("/me достал(а) паспорт из кармана")
    wait(2500)
    sampSendChat("/do Держит паспорт в правой руке.")
    wait(2500)
    sampSendChat("/me протянул руку с паспортом человеку напротив")
    wait(2500)
    sampSendChat("/do Передал(а) паспорт человеку.")
    wait(2500)
    sampSendChat("/showpass " .. id)
end
 

XRLM

Известный
2,584
899
Почему отправляет только первое сообщение, а остальные не отправляет?


Lua:
function cmd_kj(arg)
    if arg ~= nil then id = arg end
    sampSendChat("/me достал(а) паспорт из кармана")
    wait(2500)
    sampSendChat("/do Держит паспорт в правой руке.")
    wait(2500)
    sampSendChat("/me протянул руку с паспортом человеку напротив")
    wait(2500)
    sampSendChat("/do Передал(а) паспорт человеку.")
    wait(2500)
    sampSendChat("/showpass " .. id)
end
потому что нет потока для wait, и скрипт крашится.
Lua:
function cmd_kj(arg)
    lua_thread.create(function()
        if arg ~= nil then id = arg end
        sampSendChat("/me достал(а) паспорт из кармана")
        wait(2500)
        sampSendChat("/do Держит паспорт в правой руке.")
        wait(2500)
        sampSendChat("/me протянул руку с паспортом человеку напротив")
        wait(2500)
        sampSendChat("/do Передал(а) паспорт человеку.")
        wait(2500)
        sampSendChat("/showpass " .. id)
    end)
end
 

BlackHole

Участник
40
7
Возможно ли средствами Moonloader / стандарт. Lua или с добавлением библиотеки какой либо, сделать функцию, которая будет делать скриншот окна с GTASA и сохранять это изображение куда либо?

сразу говорю, не SAMP.

Также, как известно, если долгое время ничего не делать( не нажимать клавиши, не крутить камерой и тд ), то игра перейдет в некий режим ожидания, камера начнет трястись и рассматривать "интересные вещи"... Вопрос в том, возможно ли отключить вызов этого режима через работу с memory и тд?
Я не уверен понял ли вас, но этот скрипт делает скрин экрана и сохраняет в папку, не уверен работает ли он коректно, не проверял.


Lua:
local ffi = require("ffi")

-- функция для выполнения команд в командной строке
local function execute_command(command)
    local handle = io.popen(command)
    local result = handle:read("*a")
    handle:close()
    return result
end

-- путь к папке, в которую будут сохраняться скриншоты
local screenshot_directory = "/home/user/screenshots/"

-- название файла для скриншота
local screenshot_filename = os.date("%Y-%m-%d-%H-%M-%S") .. ".png"

-- команда для выполнения скриншотирования с помощью scrot
local screenshot_command = "scrot " .. screenshot_directory .. screenshot_filename

-- выполнение команды скриншотирования
execute_command(screenshot_command)
 

XRLM

Известный
2,584
899
Почему отправляет только первое сообщение, а остальные не отправляет?


Lua:
function cmd_kj(arg)
    if arg ~= nil then id = arg end
    sampSendChat("/me достал(а) паспорт из кармана")
    wait(2500)
    sampSendChat("/do Держит паспорт в правой руке.")
    wait(2500)
    sampSendChat("/me протянул руку с паспортом человеку напротив")
    wait(2500)
    sampSendChat("/do Передал(а) паспорт человеку.")
    wait(2500)
    sampSendChat("/showpass " .. id)
end
если arg == nil, то скрипт крашнется, ибо id будет равно ничему
Lua:
function cmd_kj(arg)
    lua_thread.create(function()
        if arg ~= nil then
            id = arg
            sampSendChat("/me достал(а) паспорт из кармана")
            wait(2500)
            sampSendChat("/do Держит паспорт в правой руке.")
            wait(2500)
            sampSendChat("/me протянул руку с паспортом человеку напротив")
            wait(2500)
            sampSendChat("/do Передал(а) паспорт человеку.")
            wait(2500)
            sampSendChat("/showpass " .. id)
        end
    end)
end
 
  • Нравится
  • Клоун
Реакции: Air_Official и YarikVL

tyukapa

Активный
304
68
Где тут ошибка?

Код:
-- код

local inicfg = require ('inicfg')
local directIni = ('moonloader\\config\\piar.ini')
local mainIni = inicfg.load(nil, directIni)

-- код

function imgui.OnDrawFrame()
  if one1.v then
    imgui.SetNextWindowSize(imgui.ImVec2(500, 150), imgui.Cond.FirstUseEver) -- размер
    imgui.Begin(u8"Меню", one1.v)
    imgui.InputText(u8"текст", text_buffer)
    if imgui.Button(u8"Применить") then
        mainIni.config.ad = text_buffer.v
        if inicfg.save(mainIni, directIni) then
            sampAddChatMessage("Изменения применены.",-1)
        end
    end
    imgui.Text("")
    imgui.Text(u8"текст")
    imgui.TextColoredRGB(u8"{FFFFFF}текст {00FF00}текст")
    
      


  end
  imgui.End()
end

-- код
 

BlackHole

Участник
40
7
Кароче, у админов есть комманда /sp можно как то игнорировать текст который выводится, типа у вас нету доступа, а просто выполнять свой скрипт с командой /sp | events использовать получается? или как не могу понять
 

joumey

Активный
195
43
Кароче, у админов есть комманда /sp можно как то игнорировать текст который выводится, типа у вас нету доступа, а просто выполнять свой скрипт с командой /sp | events использовать получается? или как не могу понять
function require('lib.samp.events').onServerMessage(color, text)
if text:find('...') then
return false
end
end
 

7 СМЕРТНЫХ ГРЕХОВ

Известный
515
159
Где тут ошибка?

Код:
-- код

local inicfg = require ('inicfg')
local directIni = ('moonloader\\config\\piar.ini')
local mainIni = inicfg.load(nil, directIni)

-- код

function imgui.OnDrawFrame()
  if one1.v then
    imgui.SetNextWindowSize(imgui.ImVec2(500, 150), imgui.Cond.FirstUseEver) -- размер
    imgui.Begin(u8"Меню", one1.v)
    imgui.InputText(u8"текст", text_buffer)
    if imgui.Button(u8"Применить") then
        mainIni.config.ad = text_buffer.v
        if inicfg.save(mainIni, directIni) then
            sampAddChatMessage("Изменения применены.",-1)
        end
    end
    imgui.Text("")
    imgui.Text(u8"текст")
    imgui.TextColoredRGB(u8"{FFFFFF}текст {00FF00}текст")
   
     


  end
  imgui.End()
end

-- код
moonloader.log прикрепляй
 

joumey

Активный
195
43
Где тут ошибка?

Код:
-- код

local inicfg = require ('inicfg')
local directIni = ('moonloader\\config\\piar.ini')
local mainIni = inicfg.load(nil, directIni)

-- код

function imgui.OnDrawFrame()
  if one1.v then
    imgui.SetNextWindowSize(imgui.ImVec2(500, 150), imgui.Cond.FirstUseEver) -- размер
    imgui.Begin(u8"Меню", one1.v)
    imgui.InputText(u8"текст", text_buffer)
    if imgui.Button(u8"Применить") then
        mainIni.config.ad = text_buffer.v
        if inicfg.save(mainIni, directIni) then
            sampAddChatMessage("Изменения применены.",-1)
        end
    end
    imgui.Text("")
    imgui.Text(u8"текст")
    imgui.TextColoredRGB(u8"{FFFFFF}текст {00FF00}текст")
   
     


  end
  imgui.End()
end

-- код
Ну чел, не викторина же тут. Прикладывай мунлоадер лог либо полный код ( если это полный код, то ты не импортировал имгуи, и возможно ошибка тут
inicfg.load(nil, directIni)
где nil )
 

tyukapa

Активный
304
68
Ну чел, не викторина же тут. Прикладывай мунлоадер лог либо полный код ( если это полный код, то ты не импортировал имгуи, и возможно ошибка тут
inicfg.load(nil, directIni)
где nil )
local inicfg = require ('inicfg')
local directIni = ('moonloader\\config\\piar.ini')
local mainIni = inicfg.load(nil, directIni)


Cек, кину лог
 

Вложения

  • moonloader.log
    10.7 KB · Просмотры: 5

7 СМЕРТНЫХ ГРЕХОВ

Известный
515
159
Помогите правильно сделать задержку
LUA:
function sampev.onServerMessage(color, text)
  lua_thread.create(function()
    if repskd[0] then
      wait(flovskd[0]*60000)
    end
      if repnokd[0] or repskd[0] then
        if text:find("%[Жалоба%] от .*%[%d+%]:%{......%} .*%. Уже %d+ жалоб!!!") and state == 1 then
          if repnokd[0] then
            sampAddChatMessage(text, 0xFF6046)
          end
          nick, id = text:match("%[Жалоба%] от (.*)%[(%d+)%]:%{......%} (.*)%. Уже (%d+) жалоб!!!")
          sampSendChat('/ot')
          sampSendChat('/re '..id)
          state = 2
        elseif text:find("%[Жалоба%] от %[%d+%].*%[%d+%]:%{......%} .*%. Уже %d+ жалоб%!%!%!") and state == 1 then
          if repnokd[0] then
            sampAddChatMessage(text, 0xFF6046)
          end
          serv, nick, id = text:match("%[Жалоба%] от %[(%d+)%](.*)%[(%d+)%]:%{......%} .*%. Уже %d+ жалоб%!%!%!")
          sampSendChat('/ot')
          sampSendChat('/re '..id)
          state = 2
        elseif text:find("%[Жалоба%] от .*%[%d+%]: %{......%}.*%. Уже %{......%}%d+%{......%} жалоб!!!") and state == 1 then
          if repnokd[0] then
            sampAddChatMessage(text, 0xFF6046)
          end
          nick, id, msg, kolvo  = text:match("%[Жалоба%] от (.*)%[(%d+)%]: %{......%}(.*)%. Уже %{......%}(%d+)%{......%} жалоб!!!")
          sampSendChat('/ot')
          sampSendChat('/re '..id)
          state = 2
        end
      end
  end)
end

Тобишь у меня есть ловля репорта с задержкой и без нее но когда ловит с задержкой он берет не последнюю жб а 1 которую увидел потом ждет кд и отвечает на нее
а мне надо наооброт типо подождал какое то время а потом считал сообщение и взял жб
 

sssilvian

Активный
239
25
Как получить идентификатор цвета для data.color для переменной onShowTextdraw? Я имею в виду, я хочу 00FF78 (шестнадцатеричный код) в data.letterColor, как мне это сделать?
 

M O R R E T I

Известный
22
24
Я не уверен понял ли вас, но этот скрипт делает скрин экрана и сохраняет в папку, не уверен работает ли он коректно, не проверял.


Lua:
local ffi = require("ffi")

-- функция для выполнения команд в командной строке
local function execute_command(command)
    local handle = io.popen(command)
    local result = handle:read("*a")
    handle:close()
    return result
end

-- путь к папке, в которую будут сохраняться скриншоты
local screenshot_directory = "/home/user/screenshots/"

-- название файла для скриншота
local screenshot_filename = os.date("%Y-%m-%d-%H-%M-%S") .. ".png"

-- команда для выполнения скриншотирования с помощью scrot
local screenshot_command = "scrot " .. screenshot_directory .. screenshot_filename

-- выполнение команды скриншотирования
execute_command(screenshot_command)
Это немного не то, это под Linux, моя вина, что не уточнил. Под Windows нужно.