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

Moorell

Участник
55
12
Как мне узнать умер ли персонаж, эвент
onPlayerDeath тупо не работает на аризоне, либо я что то не так делаю, хотя на других проектах все работает отлично.
 

SyLvy

Активный
231
25
how to take values in "x License" section and show them in chat? Let's say if I type "/getlic SyLvy.HYENA" it will fetch the license values from the website and show them in the chat. link:
image.png
 

Revavi

Участник
101
24
Возможно ли сделать mimgui.text, в котором можно копировать, но нельзя изменять текст? как?
и как сделать систему, где конфиг будет сохраняться, если в нём что-то поменяли?
 

why ega

РП игрок
Модератор
2,541
2,233
Возможно ли сделать mimgui.text, в котором можно копировать, но нельзя изменять текст? как?
если правильно понял, то вот код, который при нажатие на текст скопирует его в буфер
Lua:
local text = "AAAAAAAAAAAA"


imgui.Text(text)
if imgui.IsItemClicked(0) then
    setClipboardText(text)
end

и как сделать систему, где конфиг будет сохраняться, если в нём что-то поменяли?
смотря какой конфиг
 

Julimba

Участник
108
10
qq, как сделать, чтобы данная функция выдавала расстояние в целых числах, без десятичных.

getDistanceBetweenCoords3d(x, y, z, mX, mY, mZ)
 

why ega

РП игрок
Модератор
2,541
2,233
qq, как сделать, чтобы данная функция выдавала расстояние в целых числах, без десятичных.

getDistanceBetweenCoords3d(x, y, z, mX, mY, mZ)
math.floor(getDistanceBetweenCoords3d(x, y, z, mX, mY, mZ))

inicfg

inicfg:
local cfg = inicfg.load({
    -- cfg
}, cfg_path)
люто насрал, но в теории должно работать,

Lua:
local cfg = inicfg.load({
    -- cfg
}, cfg_path)
local proxyCfg = {}
setmetatable(proxyCfg, {
    __index = function(self, k) -- вызывается тогда, когда ты вызываешь какое-либо значение
        -- это говнокод люти, но если я сяду приводить его в порядок, то я засну
        inicfg.save(cfg, "file.ini")
        return cfg[k]
    end,
    __newindex = function(self, k, v) -- вызывается, когда создаешь значение
        -- это говнокод люти, но если я сяду приводить его в порядок, то я засну
        inicfg.save(cfg, "file.ini")
        cfg[k] = v
   end
})

-- теперь чтобы измененить значение в конфиге, обращайся не к cfg, а к proxyCfg
proxyCfg.config.zalupa = true -- и т.д.
 
Последнее редактирование:
  • Нравится
  • Влюблен
Реакции: Revavi и Julimba

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,771
11,214
math.floor(getDistanceBetweenCoords3d(x, y, z, mX, mY, mZ))


люто насрал, но в теории должно работать,

Lua:
local cfg = inicfg.load({
    -- cfg
}, cfg_path)
local proxyCfg = {}
setmetatable(proxyCfg, {
    __index = function (t, k) -- вызывается тогда, когда ты вызываешь какое-либо значение
        -- это говнокод люти, но если я сяду приводить его в порядок, то я засну
        inicfg.save(cfg, "file.ini")
        return cfg[k]
    end,
    __newindex = function (t, k, v) -- вызывается, когда создаешь значение
        -- это говнокод люти, но если я сяду приводить его в порядок, то я засну
        inicfg.save(cfg, "file.ini")
        cfg[k] = v
   end
})

-- теперь чтобы измененить значение в конфиге, обращайся не к cfg, а к proxyCfg
proxyCfg.config.zalupa = true -- и т.д.
эти методы не вызываются при смене значения
1684518688131.png
 

why ega

РП игрок
Модератор
2,541
2,233
эти методы не вызываются при смене значения
Посмотреть вложение 202046
у меня прокси-таблица, в твоем примере ты создаешь мета-методы для дефолт таблицы
кстати, в моем примере не будут работать функции pairs, поэтому если есть нужда в них, то добавь еще один мета-метод:
__pairs = function() return pairs(cfg) end

а, ну и для того, что бы можно было получать длину таблицы, добавь еще один мета-метод
__len = function() return #cfg end
 
Последнее редактирование:
  • Нравится
Реакции: chapo

joumey

Активный
195
43
Как мне повернуть drawlist:AddImage
 
Последнее редактирование:

ch1ps

Участник
101
3
[ML] (error) spcar.lua: cannot resume non-suspended coroutine
stack traceback:
[C]: in function 'setGameKeyState'
C:\Games\GRAY SEANSIZE [REBUILT]\moonloader\spcar.lua:6: in function <C:\Games\GRAY SEANSIZE [REBUILT]\moonloader\spcar.lua:3>
[ML] (error) spcar.lua: Script died due to an error. (315B280C)

в:
require "lib.moonloader"

function main()
    while true do wait(40)
        if isCharInAnyCar(PLAYER_PED) and (isKeyDown(VK_SHIFT) and isKeyDown(VK_W)) then
            setGameKeyState(16, 255)
            wait(10)
            setGameKeyState(16, 0)
        end
    end
end

в чём трабл?
 

why ega

РП игрок
Модератор
2,541
2,233
[ML] (error) spcar.lua: cannot resume non-suspended coroutine
stack traceback:
[C]: in function 'setGameKeyState'
C:\Games\GRAY SEANSIZE [REBUILT]\moonloader\spcar.lua:6: in function <C:\Games\GRAY SEANSIZE [REBUILT]\moonloader\spcar.lua:3>
[ML] (error) spcar.lua: Script died due to an error. (315B280C)

в:
require "lib.moonloader"

function main()
    while true do wait(40)
        if isCharInAnyCar(PLAYER_PED) and (isKeyDown(VK_SHIFT) and isKeyDown(VK_W)) then
            setGameKeyState(16, 255)
            wait(10)
            setGameKeyState(16, 0)
        end
    end
end

в чём трабл?
Это весь код?
 

Moorell

Участник
55
12
Помогите народ.
Как мне узнать умер ли персонаж, эвент
onPlayerDeath тупо не работает на аризоне, либо я что то не так делаю, хотя на других проектах все работает отлично.