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

TheRuthArbiter

Неповторимый РПшер
Проверенный
523
305
[ML] (error) script.lua: ...ndreas MultiPlayerAdm\moonloader\script.lua:707: stack index 2, expected userdata, received sol.ImValue<int>: value at this index does not properly reflect the desired type (bad argument into 'bool(const char*, ImBuffer*, sol::optional<int>, sol::optional<ImCallback *>)')
stack traceback:
[C]: in function 'InputText'
покажи всю ини.таблицу и как вызываешь в имгуи.
 

sdfaw

Активный
718
150
Как мне сделать, что бы в imgui.InputText в поле ввода УЖЕ отображался тот текст, который будет написан в .ini файле?
Вот пример, как должно быть:
Посмотреть вложение 33259
Посмотреть вложение 33260

Пробовал просто при запуске скрипта просто присваивать имБуфферу значение int, но скрипт крашил
в начало
local test = imgui.ImBuffer(your.ini.config, 256)

в imgui
imgui.InputText("", test)

Lua:
namevar = imgui.ImInt(your.ini.config) -- это для того, чтобы значение быстро записывалось в иникфг (необязательно, так написал, мэйби последует вопрос о том "как записывать и сохранять значения через имгуи)
-- в самом событии отрисовки окна
imgui.InputText('text', your.ini.config) -- или не инпут, смотря что у тебя там
imgui.InputText('text', namevar) -- а можно вот так
чёбля в инпут тексте ImInt? ясен хуй что у него будет крашить скрипт
 

TheRuthArbiter

Неповторимый РПшер
Проверенный
523
305
в начало
local test = imgui.ImBuffer(your.ini.config, 256)

в imgui
imgui.InputText("", test)


чёбля в инпут тексте ImInt? ясен хуй что у него будет крашить скрипт
ну блядь, мало ли он немножко запутался "текст" перепутал с числом, логика работает бро? Я думал, что какого хуя у него в int должен быть текст, может он уже устал да и перепутал cлово "текст" со словом "число", но всё таки он серьёзно ошибся. Тогда да, твой вариант будет правильным, но не полностью. То, что сейчас скину нужно для того, чтобы не было ошибок с количеством ввода символом (даже хоть ты вторым параметром поставишь 256, но он почему-то иногда принимает всего по 6-7 символом)
Lua:
namevar = imgui.ImBuffer(''.. your.ini.config, 256)
 
Последнее редактирование:

NHacker1271

Известный
156
16
Как вывести 4 значения через string.find? Выделены фиолетовым.
Lua:
200 кг груза было продано за {33AA33}$70.{FFFFFF} Доход: $70 ($0 доставлено в кассу компании)
 

TheRuthArbiter

Неповторимый РПшер
Проверенный
523
305
Последнее редактирование:

NHacker1271

Известный
156
16
Регулярными выражениями
Я пробовал, не получалось. Помоги. Я просто только вчера начал изучать lua.
В AHK я спокойно играюсь с регулярками, в lua слегка не привычно.

Регулярными выражениями
Выводит только первое значение, а как последующие сделать я хз.
Lua:
if text:find("%d+ кг груза было продано за {33AA33}%$%d+.{FFFFFF} Доход: %$%d+ %(%$%d+ доставлено в кассу компании%)") then
 sampAddChatMessage("Кол-во кг: " .. text:match("%d+"), 0xFFFFFF)
 sampAddChatMessage("Продано за: " .. text:match("%d+"), 0xFFFFFF)
end
 

astynk

Известный
Проверенный
742
530
Как вывести 4 значения через string.find? Выделены фиолетовым.
Lua:
200 кг груза было продано за {33AA33}$70.{FFFFFF} Доход: $70 ($0 доставлено в кассу компании)
Lua:
local text = '200 кг груза было продано за {33AA33}$70.{FFFFFF} Доход: $70 ($0 доставлено в кассу компании)'
for num in string.gmatch(text, '%d+') do
    sampAddChatMessage(num, -1)
end
 
  • Нравится
Реакции: TheRuthArbiter

NHacker1271

Известный
156
16
Lua:
local text = '200 кг груза было продано за {33AA33}$70.{FFFFFF} Доход: $70 ($0 доставлено в кассу компании)'
for num in string.gmatch(text, '%d+') do
    sampAddChatMessage(num, -1)
end
В переменные значения вывести как-то можно?
Lua:
        text, prefix, color, pcolor = sampGetChatString(99)
        if text:find("%d+ кг груза было продано за {33AA33}%$%d+.{FFFFFF} Доход: %$%d+ %(%$%d+ доставлено в кассу компании%)") then
            for num in string.gmatch(text, '%d+') do
                sampAddChatMessage(num, -1)
            end
        end
 

quaressquad

Новичок
12
0
Код:
function main()

    while not isSampAvailable() do wait(0) end
  while true do wait(0)
        if isPlayerDead() then sampSendChat("[eq")
        end
    end
криворуко, но что я написал не так? что в скобках писать в isPlayerDead()?
 

sdfaw

Активный
718
150
Код:
function main()

    while not isSampAvailable() do wait(0) end
  while true do wait(0)
        if isPlayerDead() then sampSendChat("[eq")
        end
    end
криворуко, но что я написал не так? что в скобках писать в isPlayerDead()?
Lua:
function main()
while not isSampAvailable() do wait(0) end
while true do
wait(0)
if isCharDead(PLAYER_PED) then
sampSendChat("xyi")
end
end
end
 

Vanya123123123123

Новичок
3
0
Ребят, можно ли на луа узнать онлайн человека по нику? Если да, дайте фундамент хотя-бы, или по возможности фулл
 

astynk

Известный
Проверенный
742
530
Ребят, можно ли на луа узнать онлайн человека по нику? Если да, дайте фундамент хотя-бы, или по возможности фулл
Lua:
function sampIsPlayerOnline(nick)
    for i = 0, 999 do
        if sampIsPlayerConnected(i) and sampGetPlayerNickname(i) == nick then
            return true
        end
    end
    return false
end
 
  • Нравится
Реакции: Vanya123123123123

NHacker1271

Известный
156
16
В переменные значения вывести как-то можно?
Lua:
text, prefix, color, pcolor = sampGetChatString(99)
 if text:find("%d+ кг груза было продано за {33AA33}%$%d+.{FFFFFF} Доход: %$%d+ %(%$%d+ доставлено в кассу компании%)") then
  for num in string.gmatch(text, '%d+') do
   sampAddChatMessage(num, -1)
  end
end