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

DolgorukovGTA

Известный
Проверенный
652
345
А у меня что неправильно
local inicfg = require ('inicfg')
local Load_Config = inicfg.load ({
Recon =
{
ReconID =
},
General =
{
LoginAdminPanel = 1234,
LoginAccount = qwerty123,
Show_imgui_Login = 0
},
Zametki =
{
Zametka1 = Test1,
Zametka2 = Test2,
Zametka3 = Test3,
Zametka4 = Test4,
Zametka5 = Test5
},
Binder =
{
For_Obzvon2 =,
OOC_MP1 =,
OOC_MP2 =
},
Options =
{
Cmds_Offtop = 1,
CheatCode_Activedet = ah,
Command_Activedet = ah,
Actived_Imgui_Command = 1,
Actived_Imgui_CheatCode = 0,
Style = 2
}
}, '..\\config\\Imgui Admin Help.ini')
Я повторил как этo:
local ini = inicfg.load({
Main =
{
longHpBar = false,
numHp = false,
sensFix = false,
noReload = false,
setVehicleVelocity = false,
noBat = false,
fullSkill = false,
infiniteFuel = false,
streamChecker = false,
skeletalWH = false
},
Flooder =
{
floodTime = 1.1,
floodText = 'text'
},
Usedrugs =
{
useDrugs = false,
nKey = 'X',
nTime = 60.0
}
}, '..\\config\\[Gang menu] settings.ini')
Для удобства чтения и изменения кода на форуме, его необходимо оформлять следующим образом: нажать кнопку "Вставить", которая помечена троеточием в панели редактирования сообщения, после чего выбрать пункт "Код", выбрать язык программирования, на котором реализовано твоё творение, вписать его в соответствующее поле, нажать кнопку "продолжить". Визуализационный пример:
Lua:
print("hello blasthack!")
Согласись, это куда эстетичнее и корректнее смотрится. Если код написан на много строк, рекомендую его прятать под спойлер.
Lua:
print("hello blasthack!")
 

Vespan

Чешский луашер
Проверенный
2,118
1,716
Подскажите,что неправильно в этом коде?
Lua:
local inicfg = require ('inicfg')
local Load_Config = inicfg.load ({
    Recon =
    {
        ReconID =
    },
    General =
    {
        LoginAdminPanel = 1234,
        LoginAccount = qwerty123,
        Show_imgui_Login = 0
    },
    Zametki =
    {
        Zametka1 = Test1,
        Zametka2 = Test2,
        Zametka3 = Test3,
        Zametka4 = Test4,
        Zametka5 = Test5
    },
    Binder =
    {
        For_Obzvon2 =,
        OOC_MP1 =,
        OOC_MP2 =
    },
    Options =
    {
        Cmds_Offtop = 1,
        CheatCode_Activedet = ah,
        Command_Activedet = ah,
        Actived_Imgui_Command = 1,
        Actived_Imgui_CheatCode = 0,
        Style = 2
    }
}, '..\\config\\Imgui Admin Help.ini')
---
По задумке,это должно создать .ini файл,но не создаеться
 

ShikamaruRU

Участник
55
1
Lua:
--Инфа по скрипту.
script_version("19.09.2019")

--Библиотеки
require "lib.moonloader"
local imgui = require 'imgui'
local dlstatus = require('moonloader').download_status
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local inicfg = require 'inicfg'

--local directIni = "moonloader\\config\\Medical-Helper.ini"

--local mainIni = inicfg.load(nil, directIni)
--local stateIni = inicfg.save(mainIni, directIni)


--Не помню что тут, но видимо не так важно.
imgui.Process = false

local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)
local sw, sh = getScreenResolution()


--Цвета
local main_color_text = "{FF69B4}"

