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

Bananious

Известный
238
17
HELP! Почему не ставит рандомные корды? Если вывести через sampAddChatMessage то всё выводит. И если ввести нормально:
Lua:
BeginToPoint(767.169983, -2.530000, 1000.750000, 1.000000, -255, false)
то бот бежит. Но почему не подставляет рандомные корды хз.
Вот что выдаёт в consol'e:
Lua:
attempt to perform arithmetic on local 'go_cords' (a string value)


Lua:
while true do
    wait(0)

    if show_main_window.v == false then
        imgui.Process = false
    end

    local cords_list = {
        [1] = '767.169983, -2.530000, 1000.750000, 1.000000, -255, false',
        [2] = '769.229980, -2.480000, 1000.750000, 1.000000, -255, false',
        [3] = '769.229980, -2.480000, 1000.750000, 1.000000, -255, false',
        [4] = '768.460022, 13.780000, 1000.729980, 1.000000, -255, false'
}

math.randomseed(os.time())
local go_cords = cords_list[math.random(1, 4)]

    if isPlayerPlaying(playerHandle) and bot_cb.v then
        BeginToPoint(go_cords)
        wait(1000)
        BeginToPoint(go_s_cords)
        bot_cb.v = false
end

    end
end
 

sobe1t

Известный
77
1
Можете дать ссылку на гайд по
Lua:
require "ffi"
?

HELP! Почему не ставит рандомные корды? Если вывести через sampAddChatMessage то всё выводит. И если ввести нормально:
Lua:
BeginToPoint(767.169983, -2.530000, 1000.750000, 1.000000, -255, false)
то бот бежит. Но почему не подставляет рандомные корды хз.
Вот что выдаёт в consol'e:
Lua:
attempt to perform arithmetic on local 'go_cords' (a string value)


Lua:
while true do
    wait(0)

    if show_main_window.v == false then
        imgui.Process = false
    end

    local cords_list = {
        [1] = '767.169983, -2.530000, 1000.750000, 1.000000, -255, false',
        [2] = '769.229980, -2.480000, 1000.750000, 1.000000, -255, false',
        [3] = '769.229980, -2.480000, 1000.750000, 1.000000, -255, false',
        [4] = '768.460022, 13.780000, 1000.729980, 1.000000, -255, false'
}

math.randomseed(os.time())
local go_cords = cords_list[math.random(1, 4)]

    if isPlayerPlaying(playerHandle) and bot_cb.v then
        BeginToPoint(go_cords)
        wait(1000)
        BeginToPoint(go_s_cords)
        bot_cb.v = false
end

    end
end
Попробуй заменить BeginToPoint(go_cords) на BeginToPoint(go_cords:match("^(.+),(.+),(.+),(.+),(.+),(.+)$") )
 

Drinkins

Участник
38
0
Помогите пожалуйста, как убрать эти элементы? (мне нужно именно 3 этих элемента убрать, не знаю возможно ли это)
tfefDX0.png
 

Akionka

akionka.lua
Проверенный
740
501
Кто поможет написать один код типо когда пишу /sp было /showpass. Но чтобы команда была /sp [id] и она переключалась при помощи sampSendChat на /showpass [id]. Короче, чтобы показывал паспорт по команде /sp.
Lua:
sampRegisterChatCommand('sp',function (params)
  sampSendChat('/showpass '..params)
end)

Помогите пожалуйста, как убрать эти элементы? (мне нужно именно 3 этих элемента убрать, не знаю возможно ли это)
tfefDX0.png
короче, вторым аргументов передаешь nil и не будет креста, затем во флагах ставишь AlwaysAutoResize и пропадает возможность размер менять, затем NoCollapse и не будет стрелки сверху слева
Lua:
imgui.Begin('title', nil, imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoCollapse)
 
  • Нравится
Реакции: Drinkins

Evgeniy_Pavuk

Активный
119
79
Lua:
if not doesFileExist('moonloader\\config\\MicroHUD\\MH_Options.ini') then
  if not doesDirectoryExist('moonloader\\config\\MicroHUD') then
    createDirectory('moonloader\\config\\MicroHUD')
  end
    local options = {
        Gambit = false,
        Interior = false,
    }
    inicfg.save(options, 'MicroHUD\\MH_Options')
