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

invilso.

Известный
259
89
К координатам персонаж идёт, но на Alt не нажимает, что не так?
Lua:
local vkeys = require "vkeys"
local sampev = require "lib.samp.events"
local imgui = require "imgui"
local encoding = require "encoding"
encoding.default = "CP1251"
u8 = encoding.UTF8
local rkeys = require "rkeys"
imgui.ToggleButton = require("imgui_addons").ToggleButton

local farm = imgui.ImBool(false)
selected = 1
local hlopokbot = imgui.ImBool(false)

function runToPoint(tox, toy)
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local angle = getHeadingFromVector2d(tox - x, toy - y)
    local xAngle = math.random(-50, 50)/100
    setCameraPositionUnfixed(xAngle, math.rad(angle - 90))
    stopRun = false
    while getDistanceBetweenCoords2d(x, y, tox, toy) > 0.8 do
        setGameKeyState(1, -255)
        setGameKeyState(16, 1)
        wait(1)
        x, y, z = getCharCoordinates(PLAYER_PED)
        angle = getHeadingFromVector2d(tox - x, toy - y)
        setCameraPositionUnfixed(xAngle, math.rad(angle - 90))
        if stopRun then
            stopRun = false
            break
        end
    end
end

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

    imgui.Process = false

    lua_thread.create(farmhlopok)
    farmhlopok = false

    while true do
        wait(0)

        if isKeyJustPressed(0x71) then
            farm.v = not farm.v
            imgui.Process = farm.v
        end

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

        if hlopokbot.v then
            farmhlopok = true
        else
            farmhlopok = false
        end
    end
end

local sw, sh = getScreenResolution()

function imgui.OnDrawFrame()
    if farm.v then
        imgui.SetNextWindowSize(imgui.ImVec2(900, 525), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.Begin("##1", farm, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoScrollbar)
        imgui.NewLine()
        imgui.PushFont(ds_font)
        imgui.Text("Farm Bot")
        imgui.PopFont()
        imgui.Separator()
        imgui.Columns(2, "##columns1", true)
        imgui.SetColumnWidth(-1, 225)
        imgui.BeginChild("##child2", imgui.ImVec2(218, 440), false)
            imgui.BeginChild("##child1", imgui.ImVec2(210, 160), true)
                _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
                nick = sampGetPlayerNickname(id)
                ping = sampGetPlayerPing(id)
                x, y, z = getCharCoordinates(PLAYER_PED)
                imgui.Text(u8"Ваш NickName: " .. nick)
                imgui.Text(u8"Ваш ID: " .. id)
                imgui.Text(u8"Ваш пинг: " .. ping)
                imgui.Text(u8"Ваше местоположение:\nX: " .. x .. "\nY: " .. y .. "\nZ: " .. z)
            imgui.EndChild()
            imgui.NewLine()
            if imgui.Button(u8"Главная", imgui.ImVec2(208, 35)) then
                selected = 1
            end
            imgui.NewLine()
            if imgui.Button(u8"Бот для фермы", imgui.ImVec2(208, 35)) then
                selected = 2
            end
            imgui.NewLine()
            if imgui.Button(u8"Бот для шахты", imgui.ImVec2(208, 35)) then
                selected = 3
            end
            imgui.NewLine()
            if imgui.Button(u8"Другое", imgui.ImVec2(208, 35)) then
                selected = 4
            end
        imgui.EndChild()
        imgui.NextColumn()
        imgui.BeginChild("##child3", imgui.ImVec2(657, 440), true)
            if selected == 1 then

            elseif selected == 2 then
                imgui.NewLine()
                imgui.ToggleButton(u8"Hlopok", hlopokbot)
                imgui.SameLine()
                imgui.Text(u8"Добыча хлопка")
            elseif selected == 3 then

            elseif selected == 4 then
             
            end
        imgui.EndChild()
        imgui.End()
    end
end

local x, y, z = getCharCoordinates(PLAYER_PED)

function farmhlopok()
    while true do
        wait(0)
        if farmhlopok then
            if x == -224 and y == 1757 then
                setVirtualKeyDown(0xA4)
                wait(700)
                setVirtualKeyDown(0xA4)
                wait(700)
                setVirtualKeyDown(0xA4)
                wait(700)
                setVirtualKeyDown(0xA4)
                wait(700)
                setVirtualKeyDown(0xA4)
                wait(700)
                setVirtualKeyDown(0xA4, true)
                wait(700)
                setVirtualKeyDown(0xA4, true)
                wait(700)
                setVirtualKeyDown(0xA4, true)
                wait(700)
                setVirtualKeyDown(0xA4, true)
                wait(700)
                setVirtualKeyDown(0xA4, true)
            else
                runToPoint(-224, 1757)
                if x == -224 and y == 1757 then
                    stopRun = true
                end
            end
        end
    end
end
Lua:
setVirtualKeyDown(0xA4, true)
wait(30)
setVirtualKeyDown(0xA4, false)
Upd: Вместо повторения миллион раз юзай цикл)
 

OINZDIWEW

Новичок
13
1
Lua:
sampSetChatInputText("/showpass ")
sampSetChatInputEnabled(true)
все почти так только после этого инпута у меня идет дальше sampSendChat, есть проблема мне нужно что бы пока я писал id по инпуту у меня скрипт останавливался и только после отправки шоупасса он продолжался,можно ли так сделать? Не хочу ограничивать сенд инпут временем типо пусть стоит хоть пол часа
 

Smeruxa