function main()
    while not isSampAvailable() do wait(100) end

    sampRegisterChatCommand("medh", medh)
    sampAddChatMessage("Medical Helper by Kevin McWood | Surprise", -1)
    sampRegisterChatCommand("h", h)


    while true do wait(0)
        if main_window_state.v == false then
            imgui.Process = false
        end
        _,  ped = storeClosestEntities(PLAYER_PED)
         id = sampGetPlayerIdByCharHandle(ped)
    end
end

function h()
        lua_thread.create(function ()
    sampSendChat("Здравствуйте. Я сотрудник данного медицинского центра, что вас беспокоит?")
    wait(1000)
    sampSendChat("/todo Я вас понял,одну минуту,найду вам нужное лекарство*открыв мед.кейс,взяв лекарство в правую руку")
    wait(1000)
    sampSendChat("/me передает человеку напротив лекарство.")
    wait(1000)
    sampSendChat('/heal ' .. id)
        end)
end

function medh(arg)
    main_window_state.v = not main_window_state.v
    imgui.Process = main_window_state.v
end

--Панелька imgui
function imgui.OnDrawFrame()
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
  imgui.SetNextWindowSize(imgui.ImVec2(600, 600), imgui.Cond.FirstUseEver)
    imgui.Begin(u8"Настройки скрипта", main_window_state, imgui.WindowFlags.NoCollapse)
        if imgui.CollapsingHeader(u8"Основная информация") then
            imgui.Text(u8"Ваш ник: " .. nick, main_color_text)
            imgui.Text(u8"Ваш id: " .. id, main_color_text)
        end
    imgui.End()
end


[ML] (error) Medical Helper | ARZ Surprise: C:\Games\GTA San Andreas\moonloader\Medical Helper.lua:57: attempt to concatenate global 'id' (a boolean value)
stack traceback:
C:\Games\GTA San Andreas\moonloader\Medical Helper.lua: in function <C:\Games\GTA San Andreas\moonloader\Medical Helper.lua:50>
[ML] (error) Medical Helper | ARZ Surprise: Script died due to an error. (01D71A34)

В чем проблемка?
 

Angr

Известный
291
99
Подскажите,что неправильно в этом коде?
Lua:
local inicfg = require ('inicfg')
local Load_Config = inicfg.load ({
    Recon =
    {
        ReconID =
    },
    General =
    {
        LoginAdminPanel = 1234,
        LoginAccount = qwerty123,
        Show_imgui_Login = 0
    },
    Zametki =
    {
        Zametka1 = Test1,
        Zametka2 = Test2,
        Zametka3 = Test3,
        Zametka4 = Test4,
        Zametka5 = Test5
    },
    Binder =
    {
        For_Obzvon2 =,
        OOC_MP1 =,
        OOC_MP2 =
    },
    Options =
    {
        Cmds_Offtop = 1,
        CheatCode_Activedet = ah,
        Command_Activedet = ah,
        Actived_Imgui_Command = 1,
        Actived_Imgui_CheatCode = 0,
        Style = 2
    }
}, '..\\config\\Imgui Admin Help.ini')
---
По задумке,это должно создать .ini файл,но не создаеться
1) Обрати внимание на "ReconID =" займи ее чем-то, типо "ReconID = -1" так-же Раздел "Binder"
2) Cоздавать он ее будет когда ты сделаешь какие-то изменения в этих параметрах конфига
Lua:
--Инфа по скрипту.
script_version("19.09.2019")

--Библиотеки
require "lib.moonloader"
local imgui = require 'imgui'
local dlstatus = require('moonloader').download_status
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local inicfg = require 'inicfg'

--local directIni = "moonloader\\config\\Medical-Helper.ini"

--local mainIni = inicfg.load(nil, directIni)
--local stateIni = inicfg.save(mainIni, directIni)


--Не помню что тут, но видимо не так важно.
imgui.Process = false

local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)
local sw, sh = getScreenResolution()


--Цвета
local main_color_text = "{FF69B4}"

