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

cheremuxa

Известный
430
200
Здравствуйте, помогите пожалуйста, нужно чтоб при вводе команды после неё был рандомный выбор sampSendChat текста который я буду вписывать
Код:
require "lib.moonloader"
function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  while true do
  wait(0)
    if isKeyJustPressed(VK_7) and not sampIsChatInputActive() then
      sampSendChat("/sleep")
      wait(0)
      sampSendChat("123")
    end
  end
  end
рандомный текст сообщения в чат?

Lua:
require "lib.moonloader"

randomtext = {
'Что-то тут',
'Что-то здесь',
'Что-то там',
'Или тут'
}

function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  while true do
  wait(0)
    if isKeyJustPressed(VK_7) and not sampIsChatInputActive() then
      sampSendChat("/sleep")
      wait(250)
      sampSendChat(randomtext[random(1, #randomtext)]) -- выведет рандом сообщение из таблицы randomtext
    end
  end
  end
 
function random(min, max)
    kf = math.random(min, max)
    math.randomseed(os.time() * kf)
    rand = math.random(min, max)
    return tonumber(rand)
end
 
  • Нравится
Реакции: advancerp и Roku

danywa

Активный
358
49
Как сделать если игрок в чат написал "что делаешь" то ты пишешь в ответ "ничего"
 

Solyanik

Известный
14
7
При отправке сообщения в вк через апи, не отправляются пробелы, как решить, какая нужна кодировка?
 

cheremuxa

Известный
430
200
При отправке сообщения в вк через апи, не отправляются пробелы, как решить, какая нужна кодировка?
записываешь сообщение которое нужно отправить например smska = 'мой текст с пробелами'

Lua:
smska = 'мой текст с пробелами'
smska = string.gsub(smska, "%s+", '%%20')
-- дальше отправляешь в вк
 
  • Нравится
Реакции: Solyanik

MR_Lua

Участник
41
0
как сделать проверку на оружие? Если допустим в руках deagle - отыгровка дигла
 

Ettoress

Новичок
2
0
как написать код для спавна /spawn и ты на спавне который ты указал в /setspawn на Arizona RP // пока я вот что напесал
function main()
while not isSampAvailable() do wait(100) end
sampRegisterChatCommand('spawnl',command)
while true do wait(0) end end
что делать дальше?
 
Последнее редактирование:

MR_Lua

Участник
41
0
В чем проблема?
Lua:
if imgui.Checkbox(u8'Отыгровка оружия в руках', gun) then
    if gun.v then
    weapon = getCurrentCharWeapon(playerPed)
      if weapon == 24 then
        sampSendChat('/me спрятал оружие')
      end
    end
end
 

danywa

Активный
358
49
в
в чат не выводит сообщение
В чем проблема?
Lua:
if imgui.Checkbox(u8'Отыгровка оружия в руках', gun) then
    if gun.v then
    weapon = getCurrentCharWeapon(playerPed)
      if weapon == 24 then
        sampSendChat('/me спрятал оружие')
      end
    end
end
uncoding подключил?
 
Последнее редактирование:

#Rewzeisch

Известный
121
10
как вывести корды в чат? это не работает

Lua:
function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("cordi", check)
end

function check(arg)
    local x,y,z = getCharCoordinates(PLAYER_PED)
    sampAddChatMessage("cordi"..x,y,z, -1)
end




Lua:
function main()
  repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("cordi", check)
while true do wait(0)
        check()
    end
end

function check()
    local x,y,z = getCharCoordinates(PLAYER_PED)
    sampAddChatMessage("Координаты: " .. x .. ", " .. y .. ", " .. z)
end

Проверяй
 

Receiver

🥩 Передай meat, всё в скип, я в темпе
Проверенный
595
807
Добрый день! Попрошу вас объяснить, как работает данный код, а конкретнее обход игроков?
Lua:
function BeginToPoint(to_x, to_y, slot2, slot3, slot4, slot5, slot6, slot7, slot8, slot9)
    slot10 = false

    repeat
        wait(0)

        slot11 = false
        x, y, z = getCharCoordinates(PLAYER_PED)
        slot15 = math.rad(getHeadingFromVector2d(to_x - x, to_y - y))
        dist = getDistanceBetweenCoords3d(to_x, to_y, slot2, x, y, slot2)

        for slot19 = -0.5, 2, 0.3 do
            for slot23 = -0.4, 0.4, 0.1 do
                sampCreate3dTextEx(1, "A", 4294967295.0, slot24, slot25, z + slot19, 5, true, -1, -1)

                boolUpClear = isLineOfSightClear(x, y, z + slot19, slot24, slot25, z + slot19, true, true, false, true, false)
                PedLine, _ = findAllRandomCharsInSphere(slot24, y + 2 * math.sin(slot15 + 1.55 + slot23), z, 1.5, false, true)

                if boolUpClear == false or PedLine then
                    break
                end
            end

            if PedLine then
                break
            end

            if boolUpClear and slot19 > -0.5 then
                slot11 = true

                break
            elseif boolUpClear and slot19 == -0.5 then
                break
            end
        end

        if boolUpClear == false or PedLine then
            for slot19 = 0.1, 2, 0.1 do
                slot20, slot21, slot22 = getCharCoordinates(PLAYER_PED)

                if isLineOfSightClear(slot20, slot21, slot22, slot23, slot21 + 2 * math.sin(slot15 + 1.2 - slot19), slot22 - 0.5, true, true, true, true, false) then
                    setCameraPositionUnfixed(-0.3, math.rad(getHeadingFromVector2d(slot20 + 2 * math.cos(slot15 + 1.2 - slot19) - slot20, slot21 + 2 * math.sin(slot15 + 1.2 - slot19) - slot21)) + 4.7)

                    break
                end

                if isLineOfSightClear(slot20, slot21, slot22, slot27, slot21 + 2 * math.sin(slot15 + 1.8 + slot19), slot22 - 0.5, true, true, true, true, false) then
                    setCameraPositionUnfixed(-0.3, math.rad(getHeadingFromVector2d(slot20 + 2 * math.cos(slot15 + 1.8 + slot19) - slot20, slot21 + 2 * math.sin(slot15 + 1.8 + slot19) - slot21)) + 4.7)

                    break
                end
            end
        else
            setCameraPositionUnfixed(-0.3, slot15 + 4.7)
        end

        setGameKeyState(1, -255)

        if slot4 and dist > 2 then
            if math.ceil(slot16) == math.floor(getHeadingFromVector2d(to_x - x, to_y - y)) and dist > 10 and getCharSpeed(PLAYER_PED) > 6.1 and getCharSpeed(PLAYER_PED) < 7 or slot11 and slot17 == slot18 then
                setGameKeyState(14, 255)
            elseif dist > 10 then
                setGameKeyState(16, 255)
            end
        end

        slot16 = os.time()

        if slot8 and dist < slot3 then
            repeat
                wait(400)

                boolSatiety = FuncNeedSatiety()
            until os.time() - slot16 > 10 or boolSatiety or enabled == false

            return
        end

        if slot6 and dist < slot3 then
            KeyDownMemory()

            repeat
                wait(500)
            until os.time() - slot16 > 15 or Success or enabled == false

            return
        end

        if slot7 and dist < slot3 then
            repeat
                wait(500)
            until os.time() - slot16 > 15 or Success == false or enabled == false

            return
        end

        if slot5 then
            slot10, _ = findAllRandomCharsInSphere(to_x, to_y, slot2, 3, false, true)
        end
    until slot5 and (slot10 or enabled == false or slot7 and (Success == false or slot6 and (Success or slot9 and dist < slot3)))
end

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Привет всем! Помогите пожалуйста. Надо сделать в скрипте отыгровку инвайта. Только зацкилить не получается. Отправляется 1 сообщения в чат. А остальные не хотят. Бинд в самом конце. А та-же помогите сделать что-бы надо было нажать на человека, только потом проиграется скрипт. Как в mvdhelper​
Lua:
script_name('GRP | LeadHelper')
script_authors("Jesus_Mironenko", "Hiyantan_Miyadzaki")
script_description('Новый биндер для Grand Role Play')
script_version('0.1')

require "lib.moonloader"
local keys = require "vkeys"

local tag = "{1E90FF}[LeadHelper]"
local main_color = 0x5A90CE
local main_color_text = "{1E90FF}"
local white_color = "{FFFFFF}"


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


    sampAddChatMessage(tag .. " {FFFFFF}Скрипт успешно загружен. Авторы: {1E90FF}Jesus_Mironenko {FFFFFF}и {1E90FF}Hiyantan_Miyadzaki.", 0xADFF2F)



    ---Команды скрипта---

    sampRegisterChatCommand("lh", cmd_lh)
    sampRegisterChatCommand("команды", cmd_command)
    sampRegisterChatCommand("linvite", cmd_linvite)
    sampRegisterChatCommand("luninvite", cmd_luninvite)
    sampRegisterChatCommand("lsetskin", cmd_lsetskin)
    sampRegisterChatCommand("lgnews", cmd_lgnews)
    sampRegisterChatCommand("loffuninvite", cmd_loffuninvite)
    sampRegisterChatCommand("lgiverank", cmd_lgiverank)
    sampRegisterChatCommand("lfwarn", cmd_lfwarn)
    sampRegisterChatCommand("lfunwarn", cmd_lfunwarn)
    sampRegisterChatCommand("lblacklist", cmd_lblacklist)
    sampRegisterChatCommand("lunblacklist", cmd_lunblacklist)
    sampRegisterChatCommand("lmap", cmd_lmap)


    while true do
        wait(0)

    end
end

function cmd_lh()

    sampShowDialog(1647, "Главное меню {FF0000}[В РАЗРАБОТКЕ!]", string.format("Команды \nЛекции \nО скрипте"), "Выбрать", "Закрыть", 2)

end

function cmd_command()

    sampShowDialog(1648, "Команды", string.format("{1E90FF}/linvite {FFFFFF}- принять в организацию \n{1E90FF}/luninvite {FFFFFF}- уволить из организации \n{1E90FF}/lsetskin {FFFFFF}- изменить скин \n{1E90FF}/lgnews {FFFFFF}- гос. новости \n{1E90FF}/loffuninvite {FFFFFF}- уволить оффлайн \n{1E90FF}/lgiverank {FFFFFF}- изменить ранг \n{1E90FF}/lfwarn {FFFFFF}- выдать выговор \n{1E90FF}/lfunwarn {FFFFFF}- снять выговор \n{1E90FF}/lblacklist {FFFFFF}- занести в чёрный список \n{1E90FF}/lunblacklist {FFFFFF}- вынести из чёрного  списка \n{1E90FF}/lmap {FFFFFF}- карта сотрудников \n\n\n{FFFFFF}Автор команд: {1E90FF}Jesus_Mironenko"), "Принять", "Закрыть", 0)                                                                                                                                                                                                                                           

end

function cmd_linvite()

    sampSendChat("/do В левой руке кейс.")
        wait(2000)
    sampSendChat("/me взял кейс в две руки, затем нажал на кнопку")
        wait(2000)
    sampSendChat("/do Кейс раскрылся.")
        wait(2000)
    sampSendChat("/me достал из кейса пакет с формой и бейджиком")
        wait(2000)
    sampSendChat("/do Пакет в руке.")
        wait(2000)
    sampSendChat("/todo В этом пакете Ваша форма и бейджик* передавая пакет человеку напротив")
        wait(2000)
    sampSendChat("/invite [ID]")
        wait(2000)
    sampSendChat("/me закрыл кейс обеими руками, затем взял кейс в левую руку")
        wait(2000)
    while true do
        wait(0)
    end
end
Lua:
function cmd_linvite()
    lua_thread.create(function()
        sampSendChat("/do В левой руке кейс.")
            wait(2000)
        sampSendChat("/me взял кейс в две руки, затем нажал на кнопку")
            wait(2000)
        sampSendChat("/do Кейс раскрылся.")
            wait(2000)
        sampSendChat("/me достал из кейса пакет с формой и бейджиком")
            wait(2000)
        sampSendChat("/do Пакет в руке.")
            wait(2000)
        sampSendChat("/todo В этом пакете Ваша форма и бейджик* передавая пакет человеку напротив")
            wait(2000)
        sampSendChat("/invite [ID]")
            wait(2000)
        sampSendChat("/me закрыл кейс обеими руками, затем взял кейс в левую руку")
            wait(2000)
    end)
end