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

Cosmo

Известный
Друг
653
2,722
не правильно понял. Я же хочу включать и выключать его по команде, а не просто выключать
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(2000) end

    sampRegisterChatCommand('test', function()
       act = not act
       sampAddChatMessage(string.format(act and 'Включено' or 'Выключено'), -1)
    end)

    while true do
        if act then
            printStringNow("Im Alive!", 100)
        end
    wait(0)
    end
end
как сделать проверку, есть ли машина в зоне стрима?
Lua:
-- проверка именно по ID машины на существование
result, car = sampGetCarHandleBySampVehicleId(id)
if result then
    printStringNow('In Stream!', 100)
end

-- Счётчик всех машин в стриме
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(2000) end

    while true do
        cars = {}
        for i = 1, 1999 do
            result, car = sampGetCarHandleBySampVehicleId(i)
            if result then
                table.insert(cars, i)
            end
        end
        printStringNow('Cars in stream: '..#cars, 100)
    wait(0)
    end
end
 
Последнее редактирование:

DobrayaPchela

Участник
79
8
Почему это у меня не работает, и добавьте включение и отключение скрипта по команде, потому что я кривой
Lua:
local as = {
  STOP   = 0,
  PLAY   = 1,
  PAUSE  = 2,
  RESUME = 3
}

local vol = 10.0
timer = os.clock()

function main()
  while not isSampAvailable() do wait(0) end
  while not isPlayerPlaying(PLAYER_HANDLE) do wait(0) end
  local sound = loadAudioStream(getWorkingDirectory()..'\\resource\\audio\\fist.mp3')
  wait(3000)
  setAudioStreamState(sound, as.PLAY)
  setAudioStreamVolume(sound, vol)
  while true do wait(0)
    wp = getCurrentCharWeapon(PLAYER_PED)
    if wp == 0 then
      if getAudioStreamState(sound) ~= 1 then setAudioStreamState(sound, as.PLAY) end
      setAudioStreamVolume(sound, 10.0)
      vol = os.clock() + 5
    else
      q = vol - os.clock()
      if q > 0 then
        setAudioStreamVolume(sound, q * 2)
      else
        setAudioStreamState(sound, as.STOP)
      end
    end
  end
end
 

Fott

Простреленный
3,461
2,374
Почему это у меня не работает, и добавьте включение и отключение скрипта по команде, потому что я кривой
/activ
Lua:
local as = {
  STOP   = 0,
  PLAY   = 1,
  PAUSE  = 2,
  RESUME = 3
}

local vol = 10.0
timer = os.clock()

function main()
  while not isSampAvailable() do wait(0) end
  while not isPlayerPlaying(PLAYER_HANDLE) do wait(0) end
  local sound = loadAudioStream(getWorkingDirectory()..'\\resource\\audio\\fist.mp3')
  wait(3000)
  setAudioStreamState(sound, as.PLAY)
  setAudioStreamVolume(sound, vol)
  while true do wait(0)
    wp = getCurrentCharWeapon(PLAYER_PED)
    if wp == 0 then
      if getAudioStreamState(sound) ~= 1 then setAudioStreamState(sound, as.PLAY) end
      setAudioStreamVolume(sound, 10.0)
      vol = os.clock() + 5
    else
      q = vol - os.clock()
      if q > 0 then
        setAudioStreamVolume(sound, q * 2)
      else
        setAudioStreamState(sound, as.STOP)
      end
    end
  end
end
Lua:
local as = {
  STOP   = 0,
  PLAY   = 1,
  PAUSE  = 2,
  RESUME = 3
}

local vol = 10.0
timer = os.clock()

function main()
  while not isSampAvailable() do wait(0) end
  while not isPlayerPlaying(PLAYER_HANDLE) do wait(0) end
  sampRegisterChatCommand(activ, activate)
  local sound = loadAudioStream(getWorkingDirectory()..'\\resource\\audio\\fist.mp3')
  wait(3000)
  setAudioStreamState(sound, as.PLAY)
  setAudioStreamVolume(sound, vol)
  while true do
  wait(0)
  if active then
    wp = getCurrentCharWeapon(PLAYER_PED)
    if wp == 0 then
      if getAudioStreamState(sound) ~= 1 then setAudioStreamState(sound, as.PLAY) end
      setAudioStreamVolume(sound, 10.0)
      vol = os.clock() + 5
    else
      q = vol - os.clock()
      if q > 0 then
        setAudioStreamVolume(sound, q * 2)
      else
        setAudioStreamState(sound, as.STOP)
      end
    end
  end
end
end
function activate(arg)
active = not active
end
 

Мира

Участник
455
9
А сможете сделать мне пример, чтобы данная песня играла?
file:///C:/Users/Александр/Downloads/GOODY%20-%20Снежная%20Королева.mp3
Пожалуйста!
DH:
require "lib.moonloader"
local key = require 'vkeys'

local tag = "{009327}[Damiano Helper] {FFFFFF}"

function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage(tag.."Helper for Damiano {009327}by Mira Damiano", -1)
    repeat wait(0) until isSampAvailable()
    while true do
        wait(0)
        if isKeyJustPressed(110)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSetChatInputEnabled(true)
            sampSetChatInputText("/uninvite  Выселен!")
            sampSetChatInputCursor(10)
        end
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_1)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/faminvite "..id)
            end
        end
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_2)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/invite "..id)
                    sampSendChat("/me выдал бандану человеку напротив")
            end
        end
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_3)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/giverank "..id.." 7")
                    sampSendChat("/me обозначил место в банде")
            end
        end
        if isKeyJustPressed(106)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/usedrugs 3")
        end
        if isKeyJustPressed(109)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/mask")
        end
        if isKeyJustPressed(107)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/armour")
            end
    end