function main()
    while not isSampAvailable() do wait(100) end

    sampRegisterChatCommand("medh", medh)
    sampAddChatMessage("Medical Helper by Kevin McWood | Surprise", -1)
    sampRegisterChatCommand("h", h)


    while true do wait(0)
        if main_window_state.v == false then
            imgui.Process = false
        end
        _,  ped = storeClosestEntities(PLAYER_PED)
         id = sampGetPlayerIdByCharHandle(ped)
    end
end

function h()
        lua_thread.create(function ()
    sampSendChat("Здравствуйте. Я сотрудник данного медицинского центра, что вас беспокоит?")
    wait(1000)
    sampSendChat("/todo Я вас понял,одну минуту,найду вам нужное лекарство*открыв мед.кейс,взяв лекарство в правую руку")
    wait(1000)
    sampSendChat("/me передает человеку напротив лекарство.")
    wait(1000)
    sampSendChat('/heal ' .. id)
        end)
end

function medh(arg)
    main_window_state.v = not main_window_state.v
    imgui.Process = main_window_state.v
end

--Панелька imgui
function imgui.OnDrawFrame()
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
  imgui.SetNextWindowSize(imgui.ImVec2(600, 600), imgui.Cond.FirstUseEver)
    imgui.Begin(u8"Настройки скрипта", main_window_state, imgui.WindowFlags.NoCollapse)
        if imgui.CollapsingHeader(u8"Основная информация") then
            imgui.Text(u8"Ваш ник: " .. nick, main_color_text)
            imgui.Text(u8"Ваш id: " .. id, main_color_text)
        end
    imgui.End()
end


[ML] (error) Medical Helper | ARZ Surprise: C:\Games\GTA San Andreas\moonloader\Medical Helper.lua:57: attempt to concatenate global 'id' (a boolean value)
stack traceback:
C:\Games\GTA San Andreas\moonloader\Medical Helper.lua: in function <C:\Games\GTA San Andreas\moonloader\Medical Helper.lua:50>
[ML] (error) Medical Helper | ARZ Surprise: Script died due to an error. (01D71A34)

В чем проблемка?
Читай: global 'id' (a boolean value).
Тебе возвращает 2 парамента BOOL и сам ид, делай либо id = select(2,sampGetPlayerIdByCharHandle(ped)) или result,id = sampGetPlayerIdByCharHandle(ped)
 
Последнее редактирование:
  • Нравится
Реакции: ShikamaruRU

ShikamaruRU

Участник
55
1
1) Обрати внимание на "ReconID =" займи ее чем-то, типо "ReconID = -1" так-же Раздел "Binder"
2) Cоздавать он ее будет когда ты сделаешь какие-то изменения в этих параметрах конфига

Читай: global 'id' (a boolean value).
Тебе возвращает 2 парамента BOOL и сам ид, делай либо id = select(2,sampGetPlayerIdByCharHandle(ped)) или result,id = sampGetPlayerIdByCharHandle(ped)
Lua:
--Инфа по скрипту.
script_version("19.09.2019")

--Библиотеки
require "lib.moonloader"
local imgui = require 'imgui'
local dlstatus = require('moonloader').download_status
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local inicfg = require 'inicfg'

--local directIni = "moonloader\\config\\Medical-Helper.ini"

--local mainIni = inicfg.load(nil, directIni)
--local stateIni = inicfg.save(mainIni, directIni)


--Не помню что тут, но видимо не так важно.
imgui.Process = false

local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)
local sw, sh = getScreenResolution()

--Цвета
local main_color_text = "{FF69B4}"

function main()
    while not isSampAvailable() do wait(100) end

    sampRegisterChatCommand("medh", medh)
    sampRegisterChatCommand("h", h)


    while true do wait(0)
        if main_window_state.v == false then
            imgui.Process = false
        end
        _,  ped = storeClosestEntities(PLAYER_PED)
        result,id = sampGetPlayerIdByCharHandle(ped)
    end
end