Известный
1,371
726
все почти так только после этого инпута у меня идет дальше sampSendChat, есть проблема мне нужно что бы пока я писал id по инпуту у меня скрипт останавливался и только после отправки шоупасса он продолжался,можно ли так сделать? Не хочу ограничивать сенд инпут временем типо пусть стоит хоть пол часа
вместо ввода давай улучшим эту систему. /showpass работает по ид, по ближайшему, если далеко то воркать не будет, так вот, юзни
bool result, Ped ped = getCharPlayerIsTargeting(Player player)
Оттуда доставай ид и показывай паспорт. ЗБС тактика
 

OINZDIWEW

Новичок
13
1
вместо ввода давай улучшим эту систему. /showpass работает по ид, по ближайшему, если далеко то воркать не будет, так вот, юзни
bool result, Ped ped = getCharPlayerIsTargeting(Player player)
Оттуда доставай ид и показывай паспорт. ЗБС тактика
Ух cпасибо конечно но не думал еще над этим, понимаешь такое дело что на сервере человек много и когда подьезжают люди которым нужен твой паспорт(пд/фбр) их сразу несколько, и хотелось бы все таки вводом это все дело оформить...
 

Smeruxa

Известный
1,371
726
Ух cпасибо конечно но не думал еще над этим, понимаешь такое дело что на сервере человек много и когда подьезжают люди которым нужен твой паспорт(пд/фбр) их сразу несколько, и хотелось бы все таки вводом это все дело оформить...
точно?
Lua:
local result, ped = getCharPlayerIsTargeting(playerHandle)
if result then
    if isKeyJustPressed(VK_1) and not sampIsChatInputActive() then
        sampSendChat("/showpass "..(select(2, sampGetPlayerIdByCharHandle(ped))))
    end
end
 

#SameLine

Активный
421
38

Как за компилировать файл при этом оставляя формат lua, много видел таких скриптов но лично у меня компилируется на LUA.C​

 

#SameLine

Активный
421
38

Как за компилировать файл при этом оставляя формат lua, много видел таких скриптов но лично у меня компилируется на LUA.C​

Аааа.. я понял уже..

Кому тоже надо, ответ:

Нужно зайти в файл LUA.C за компилированный, и нажать на вкладку Файл, потом сохранить с расширением lua и всё..​

 

morti.

Участник
63
3
1622249844707.png

Вот написал код с использованием регулярных выражений, но почему-то на конце ноль не отображается, хотя другие числа отображаются
Lua:
function sampev.onServerMessage(color, text)
    if text:find('Рейс успешно завершен!') then
        reys = reys + 1
    end
    if  text:find('Заработано за рейс: (%d+%.%d+)') then
        zarabotok = zarabotok + text:match('(%d+%.%d+)')
    end
end
 

TLD_morozov

Новичок
27
3
Lua:
script_name('Версия 0.1')
script_author('Автор NoName')
script_description('fil')
require "lib.moonloader"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(2000) end
    sampAddChatMessage('Скрипт NoName',0xFFFF00)
    sampRegisterChatCommand('fil', fil)
    while true do
        wait(0)
    end
end

function fil()
    local peds = getAllChars()
    for _, v in pairs(peds) do
        local result, myid = sampGetPlayerIdByCharHandle(playerPed)
        local mx, my, mz = getCharCoordinates(playerPed)
        local x, y, z = getCharCoordinates(v)
        local distance = getDistanceBetweenCoords3d(mx, my, mz, x, y, z)
        local result, id = sampGetPlayerIdByCharHandle(v)
        if result and id ~= sampGetPlayerIdByCharHandle(PLAYER_PED) and distance < 10.0 then
            if id ~= myid then
                sampSendChat('/filscar' ..tonumber(id) '1' )
            end
        end
    end
end

Нужно сделать так сто бы скрипт находил ид игрока в авто и чтобы прописывалась команда /filscar (его ид) 1. Помогите пожалуйста
 

BARRY BRADLEY

Известный
711
176
Lua:
script_name('Версия 0.1')
script_author('Автор NoName')
script_description('fil')
require "lib.moonloader"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(2000) end
    sampAddChatMessage('Скрипт NoName',0xFFFF00)
    sampRegisterChatCommand('fil', fil)
    while true do
        wait(0)
    end
end

function fil()
    local peds = getAllChars()
    for _, v in pairs(peds) do
        local result, myid = sampGetPlayerIdByCharHandle(playerPed)
        local mx, my, mz = getCharCoordinates(playerPed)
        local x, y, z = getCharCoordinates(v)
        local distance = getDistanceBetweenCoords3d(mx, my, mz, x, y, z)
        local result, id = sampGetPlayerIdByCharHandle(v)
        if result and id ~= sampGetPlayerIdByCharHandle(PLAYER_PED) and distance < 10.0 then
            if id ~= myid then
                sampSendChat('/filscar' ..tonumber(id) '1' )
            end
        end
    end
end

Нужно сделать так сто бы скрипт находил ид игрока в авто и чтобы прописывалась команда /filscar (его ид) 1. Помогите пожалуйста
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(2000) end
    lua_thread.create(autoFunction)
    wait(-1)
end

function autoFunction()
    while true do
       local peds = getAllChars()
       for _, v in pairs(peds) do
           local result, myid = sampGetPlayerIdByCharHandle(playerPed)
           local mx, my, mz = getCharCoordinates(playerPed)
           local x, y, z = getCharCoordinates(v)
           local distance = getDistanceBetweenCoords3d(mx, my, mz, x, y, z)
           local result, id = sampGetPlayerIdByCharHandle(v)
           if result and id ~= sampGetPlayerIdByCharHandle(PLAYER_PED) and distance < 10.0 then
               if id ~= myid then
                   sampSendChat('/filscar ' ..tonumber(id) .. ' 1')
               end
           end
        end
    end
end
Но данный код будет флудить командой возле игрока (дистанция 10м). Так что нужно делать на проверку что команда уже вводилась