end

function sampSetChatInputCursor(start, finish)
    local finish = finish or start
    local start, finish = tonumber(start), tonumber(finish)
    local mem = require 'memory'
    local chatInfoPtr = sampGetInputInfoPtr()
    local chatBoxInfo = getStructElement(chatInfoPtr, 0x8, 4)
    mem.setint8(chatBoxInfo + 0x11E, start)
    mem.setint8(chatBoxInfo + 0x119, finish)
    return true
end
 

Fott

Простреленный
3,461
2,374
А сможете сделать мне пример, чтобы данная песня играла?

Пожалуйста!
DH:
require "lib.moonloader"
local key = require 'vkeys'

local tag = "{009327}[Damiano Helper] {FFFFFF}"

function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage(tag.."Helper for Damiano {009327}by Mira Damiano", -1)
    repeat wait(0) until isSampAvailable()
    while true do
        wait(0)
        if isKeyJustPressed(110)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSetChatInputEnabled(true)
            sampSetChatInputText("/uninvite  Выселен!")
            sampSetChatInputCursor(10)
        end
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_1)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/faminvite "..id)
            end
        end
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_2)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/invite "..id)
                    sampSendChat("/me выдал бандану человеку напротив")
            end
        end
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_3)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/giverank "..id.." 7")
                    sampSendChat("/me обозначил место в банде")
            end
        end
        if isKeyJustPressed(106)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/usedrugs 3")
        end
        if isKeyJustPressed(109)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/mask")
        end
        if isKeyJustPressed(107)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/armour")
            end
    end
end

function sampSetChatInputCursor(start, finish)
    local finish = finish or start
    local start, finish = tonumber(start), tonumber(finish)
    local mem = require 'memory'
    local chatInfoPtr = sampGetInputInfoPtr()
    local chatBoxInfo = getStructElement(chatInfoPtr, 0x8, 4)
    mem.setint8(chatBoxInfo + 0x11E, start)
    mem.setint8(chatBoxInfo + 0x119, finish)
    return true
end
Сделай через ссылку и все
Lua:
local sound = loadAudioStream('https://www.dropbox.com/s/ejvl323vprfx26l/warning.mp3?dl=1') - в начало и ссылку заменяешь на свою, просто залей трек
local ev = require "moonloader".audiostream_state - в начало
--- там где должно играть
setAudioStreamState(sound, ev.PLAY)
 

DobrayaPchela

Участник
79
8
з
Lua:
local as = {
  STOP   = 0,
  PLAY   = 1,
  PAUSE  = 2,
  RESUME = 3
}

local vol = 10.0
timer = os.clock()

function main()
  while not isSampAvailable() do wait(0) end
  while not isPlayerPlaying(PLAYER_HANDLE) do wait(0) end
  sampRegisterChatCommand(activ, activate)
  local sound = loadAudioStream(getWorkingDirectory()..'\\resource\\audio\\fist.mp3')
  wait(3000)
  setAudioStreamState(sound, as.PLAY)
  setAudioStreamVolume(sound, vol)
  while true do
  wait(0)
  if active then
    wp = getCurrentCharWeapon(PLAYER_PED)
    if wp == 0 then
      if getAudioStreamState(sound) ~= 1 then setAudioStreamState(sound, as.PLAY) end
      setAudioStreamVolume(sound, 10.0)
      vol = os.clock() + 5
    else
      q = vol - os.clock()
      if q > 0 then
        setAudioStreamVolume(sound, q * 2)
      else
        setAudioStreamState(sound, as.STOP)
      end
    end
  end
end
end
function activate(arg)
active = not active
end
звук проигрывается только один раз
 

Мира

Участник
455
9
Сделай через ссылку и все
Lua:
local sound = loadAudioStream('https://www.dropbox.com/s/ejvl323vprfx26l/warning.mp3?dl=1') - в начало и ссылку заменяешь на свою, просто залей трек
local ev = require "moonloader".audiostream_state - в начало
--- там где должно играть
setAudioStreamState(sound, ev.PLAY)
DH:
require "lib.moonloader"
local key = require 'vkeys'