function h()
        lua_thread.create(function ()
    sampSendChat("Здравствуйте. Я сотрудник данного медицинского центра, что вас беспокоит?")
    wait(1000)
    sampSendChat("/todo Я вас понял,одну минуту,найду вам нужное лекарство*открыв мед.кейс,взяв лекарство в правую руку")
    wait(1000)
    sampSendChat("/me передает человеку напротив лекарство.")
    wait(1000)
    sampSendChat('/heal ' .. id)
        end)
end

function medh(arg)
    main_window_state.v = not main_window_state.v
    imgui.Process = main_window_state.v
end

--Панелька imgui
function imgui.OnDrawFrame()
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
  imgui.SetNextWindowSize(imgui.ImVec2(600, 600), imgui.Cond.FirstUseEver)
    imgui.Begin(u8"Настройки скрипта", main_window_state, imgui.WindowFlags.NoCollapse)
        if imgui.CollapsingHeader(u8"Основная информация") then
            imgui.Text(u8"Ваш ник: " .. nick, main_color_text)
            imgui.Text(u8"Ваш id: " .. id, main_color_text)
        end
    imgui.End()
end

[ML] (error) Medical Helper | ARZ Surprise: C:\Games\GTA San Andreas\moonloader\Medical Helper.lua:71: attempt to concatenate global 'nick' (a nil value)
stack traceback:
C:\Games\GTA San Andreas\moonloader\Medical Helper.lua:71: in function 'OnDrawFrame'
C:\Games\GTA San Andreas\moonloader\lib\imgui.lua:1378: in function <C:\Games\GTA San Andreas\moonloader\lib\imgui.lua:1367>
[ML] (error) Medical Helper | ARZ Surprise: Script died due to an error. (01C65AAC)

А как это исправить? Хочу вывести nick в imgui
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
Lua:
--Инфа по скрипту.
script_version("19.09.2019")

--Библиотеки
require "lib.moonloader"
local imgui = require 'imgui'
local dlstatus = require('moonloader').download_status
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local inicfg = require 'inicfg'

--local directIni = "moonloader\\config\\Medical-Helper.ini"

--local mainIni = inicfg.load(nil, directIni)
--local stateIni = inicfg.save(mainIni, directIni)


--Не помню что тут, но видимо не так важно.
imgui.Process = false

local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)
local sw, sh = getScreenResolution()

--Цвета
local main_color_text = "{FF69B4}"

function main()
    while not isSampAvailable() do wait(100) end

    sampRegisterChatCommand("medh", medh)
    sampRegisterChatCommand("h", h)


    while true do wait(0)
        if main_window_state.v == false then
            imgui.Process = false
        end
        _,  ped = storeClosestEntities(PLAYER_PED)
        result,id = sampGetPlayerIdByCharHandle(ped)
    end
end

function h()
        lua_thread.create(function ()
    sampSendChat("Здравствуйте. Я сотрудник данного медицинского центра, что вас беспокоит?")
    wait(1000)
    sampSendChat("/todo Я вас понял,одну минуту,найду вам нужное лекарство*открыв мед.кейс,взяв лекарство в правую руку")
    wait(1000)
    sampSendChat("/me передает человеку напротив лекарство.")
    wait(1000)
    sampSendChat('/heal ' .. id)
        end)
end

function medh(arg)
    main_window_state.v = not main_window_state.v
    imgui.Process = main_window_state.v
end

--Панелька imgui
function imgui.OnDrawFrame()
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
  imgui.SetNextWindowSize(imgui.ImVec2(600, 600), imgui.Cond.FirstUseEver)
    imgui.Begin(u8"Настройки скрипта", main_window_state, imgui.WindowFlags.NoCollapse)
        if imgui.CollapsingHeader(u8"Основная информация") then
            imgui.Text(u8"Ваш ник: " .. nick, main_color_text)
            imgui.Text(u8"Ваш id: " .. id, main_color_text)
        end
    imgui.End()
end

