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

Dmitriy Makarov

25.05.2021
Проверенный
2,511
1,138
Как сделать так, что бы когда писал в рацию (/r, /f) автоматически писался твой тэг?
Lua:
-- function main()
sampRegisterChatCommand("/r", function(text)
    if text == "" then sampAddChatMessage("Use: /r [Text]")
    else sampSendChat("/r [Your tag]: "..text)
    end
end)
Чет того вроде
 
  • Влюблен
Реакции: YOUNG!

KashMar

Известный
22
1
Ребят, как эмулировать нажатие мышкой в определенных координатах экрана?
 
U

user390868

Гость
Ребят, как эмулировать нажатие мышкой в определенных координатах экрана?
Бро, это совсем не так делается. Я уверен, что ты хочешь сделать какого-то бота для клика по тексдравам или что-то подобное. Обратись в раздел помощи со скринами, чтобы точнее понимать, там уже будет легче
 

wulfandr

Известный
636
260
Как сделать так, что бы когда писал в рацию (/r, /f) автоматически писался твой тэг?
Lua:
local spl, sp = pcall(require, 'lib.samp.events')

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

tag = '[Your Tag]:'

function sp.onSendCommand(command)
    if command:match("^/r .+") then
        local text = command:match("^/%S+ (.+)")
        return {"/r ".. tag .." "..text}
    end
end
 
  • Нравится
Реакции: Gbvvccc и YOUNG!

|| NN - NoName ||

Известный
1,049
638
как повернуть камеру на координаты?
Lua:
local fX, fY, fZ = getActiveCameraCoordinates() 
local zX, zY, zZ = getActiveCameraPointAt() 
local heading = getHeadingFromVector2d(zX - fX, zY - fY) 
local car = getCarCharIsUsing(playerPed)
setCarHeading(car, heading)

Куда направлена мышка, туда и смотрит машина.
 
  • Нравится
Реакции: корбус

корбус

Известный
433
109
как получить координаты такого маркера:
0Fhmx6o_l3I.jpg

и направить туда камеру?
 

|| NN - NoName ||

Известный
1,049
638
как получить координаты такого маркера:Посмотреть вложение 73721
и направить туда камеру?
Lua:
function sampev.onSetRaceCheckpoint(type, position, nextPosition, size)
    sampAddChatMessage('X: '..position.x..' Y: '..position.y, -1) -- отправляет координаты в чат
end
Вот это, чтобы направить туда камеру(но это не точно)

setFixedCameraPosition(float positionX, float positionY, float positionZ, float rotationX, float rotationY, float rotationZ)
pointCameraAtPoint(float pointAtX, float pointAtY, float pointAtZ, int switchstyle)
Почему inicfg не всегда сохраняет значение в конфиг?
Почему Путин до сих пор президент?

Может код скинешь или чо? Я должен вангой быть?
 

yummyme

Участник
36
1
Lua:
function sampev.onSetRaceCheckpoint(type, position, nextPosition, size)
    sampAddChatMessage('X: '..position.x..' Y: '..position.y, -1) -- отправляет координаты в чат
end
Вот это, чтобы направить туда камеру(но это не точно)

setFixedCameraPosition(float positionX, float positionY, float positionZ, float rotationX, float rotationY, float rotationZ)
pointCameraAtPoint(float pointAtX, float pointAtY, float pointAtZ, int switchstyle)

Почему Путин до сих пор президент?

Может код скинешь или чо? Я должен вангой быть?
Сам прикол в том, что это рандом. Например внизу работает как переключатель, и если статус был 0 и потом поставить 1 и и при этом перезагрузить скрипт через reloadScript() то сбивается на 0, или наоборот если было 1 поставить 0, то будет 1
Код:
 if imgui.Checkbox(u8'On/Off', testCheckbox) then
     if testCheckbox.v then
         local status = 1
         loadcfg.other.status = status
         if inicfg.save(loadcfg, Cfg) then
             print('Status = 1 ')
          end
     else
         local enableON = 0
         loadOthercfg.other.status = status
         if inicfg.save(loadcfg, Cfg) then
             print('Status = 0 ')
         end
    end
end
 

|| NN - NoName ||

Известный
1,049
638
Сам прикол в том, что это рандом. Например внизу работает как переключатель, и если статус был 0 и потом поставить 1 и и при этом перезагрузить скрипт через reloadScript() то сбивается на 0, или наоборот если было 1 поставить 0, то будет 1
Код:
 if imgui.Checkbox(u8'On/Off', testCheckbox) then
     if testCheckbox.v then
         local status = 1
         loadcfg.other.status = status
         if inicfg.save(loadcfg, Cfg) then
             print('Status = 1 ')
          end
     else
         local enableON = 0
         loadOthercfg.other.status = status
         if inicfg.save(loadcfg, Cfg) then
             print('Status = 0 ')
         end
    end
end
Lua:
local direct = 'moonloader\\config\\airbrake.ini'

function main()
settings = inicfg.load(nil, direct)


local settings = inicfg.load({
            SETTINGS = {
                speedcar = 1.5,
                speedped = 0.3,
                key = 161
                }
            }, '..\\config\\airbrake.ini')
            inicfg.save(settings, '..\\config\\airbrake.ini')
            settings = inicfg.load(nil, direct)

end

Вот так сделаешь. И будет всё заебись. Взял из своего скрипта, тебе лишь надо под свой скрипт сделать и всО
 
  • Нравится
Реакции: yummyme
У

Удалённый пользователь 341712

Гость
У меня есть отдельная функция для таймера, как сделать так чтобы она работала?
imgui.Text(functia())
Либо в переменную сохраняй время а дальше через функцию прогоняй
Lua:
function get_clock(time)
    local timezone_offset = 86400 - os.date('%H', 0) * 3600
    if tonumber(time) >= 86400 then onDay = true else onDay = false end
    return os.date((onDay and math.floor(time / 86400)..' ' or '')..'%H:%M:%S', time + timezone_offset)
end
Сам прикол в том, что это рандом. Например внизу работает как переключатель, и если статус был 0 и потом поставить 1 и и при этом перезагрузить скрипт через reloadScript() то сбивается на 0, или наоборот если было 1 поставить 0, то будет 1
Код:
 if imgui.Checkbox(u8'On/Off', testCheckbox) then
     if testCheckbox.v then
         local status = 1
         loadcfg.other.status = status
         if inicfg.save(loadcfg, Cfg) then
             print('Status = 1 ')
          end
     else
         local enableON = 0
         loadOthercfg.other.status = status
         if inicfg.save(loadcfg, Cfg) then
             print('Status = 0 ')
         end
    end
end
Просто код не очень, попробуй так
Lua:
local inicfg = require 'inicfg'

local HLcfg = inicfg.load({
    config = {
        checkBx = false,
        name = ''
    }
}, 'test.ini')
inicfg.save(HLcfg, 'test.ini')

local checkBx = imgui.ImBool(HLcfg.config.checkBx)
local name = imgui.ImBuffer(tostring(HLcfg.config.name), 256)

-- imgui

if imgui.CheckBox(u8"Тест", checkBx) then
    HLcfg.config.checkBx = checkBx.v
    save()
end

-- or

if imgui.InputText(u8"##test", name) then
    HLcfg.config.name = name.v
    save()
end

function save()
    inicfg.save(HLcfg, 'test.ini')
end
 
  • Нравится
Реакции: HpP