end
local options = inicfg.load(nil, "MicroHUD\\MH_Options")
Почему не создаётся ini файл?
Во первых не объявлена библиотка.
Во вторых нкжно так
Lua:
local inicfg = require 'inicfg'
if not doesDirectoryExist('moonloader\\config\\MicroHUD') then
createDirectory('moonloader\\config\\MicroHUD')
end

    local options = {
        Gambit = false,
        Interior = false,
    }
    local cfg = inicfg.load(options, "MicroHUD\\MH_Options")

function main()
inicfg.save(options, 'MicroHUD\\MH_Options')
end
 

sdfaw

Активный
717
150
ZzXp0bn.png

IcBAH0b.png

выводит
h5Y8RfV.png

как исправить?
в one и two из input text значение
p.s кто не понял мне нужно чтобы из массива рандомно выводился текст
 

Bananious

Известный
238
17
Почему у меня бот не бежит по рандомным кордам?
Lua:
require 'lib.moonloader'
local sampev = require 'lib.samp.events'
local ffi = require "ffi"
ffi.cdef[[
     void keybd_event(int keycode, int scancode, int flags, int extra);
]]

-- ImGUI settings --

local imgui = require 'imgui'
local key = require 'vkeys'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local main_color = "{3C64AF}"
local gray_color = "{949494}"
local active_color = "{109E2B}"
local deactive_color = "{B91C0E}"
local white_color = "{FFFFFF}"
local yellow_color = "{FFC800}"

function apply_custom_style()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

    style.WindowRounding = 2.0
    style.WindowTitleAlign = imgui.ImVec2(0.5, 0.84)
    style.ChildWindowRounding = 2.0
    style.FrameRounding = 2.0
    style.ItemSpacing = imgui.ImVec2(5.0, 4.0)
    style.ScrollbarSize = 13.0
    style.ScrollbarRounding = 0
    style.GrabMinSize = 8.0
    style.GrabRounding = 1.0

    colors[clr.Text] = ImVec4(0.80, 0.80, 0.83, 1.00)
    colors[clr.TextDisabled] = ImVec4(0.24, 0.23, 0.29, 1.00)
    colors[clr.WindowBg] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.ChildWindowBg] = ImVec4(0.07, 0.07, 0.09, 1.00)
    colors[clr.PopupBg] = ImVec4(0.07, 0.07, 0.09, 1.00)
    colors[clr.Border] = ImVec4(0.80, 0.80, 0.83, 0.88)
    colors[clr.BorderShadow] = ImVec4(0.92, 0.91, 0.88, 0.00)
    colors[clr.FrameBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.FrameBgHovered] = ImVec4(0.24, 0.23, 0.29, 1.00)
    colors[clr.FrameBgActive] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.TitleBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.TitleBgCollapsed] = ImVec4(1.00, 0.98, 0.95, 0.75)
    colors[clr.TitleBgActive] = ImVec4(0.07, 0.07, 0.09, 1.00)
    colors[clr.MenuBarBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.ScrollbarBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.ScrollbarGrab] = ImVec4(0.80, 0.80, 0.83, 0.31)
    colors[clr.ScrollbarGrabHovered] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.ScrollbarGrabActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.ComboBg] = ImVec4(0.19, 0.18, 0.21, 1.00)
    colors[clr.CheckMark] = ImVec4(0.80, 0.80, 0.83, 0.31)
    colors[clr.SliderGrab] = ImVec4(0.80, 0.80, 0.83, 0.31)
    colors[clr.SliderGrabActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.Button] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.ButtonHovered] = ImVec4(0.24, 0.23, 0.29, 1.00)
    colors[clr.ButtonActive] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.Header] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.HeaderHovered] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.HeaderActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.ResizeGrip] = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.ResizeGripHovered] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.ResizeGripActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.CloseButton] = ImVec4(0.40, 0.39, 0.38, 0.16)
    colors[clr.CloseButtonHovered] = ImVec4(0.40, 0.39, 0.38, 0.39)
    colors[clr.CloseButtonActive] = ImVec4(0.40, 0.39, 0.38, 1.00)
    colors[clr.PlotLines] = ImVec4(0.40, 0.39, 0.38, 0.63)
    colors[clr.PlotLinesHovered] = ImVec4(0.25, 1.00, 0.00, 1.00)
    colors[clr.PlotHistogram] = ImVec4(0.40, 0.39, 0.38, 0.63)
    colors[clr.PlotHistogramHovered] = ImVec4(0.25, 1.00, 0.00, 1.00)
    colors[clr.TextSelectedBg] = ImVec4(0.25, 1.00, 0.00, 0.43)
    colors[clr.ModalWindowDarkening] = ImVec4(1.00, 0.98, 0.95, 0.73)
