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

Forevor

Известный
77
5
Lua:
if akid == '1' then 
            EmulateKey(VK_Y, true)
        wait(20)
        sampSendDialogResponse(--[[int]] 43, --[[int]] 1, --[[int]] 4, --[[string]] -1)
        wait(20)
            akid = nil
        end
Не реагирует на диалог , он открывается, и дальше ничего не происходит, если закрыть диалог спамит эмуляцией
 

trefa

Известный
Всефорумный модератор
2,097
1,231
Lua:
if akid == '1' then
            EmulateKey(VK_Y, true)
        wait(20)
        sampSendDialogResponse(--[[int]] 43, --[[int]] 1, --[[int]] 4, --[[string]] -1)
        wait(20)
            akid = nil
        end
Не реагирует на диалог , он открывается, и дальше ничего не происходит, если закрыть диалог спамит эмуляцией
Ну потому что ты 1 объявил строкой
 

штейн

Известный
Проверенный
1,001
687
Lua:
data = LIP.load('moonloader\\config\\hitman.ini')
    while not data do data = LIP.load('moonloader\\config\\hitman.ini') end
    bool =
    {
        {
            imgui.ImBool(data.options.sid), u8'Кастомный /id'
        },
        {
            imgui.ImBool(data.options.id), u8'ID после ника в чате'
        },
        {
            imgui.ImBool(data.options.soveti), u8'Советы в чат'
        },
        {
            imgui.ImBool(data.options.stream), u8'Игроки в зоне стрима'
        },
        {
            imgui.ImBool(data.options.messages), u8'Сообщения скрипта в чат'
        },
        {
            imgui.ImBool(data.options.hotkeys), u8'Горячие клавиши'
        },
        {
            imgui.ImBool(data.options.autoscr), u8'Автоматический скриншот после выполнения заказа'
        },
        {
            imgui.ImBool(data.options.autoupd), u8'Автоматическое обновление скрипта'
        },
    }

приветик, короче вылетает гта тупа из-за него, че делать

пробовал ещё так, но толку 0

Lua:
    data = LIP.load('moonloader\\config\\hitman.ini')
    while not data do data = LIP.load('moonloader\\config\\hitman.ini') end
    bool =
    {
        {
            imgui.ImBool(data.options.sid), u8'Кастомный /id',
        },
        {
            imgui.ImBool(data.options.id), u8'ID после ника в чате',
        },
        {
            imgui.ImBool(data.options.soveti), u8'Советы в чат',
        },
        {
            imgui.ImBool(data.options.stream), u8'Игроки в зоне стрима',
        },
        {
            imgui.ImBool(data.options.messages), u8'Сообщения скрипта в чат',
        },
        {
            imgui.ImBool(data.options.hotkeys), u8'Горячие клавиши',
        },
        {
            imgui.ImBool(data.options.autoscr), u8'Автоматический скриншот после выполнения заказа',
        },
        {
            imgui.ImBool(data.options.autoupd), u8'Автоматическое обновление скрипта'
        },
    };
 

Hatiko

Известный
Проверенный
1,470
612
Можно ли в одну функцию засунуть несколько ссылок. Также, можно ли отследить статусы загрузок вне функции downloadUrlToFile.
И можете пожалуйста показать код, который осуществляет копирование файла (изображения). Мне ранее сказали, что можно через io.open.
 
Последнее редактирование:

trefa

Известный
Всефорумный модератор
2,097
1,231
Как исправить, если при использвании цветов в textdraw (~r~), textdraw идёт вниз. (Нужно в строчку)
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,484
Можно ли в одну функцию засунуть несколько ссылок. Также, можно ли отследить статусы загрузок вне функции downloadUrlToFile.
И можете пожалуйста показать код, который осуществляет копирование файла (изображения). Мне ранее сказали, что можно через io.open.

Lua:
local dlstatus = require('moonloader').download_status
local vk = require 'vkeys'
function download_handler(id, status, p1, p2)
  if stop_downloading then
    stop_downloading = false
    download_id = nil
    print('Загрузка отменена.')
    return false -- прервать загрузку
  end
  if status == dlstatus.STATUS_DOWNLOADINGDATA then
    print(string.format('Загружено %d из %d.', p1, p2))
  elseif status == dlstatus.STATUS_ENDDOWNLOADDATA then
    print('Загрузка завершена.')
  end