[ML] (error) Medical Helper | ARZ Surprise: C:\Games\GTA San Andreas\moonloader\Medical Helper.lua:71: attempt to concatenate global 'nick' (a nil value)
stack traceback:
C:\Games\GTA San Andreas\moonloader\Medical Helper.lua:71: in function 'OnDrawFrame'
C:\Games\GTA San Andreas\moonloader\lib\imgui.lua:1378: in function <C:\Games\GTA San Andreas\moonloader\lib\imgui.lua:1367>
[ML] (error) Medical Helper | ARZ Surprise: Script died due to an error. (01C65AAC)

А как это исправить? Хочу вывести nick в imgui
Lua:
-- main
mynick = sampGetPlayerNickname(myid)
_, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)


-- onDrawFrame
imgui.Text(u8"Ваш ник: "..mynick)
imgui.Text(u8"Ваш ID: "..myid)
40373
 
Последнее редактирование:
  • Нравится
Реакции: ShikamaruRU

Benya

Активный
145
45
и еще, как убрать числа после точки?
т.е чтобы вместо "46.200000762939" было "46"

Округлить, либо через форматирование строки выводить только целое число.

Lua:
local t = 46.200000762939
math.floor(t) - огругление вниз ( получишь 46 )
math.ceil(t) - огругление вверх ( получишь 47 )
 
  • Нравится
Реакции: Dmitriy Makarov

0xNull_Dll

Известный
143
21
можно ли как-то проверить наличие светофора спереди, а также какой у него цвет?
 

Eugene Crabs

Активный
544
30
можно ли как-то проверить наличие светофора спереди, а также какой у него цвет?
Такое хз. Но если кому-то поможет найти ответ для тебя - функция taskDriveBy каким-то чудо образом может определять свет светофора, который находится на её пути

А теперь мой вопрос. Нужно определить в какой стороне света стоит одна точка по отношению к другой. Как это сделать?
 
Последнее редактирование:

1bullet

Известный
33
2
Ребята, такой вопрос. Как можно посредством луа запустить команду встроенную в клиент, по типу /pagesize или /timestamp?
 

Eugene Crabs

Активный
544
30
Ребята, такой вопрос. Как можно посредством луа запустить команду встроенную в клиент, по типу /pagesize или /timestamp?
Самое простое - написать её в чат. Если нужно без чата - хз. Вроде RPC какой-то должен отправлять, но я с ними еще не разобрался
 

1bullet

Известный
33
2
Самое простое - написать её в чат. Если нужно без чата - хз. Вроде RPC какой-то должен отправлять, но я с ними еще не разобрался
В том то и дело, что через сампсендчат они не работают, ибо команда отправляется сразу на сервер, не цепляя клиент при этом.

add: есть ли какой-то варик ввода команды как в обычном ахк или биндере?
 

Eugene Crabs

Активный
544
30
В том то и дело, что через сампсендчат они не работают, ибо команда отправляется сразу на сервер, не цепляя клиент при этом.

add: есть ли какой-то варик ввода команды как в обычном ахк или биндере?
Есть короч странный вариант. Попробуй открывать чат и эмулировать нажатия клавиш. Хз сработает ли. Думаю можно сделать куда проще
 

1bullet

Известный
33
2
Есть короч странный вариант. Попробуй открывать чат и эмулировать нажатия клавиш. Хз сработает ли. Думаю можно сделать куда проще
Уже попробовал, такой быдлокод конечно сработал. Но надеялся есть способ попроще.
 

Eugene Crabs

Активный
544
30
Уже попробовал, такой быдлокод конечно сработал. Но надеялся есть способ попроще.

Ребята, такой вопрос. Как можно посредством луа запустить команду встроенную в клиент, по типу /pagesize или /timestamp?
Не быдлокод, а решение проблемы :- ). Думаю есть, хоть функции я и не нашел. Просто дождись прихода более опытных людей. Они обычно после 15:00 по МСК заходят.

А теперь мой вопрос. Как мне с помощью Lua войти в АФК, но при этом сохранить работу скриптов?