local tag = "{009327}[Damiano Helper] {FFFFFF}"

local sound = loadAudioStream('file:///C:/Users/Александр/Downloads/GOODY%20-%20Снежная%20Королева.mp3')
local ev = require "moonloader".audiostream_state

function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage(tag.."Helper for Damiano {009327}by Mira Damiano", -1)
    repeat wait(0) until isSampAvailable()
    while true do
        wait(0)
        if isKeyJustPressed(VK_0)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            setAudioStreamState(sound, ev.PLAY)
        end
        if isKeyJustPressed(110)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSetChatInputEnabled(true)
            sampSetChatInputText("/uninvite  Выселен!")
            sampSetChatInputCursor(10)
        end
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_1)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/faminvite "..id)
            end
        end
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_2)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/invite "..id)
                    sampSendChat("/me выдал бандану человеку напротив")
            end
        end
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_3)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/giverank "..id.." 7")
                    sampSendChat("/me обозначил место в банде")
            end
        end
        if isKeyJustPressed(106)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/usedrugs 3")
        end
        if isKeyJustPressed(109)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/mask")
        end
        if isKeyJustPressed(107)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/armour")
            end
    end
end

function sampSetChatInputCursor(start, finish)
    local finish = finish or start
    local start, finish = tonumber(start), tonumber(finish)
    local mem = require 'memory'
    local chatInfoPtr = sampGetInputInfoPtr()
    local chatBoxInfo = getStructElement(chatInfoPtr, 0x8, 4)
    mem.setint8(chatBoxInfo + 0x11E, start)
    mem.setint8(chatBoxInfo + 0x119, finish)
    return true
end
 

NikitaSokol

Активный
206
63
DH:
require "lib.moonloader"
local key = require 'vkeys'

local tag = "{009327}[Damiano Helper] {FFFFFF}"

local sound = loadAudioStream('file:///C:/Users/Александр/Downloads/GOODY%20-%20Снежная%20Королева.mp3')
local ev = require "moonloader".audiostream_state

function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage(tag.."Helper for Damiano {009327}by Mira Damiano", -1)
    repeat wait(0) until isSampAvailable()
    while true do
        wait(0)
        if isKeyJustPressed(VK_0)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            setAudioStreamState(sound, ev.PLAY)
        end
        if isKeyJustPressed(110)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSetChatInputEnabled(true)
            sampSetChatInputText("/uninvite  Выселен!")
            sampSetChatInputCursor(10)
        end
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_1)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/faminvite "..id)
            end
        end
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_2)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/invite "..id)
                    sampSendChat("/me выдал бандану человеку напротив")
            end
        end
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_3)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/giverank "..id.." 7")
                    sampSendChat("/me обозначил место в банде")
            end
        end
        if isKeyJustPressed(106)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/usedrugs 3")
        end
        if isKeyJustPressed(109)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/mask")
        end
        if isKeyJustPressed(107)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/armour")
            end
    end
end

function sampSetChatInputCursor(start, finish)
    local finish = finish or start
    local start, finish = tonumber(start), tonumber(finish)
    local mem = require 'memory'
    local chatInfoPtr = sampGetInputInfoPtr()
    local chatBoxInfo = getStructElement(chatInfoPtr, 0x8, 4)
    mem.setint8(chatBoxInfo + 0x11E, start)
    mem.setint8(chatBoxInfo + 0x119, finish)
    return true
end
попробуй убери file:///
 
  • Нравится
Реакции: Мира

MR_Lua

Участник
41
0
Вопросик. Мне нужно чтобы можно было выбрать и R и Q, а то не могу додуматься. Только на R работает, а как реализовать обеклавиши?
Lua:
sampAddChatMessage('{2ce30b}[MafiaTools]: Если человек подходит, то ножмите R', 23412)
    wait(800)
    sampAddChatMessage('{f50000}[MafiaTools]: Если человек не подходит, нажмите Q', 23412)
while not wasKeyPressed(key.VK_R)
do wait(0) end
sampSendChat("Отлично!")
 

CaJlaT

07.11.2024 14:55
Модератор
2,830
2,660
Вопросик. Мне нужно чтобы можно было выбрать и R и Q, а то не могу додуматься. Только на R работает, а как реализовать обеклавиши?
Lua:
sampAddChatMessage('{2ce30b}[MafiaTools]: Если человек подходит, то ножмите R', 23412)
    wait(800)
    sampAddChatMessage('{f50000}[MafiaTools]: Если человек не подходит, нажмите Q', 23412)
while not wasKeyPressed(key.VK_R)
do wait(0) end
sampSendChat("Отлично!")
Lua:
while not wasKeyPressed(key.VK_R) or not wasKeyPressed(key.VK_Q) do wait(0) end
if wasKeyPressed(key.VK_R) then sampAddChatMessage('Вы нажали R.', -1)
elseif wasKeyPressed(key.VK_Q) then sampAddChatMessage('Вы нажали Q.', -1) end