end
function main()
  print('Нажмите F1, чтобы начать загрузку файла.')
  while true do
    wait(0)
    if wasKeyPressed(vk.VK_F1) and not download_id then
      local url = 'http://nonexistentfilehosting.com/nonexistentfile.dat'
      local file_path = getWorkingDirectory() .. '/downloads/file.dat'
      download_id = downloadUrlToFile(url, file_path, download_handler)
      print('Загрузка начата. Нажмите F2, чтобы отменить её.')
    elseif wasKeyPressed(vk.VK_F2) and download_id then
      stop_downloading = true
    end
  end
end
 

wazet

Новичок
8
0
Ребята, помогите добавить комманду выключения цикла на /adoff
Lua:
local hook = require 'lib.samp.events'
require 'lib.moonloader'

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do
    wait(100)
    end
    sampRegisterChatCommand("adon", adon)
    wait(-1)
end

function adon()
    lua_thread.create(
    function()
        sampSendChat("/f бу")
        wait(5000)
                return function()
                end
    end)
end
 

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
            while not isSampAvailable do wait(100) end
            for textdrawid = 100, 1000 do
            if sampTextdrawIsExists(textdrawid) then
            local X, Y = sampTextdrawGetPos(textdrawid)
            local box, color, sizeX, sizeY = sampTextdrawGetBoxEnabledColorAndSize(textdrawid)
            sampTextdrawSetBoxColorAndSize(textdrawid, box, 0xffe975f7, sizeX, sizeY)
        end
    end
end
Как сделать так, что когда тектдрав изменил свой id скрипт перезагрузился-обновился хз как называется но цвет крч тектдрава поменялся
Просто при смене id текстдрава цвет возвращается на стандартный серверный, вместо моего который в скрипте
 

kektop1

Новичок
62
12
Этот урод загружается, но не работает, помогите
Lua:
require 'lib.moonloader'
local Matrix3X3 = require 'matrix3x3'

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

function fast_funcs_work()
    if not isSampfuncsConsoleActive() and not sampIsChatInputActive() and not sampIsDialogActive() and not isPauseMenuActive() then
        local time = os.clock() * 1000
        if isKeyJustPressed(VK_F3) then -- suicide
            if not isCharInAnyCar(playerPed) then
                setCharHealth(playerPed, 0.0)
            else
                setCarHealth(storeCarCharIsInNoSave(playerPed), 0.0)
            end
        end

        if isKeyJustPressed(VK_OEM_5) then -- unfreeze
            if isCharInAnyCar(playerPed) then
                freezeCarPosition(storeCarCharIsInNoSave(playerPed), false)
            else
                setPlayerControl(playerHandle, true)
                freezeCharPosition(playerPed, false)
                clearCharTasksImmediately(playerPed)
            end
            restoreCameraJumpcut()
        end

        if isKeyJustPressed(VK_B) then -- hop
            if isCharInAnyCar(playerPed) then
                local cVecX, cVecY, cVecZ = getCarSpeedVector(storeCarCharIsInNoSave(playerPed))
                if cVecZ < 7.0 then applyForceToCar(storeCarCharIsInNoSave(playerPed), 0.0, 0.0, 0.1, 0.0, 0.0, 0.0) end
            else
                local pVecX, pVecY, pVecZ = getCharVelocity(playerPed)
                if pVecZ < 7.0 then setCharVelocity(playerPed, 0.0, 0.0, 10.0) end
            end
        end

        if isKeyJustPressed(VK_BACK) and isCharInAnyCar(playerPed) then -- turn back
            local cVecX, cVecY, cVecZ = getCarSpeedVector(storeCarCharIsInNoSave(playerPed))
            applyForceToCar(storeCarCharIsInNoSave(playerPed), -cVecX / 25, -cVecY / 25, -cVecZ / 25, 0.0, 0.0, 0.0)
            local x, y, z, w = getVehicleQuaternion(storeCarCharIsInNoSave(playerPed))
            local matrix = {convertQuaternionToMatrix(w, x, y, z)}
            matrix[1] = -matrix[1]
            matrix[2] = -matrix[2]
            matrix[4] = -matrix[4]
            matrix[5] = -matrix[5]
            matrix[7] = -matrix[7]
            matrix[8] = -matrix[8]
            local w, x, y, z = convertMatrixToQuaternion(matrix[1], matrix[2], matrix[3], matrix[4], matrix[5], matrix[6], matrix[7], matrix[8], matrix[9])
            setVehicleQuaternion(storeCarCharIsInNoSave(playerPed), x, y, z, w)
        end

        if isKeyJustPressed(VK_N) and isCharInAnyCar(playerPed) then -- fast exit
            local posX, posY, posZ = getCarCoordinates(storeCarCharIsInNoSave(playerPed))
            warpCharFromCarToCoord(playerPed, posX, posY, posZ)
        end

        if isCharPlayingAnim(playerPed, 'KO_SKID_BACK') or isCharPlayingAnim(playerPed, 'FALL_COLLAPSE') then -- no fall
            clearCharTasksImmediately(playerPed)
        end
    end
