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

komnatq

Известный
203
90
opcode '02DB' call caused an unhandled exception stack traceback: [C]: in function 'setBoatCruiseSpeed'
Help please
code:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end

    while true do wait(0)
        if isCharInAnyBoat(PLAYER_PED) then
            local car = storeCarCharIsIn(PLAYER_PED)
            local _, id = sampGetVehicleIdByCarHandle(car)
            local _, boat = sampGetCarHandleBySampVehicleId(id)
            setBoatCruiseSpeed(boat, 100.0)
        end
    end
end
 

CaJlaT

Овощ
Модератор
2,808
2,619
opcode '02DB' call caused an unhandled exception stack traceback: [C]: in function 'setBoatCruiseSpeed'
Help please
code:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end

    while true do wait(0)
        if isCharInAnyBoat(PLAYER_PED) then
            local car = storeCarCharIsIn(PLAYER_PED)
            local _, id = sampGetVehicleIdByCarHandle(car)
            local _, boat = sampGetCarHandleBySampVehicleId(id)
            setBoatCruiseSpeed(boat, 100.0)
        end
    end
end
Оно никакого эффекта не даёт....
Lua:
local CruiseSpeed = 1.0
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('bspeed', function(arg)
        if not arg or not tonumber(arg) then return sampAddChatMessage('Use /bspeed [speed]', 0xFF3333) end
        CruiseSpeed = tonumber(arg)
        sampAddChatMessage(string.format('CruiseSpeed set to %.3f', CruiseSpeed), 0x33ff33)
    end)
    while true do wait(0)
        if isCharInAnyBoat(PLAYER_PED) then
            local veh = storeCarCharIsInNoSave(1)
            setBoatCruiseSpeed(veh, CruiseSpeed)
            printStringNow(string.format('In boat~n~Speed: ~b~%.3f~n~~w~Limit: ~b~%.3f', getCarSpeed(veh), CruiseSpeed), 1000)
        end
    end
end
Я только на 0:50 вспомнил, что у меня есть скрипт, который отключает волны... смотри с 0:50....
 
  • Нравится
Реакции: komnatq

Strand

Участник
48
27
Как найти путь к папке GTA San Andreas User Files\SAMP?
Да и в целом как искать папки и файлы в них?
У меня допустим есть путь C:\Users\Strand\Documents\GTA San Andreas User Files\SAMP\arizona\screens\08 февраля 2023г. Мне нужно получить файлы из папки screens в этом пути.
 

YarikVL

Известный
Проверенный
4,796
1,813
Да и в целом как искать папки и файлы в них?
У меня допустим есть путь C:\Users\Strand\Documents\GTA San Andreas User Files\SAMP\arizona\screens\08 февраля 2023г. Мне нужно получить файлы из папки screens в этом пути.
Посмотри этот код: https://www.blast.hk/threads/140685/post-1087901
И эту тему:
 
  • Нравится
Реакции: Strand

CaJlaT

Овощ
Модератор
2,808
2,619
Как найти путь к папке GTA San Andreas User Files\SAMP?
Да и в целом как искать папки и файлы в них?
У меня допустим есть путь C:\Users\Strand\Documents\GTA San Andreas User Files\SAMP\arizona\screens\08 февраля 2023г. Мне нужно получить файлы из папки screens в этом пути.

Lua:
function getFilesInPath(path, ftype)
    local Files, SearchHandle, File = {}, findFirstFile(path.."\\"..ftype)
    table.insert(Files, File)
    while File do File = findNextFile(SearchHandle) table.insert(Files, File) end
    return Files
end

local path = os.getenv('USERPROFILE')..'\\Documents\\GTA San Andreas User Files\\SAMP\\screens'
local files = getFilesInPath(path, '*.png')
for i, v in pairs(files) do
    print(v)
end
 
  • Нравится
Реакции: Strand и YarikVL

komnatq