end
apply_custom_style()

do

show_main_window = imgui.ImBool(false)
local show_imgui_example = imgui.ImBool(false)
local slider_float = imgui.ImFloat(0.0)
local clear_color = imgui.ImVec4(0.45, 0.55, 0.60, 1.00)
local show_test_window = imgui.ImBool(false)
local show_another_window = imgui.ImBool(false)
local show_moon_imgui_tutorial = {imgui.ImBool(false), imgui.ImBool(false), imgui.ImBool(false)}
local moonimgui_text_buffer = imgui.ImBuffer('test', 256)
local cb_render_in_menu = imgui.ImBool(imgui.RenderInMenu)
local cb_lock_player = imgui.ImBool(imgui.LockPlayer)
local cb_show_cursor = imgui.ImBool(imgui.ShowCursor)
local font_changed = false
local glyph_ranges_cyrillic = nil
bot_1_cb = imgui.ImBool(false)
bot_2_cb = imgui.ImBool(false)
bot_3_cb = imgui.ImBool(false)
function imgui.OnDrawFrame()
    -- Main Window
    if show_main_window.v then
        local sw, sh = getScreenResolution()
        -- center
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(300, 300), imgui.Cond.FirstUseEver)
        imgui.Begin('Bot', show_main_window)
        local btn_size = imgui.ImVec2(-0.1, 0)
    if imgui.CollapsingHeader(u8'Боты') then
        imgui.Checkbox(u8'Бот 1', bot_1_cb)
        imgui.Checkbox(u8'Бот 2', bot_2_cb)
        imgui.Checkbox(u8'Бот 3', bot_3_cb)
    end
        imgui.End()
    end

end
end

function checkbox()

    if bot_1_cb.v then
        wait(10000)
    end

end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    local saveX = {}
    local saveY = {}
    local saveZ = {}

    sampRegisterChatCommand("gmenu", function()
show_main_window.v = not show_main_window.v
imgui.Process = show_main_window.v
end)

while true do
    wait(0)

    if show_main_window.v == false then
        imgui.Process = false
    end

    local cords_list = {
        [1] = '767.169983, -2.530000, 1000.750000, 1.000000, -255, false',
        [2] = '769.229980, -2.480000, 1000.750000, 1.000000, -255, false',
        [3] = '769.229980, -2.480000, 1000.750000, 1.000000, -255, false',
        [4] = '768.460022, 13.780000, 1000.729980, 1.000000, -255, false'
}

math.randomseed(os.time())
local go_cords = cords_list[math.random(1, 4)]

    if isPlayerPlaying(playerHandle) and bot_1_cb.v then
        BeginToPoint(go_cords:match("^(.+),(.+),(.+),(.+),(.+),(.+)$") )
end

    end
end

--------------------------- STANDART FUNCTIONS ---------------------------

function BeginToPoint(x, y, z, radius, move_code, isSprint)
    repeat
        local posX, posY, posZ = GetCoordinates()
        SetAngle(x, y, z)
        MovePlayer(move_code, isSprint)
        local dist = getDistanceBetweenCoords3d(x, y, z, posX, posY, z)
        wait(0)
    until not enabled or dist < radius
end
function MovePlayer(move_code, isSprint)
    setGameKeyState(1, move_code)
    if isSprint then setGameKeyState(16, 255) end
end

function SetAngle(x, y, z)
    local posX, posY, posZ = GetCoordinates()
    local pX = x - posX
    local pY = y - posY
    local zAngle = getHeadingFromVector2d(pX, pY)

    if isCharInAnyCar(playerPed) then
        local car = storeCarCharIsInNoSave(playerPed)
        setCarHeading(car, zAngle)
    else
        setCharHeading(playerPed, zAngle)
    end

    restoreCameraJumpcut()
end

function GetCoordinates()
    if isCharInAnyCar(playerPed) then
        local car = storeCarCharIsInNoSave(playerPed)
        return getCarCoordinates(car)
    else
        return getCharCoordinates(playerPed)
    end
end
 

Evgeniy_Pavuk

Активный
119
79

Daaz

Новичок
5
3
Код:
function main()
while not isSampAvailable() do wait(100) end
sampRegisterChatCommand('sp',functin (id))
sampAddChatMessage('loaded', -1)
while true do wait(0) end end