end
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
Этот урод загружается, но не работает, помогите
Lua:
require 'lib.moonloader'
local Matrix3X3 = require 'matrix3x3'

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

function fast_funcs_work()
    if not isSampfuncsConsoleActive() and not sampIsChatInputActive() and not sampIsDialogActive() and not isPauseMenuActive() then
        local time = os.clock() * 1000
        if isKeyJustPressed(VK_F3) then -- suicide
            if not isCharInAnyCar(playerPed) then
                setCharHealth(playerPed, 0.0)
            else
                setCarHealth(storeCarCharIsInNoSave(playerPed), 0.0)
            end
        end

        if isKeyJustPressed(VK_OEM_5) then -- unfreeze
            if isCharInAnyCar(playerPed) then
                freezeCarPosition(storeCarCharIsInNoSave(playerPed), false)
            else
                setPlayerControl(playerHandle, true)
                freezeCharPosition(playerPed, false)
                clearCharTasksImmediately(playerPed)
            end
            restoreCameraJumpcut()
        end

        if isKeyJustPressed(VK_B) then -- hop
            if isCharInAnyCar(playerPed) then
                local cVecX, cVecY, cVecZ = getCarSpeedVector(storeCarCharIsInNoSave(playerPed))
                if cVecZ < 7.0 then applyForceToCar(storeCarCharIsInNoSave(playerPed), 0.0, 0.0, 0.1, 0.0, 0.0, 0.0) end
            else
                local pVecX, pVecY, pVecZ = getCharVelocity(playerPed)
                if pVecZ < 7.0 then setCharVelocity(playerPed, 0.0, 0.0, 10.0) end
            end
        end

        if isKeyJustPressed(VK_BACK) and isCharInAnyCar(playerPed) then -- turn back
            local cVecX, cVecY, cVecZ = getCarSpeedVector(storeCarCharIsInNoSave(playerPed))
            applyForceToCar(storeCarCharIsInNoSave(playerPed), -cVecX / 25, -cVecY / 25, -cVecZ / 25, 0.0, 0.0, 0.0)
            local x, y, z, w = getVehicleQuaternion(storeCarCharIsInNoSave(playerPed))
            local matrix = {convertQuaternionToMatrix(w, x, y, z)}
            matrix[1] = -matrix[1]
            matrix[2] = -matrix[2]
            matrix[4] = -matrix[4]
            matrix[5] = -matrix[5]
            matrix[7] = -matrix[7]
            matrix[8] = -matrix[8]
            local w, x, y, z = convertMatrixToQuaternion(matrix[1], matrix[2], matrix[3], matrix[4], matrix[5], matrix[6], matrix[7], matrix[8], matrix[9])
            setVehicleQuaternion(storeCarCharIsInNoSave(playerPed), x, y, z, w)
        end

        if isKeyJustPressed(VK_N) and isCharInAnyCar(playerPed) then -- fast exit
            local posX, posY, posZ = getCarCoordinates(storeCarCharIsInNoSave(playerPed))
            warpCharFromCarToCoord(playerPed, posX, posY, posZ)
        end

        if isCharPlayingAnim(playerPed, 'KO_SKID_BACK') or isCharPlayingAnim(playerPed, 'FALL_COLLAPSE') then -- no fall
            clearCharTasksImmediately(playerPed)
        end
    end
end
в беск. цикл засунь fast_funcs_work()
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,484
у меня что-то не получается, покажи лучше, как ты это делаешь
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        fast_funcs_work()
    end
end

----------

Есть какая-нибудь функция / библиотека, позволяющая распаковывать ZIP-архив и кидать его содержимое в определённую папку? И ещё, что-бы она сама создавала папки.
Т.е, если в архиве папка, а в ней файлы - она создаёт папку и файлы.
 
Последнее редактирование:
  • Нравится
Реакции: kektop1