Известный
203
90
Оно никакого эффекта не даёт....
Lua:
local CruiseSpeed = 1.0
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('bspeed', function(arg)
        if not arg or not tonumber(arg) then return sampAddChatMessage('Use /bspeed [speed]', 0xFF3333) end
        CruiseSpeed = tonumber(arg)
        sampAddChatMessage(string.format('CruiseSpeed set to %.3f', CruiseSpeed), 0x33ff33)
    end)
    while true do wait(0)
        if isCharInAnyBoat(PLAYER_PED) then
            local veh = storeCarCharIsInNoSave(1)
            setBoatCruiseSpeed(veh, CruiseSpeed)
            printStringNow(string.format('In boat~n~Speed: ~b~%.3f~n~~w~Limit: ~b~%.3f', getCarSpeed(veh), CruiseSpeed), 1000)
        end
    end
end
Я только на 0:50 вспомнил, что у меня есть скрипт, который отключает волны... смотри с 0:50....
Понял, буду думать костыли. Кидало в лоадинг на большой скорости, поставил фикс SAP, проблему исправляет, но на моменте ожидаемого лоадинга просто фризит скорость в 0. Итого не плывешь, а дергаешься
 

CaJlaT

Овощ
Модератор
2,808
2,619
Понял, буду думать костыли. Кидало в лоадинг на большой скорости, поставил фикс SAP, проблему исправляет, но на моменте ожидаемого лоадинга просто фризит скорость в 0. Итого не плывешь, а дергаешься
Тоже сталкивался с этим, ещё на аризоне при отключении волн спидер с коленом сп+ и чипом ст3 хуярит 420км и кикает
 

Strand

Участник
48
27
Нужен хук(ивент) чтобы получить новое сообщение на клиентсайде
Либо же хук(ивент), который дает срабатывает при создании скриншота
 

YarikVL

Известный
Проверенный
4,796
1,813
Нужен хук(ивент) чтобы получить новое сообщение на клиентсайде
Имеешь ввиду это: https://wiki.blast.hk/ru/moonloader/lua/sampGetChatString ?
Либо же хук(ивент), который дает срабатывает при создании скриншота
Если ты имел ввиду самповский скриншот тип F8 то вот: https://www.blast.hk/threads/69973/post-607278
 

Julimba

Участник
108
10
Здарова, возможно тупой вопрос, но..
Есть такая тема, хз как она называется, таблица, массив или что то в этом роде
Lua:
local AC2 = {
    bot1 = {
        bb1 = 'ты не бот',
        bb2 = 'ты возможно не бот',
    },
    Acc1 = {
        cc1 = '12', '13', '14', '15',
        cc2 = '(%d*)', '(%.*)',
    },
}
Как сделать чтобы в сс1 и сс2 проверялось каждое условие, типо возможно оно подойдет. И сразу просьба, объясните где это нужно будет писать, а то я в данном плане туговат.


Lua:
if text:find(AC2.Acc1.cc1) then
    local nick, hid = text:match(AC2.Acc1.cc2)

код написан чисто для примера
 

qdIbp

Автор темы
Проверенный
1,387
1,146
Здарова, возможно тупой вопрос, но..
Есть такая тема, хз как она называется, таблица, массив или что то в этом роде
Lua:
local AC2 = {
    bot1 = {
        bb1 = 'ты не бот',
        bb2 = 'ты возможно не бот',
    },
    Acc1 = {
        cc1 = '12', '13', '14', '15',
        cc2 = '(%d*)', '(%.*)',
    },
}
Как сделать чтобы в сс1 и сс2 проверялось каждое условие, типо возможно оно подойдет. И сразу просьба, объясните где это нужно будет писать, а то я в данном плане туговат.


Lua:
if text:find(AC2.Acc1.cc1) then
    local nick, hid = text:match(AC2.Acc1.cc2)

код написан чисто для примера
cc1 = {'12', '13', '14', '15'},
cc2 = {'(%d*)', '(%.*)}',
 

Anti...

Активный
267
31
Возможно как-то получить экранные координаты ДРУГОГО игрока? Не меня
 
  • Грустно
Реакции: qdIbp

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,776
11,226
Возможно как-то получить экранные координаты ДРУГОГО игрока? Не меня
Lua:
bool result = isCharOnScreen(Ped ped)
float positionX, float positionY, float positionZ = getCharCoordinates(Ped ped)
float wposX, float wposY = convert3DCoordsToScreen(float posX, float posY, float posZ)