function functin(id)
sampSendChat('/showpass '..id)
end

Это так должно выглядеть, или я тупой?
Просто у меня из этого ничего не работает.
 

Bananious

Известный
238
17
Код:
function main()
while not isSampAvailable() do wait(100) end
sampRegisterChatCommand('sp',functin (id))
sampAddChatMessage('loaded', -1)
while true do wait(0) end end

function functin(id)
sampSendChat('/showpass '..id)
end

Это так должно выглядеть, или я тупой?
Просто у меня из этого ничего не работает.
Lua:
require 'lib.moonloader'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    sampAddChatMessage('loaded', -1)

    sampRegisterChatCommand('sp',functin (id))

    while true do
        wait(0)

    end
end

function functin(id)
sampSendChat('/showpass '..id)
end
 
  • Нравится
Реакции: Daaz

Akionka

akionka.lua
Проверенный
740
501
Код:
function main()
while not isSampAvailable() do wait(100) end
sampRegisterChatCommand('sp',functin (id))
sampAddChatMessage('loaded', -1)
while true do wait(0) end end

function functin(id)
sampSendChat('/showpass '..id)
end

Это так должно выглядеть, или я тупой?
Просто у меня из этого ничего не работает.
Lua:
function main()
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand('sp', sp)
  sampAddChatMessage('loaded', -1)
  while true do
    wait(0)
  end
end

function sp(id)
  sampSendChat('/showpass '..id)
end
но лучше так
Lua:
function main()
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand('sp', function(id)
    sampSendChat('/showpass '..id)
  end)
  sampAddChatMessage('loaded', -1)
  while true do
    wait(0)
  end
end
 
  • Нравится
Реакции: Daaz

Bogach

Активный
558
27
Здарова ребят. Такой вопрос, после того как FYP сказал, что мунлоадер не зависит от клео, сампфункса и т.д, я решил поставил мунлоадер на гта их нет (само собой asi loader я поставил), установил все либы и закинул только один свой скрипт, но вот проблема, moonloader log говорит, что библиотека Samp Events не найдена, но такая библиотека есть :blink:
Lua:
[16:51:48.196121] (system)    Session started.
[16:51:48.196121] (debug)    Module handle: 6C870000

MoonLoader v.026.5-beta loaded.
Developers: FYP, hnnssy, EvgeN 1137

Copyright (c) 2016, BlastHack Team
https://www.blast.hk/moonloader/

[16:51:48.197121] (info)    Working directory: D:\Games\GTASA\moonloader
[16:51:48.197121] (debug)    FP Control: 0009001F
[16:51:48.197121] (debug)    Game: GTA SA 1.0.0.0 US
[16:51:48.197121] (system)    Installing pre-game hooks...
[16:51:48.201121] (system)    Hooks installed.
[16:51:48.459136] (debug)    Initializing opcode handler table
[16:51:48.459136] (debug)    package.path = D:\Games\GTASA\moonloader\lib\?.lua;D:\Games\GTASA\moonloader\lib\?\init.lua;D:\Games\GTASA\moonloader\?.lua;D:\Games\GTASA\moonloader\?\init.lua;.\?.lua;D:\Games\GTASA\moonloader\lib\?.luac;D:\Games\GTASA\moonloader\lib\?\init.luac;D:\Games\GTASA\moonloader\?.luac;D:\Games\GTASA\moonloader\?\init.luac;.\?.luac
[16:51:48.460136] (debug)    package.cpath = D:\Games\GTASA\moonloader\lib\?.dll;
[16:51:48.468136] (system)    Loading script 'D:\Games\GTASA\moonloader\AH.lua'...
[16:51:48.468136] (debug)    New script: 0631E6CC
[16:51:48.474136] (error)    AutoSchool Helper: D:\Games\GTASA\moonloader\AH.lua:15: Библиотека SAMP Events не найдена
stack traceback:
    [C]: in function 'assert'
    D:\Games\GTASA\moonloader\AH.lua:15: in main chunk
[16:51:48.474136] (error)    AutoSchool Helper: Script died due to an error. (0631E6CC)
[16:51:59.215751] (system)    Installing post-load hooks...
[16:51:59.217751] (system)    Hooks installed.
[16:57:30.475698] (system)    Unloading...
[16:57:30.484698] (system)    Session terminated.
Безымянный.png