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

DeMoN3D

Известный
368
77
Как зделать так что бы скрипт на паузу можно было ставить
в бесконечный цикл
Lua:
if isKeyJustPressed(VK_NUMPAD5)  then active = not active end
в условие исполнения твоего скрипта
Lua:
if active then 
--do
end

Как зделать так что бы скрипт на паузу можно было ставить
https://blast.hk/threads/15482/ ну или вот это
 

TodFox

Известный
105
17
Перс в машине сидит, однако условие все равно не соблюдается: выводит "займите машину". Что-то не то с выводом инфы с TextDraw'вов, они существуют но так же не выводятся (тестил отдельный кусок кода), хелп!
Lua:
---------------------------------------------------------------------------
function main()

  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(0) end
  sampRegisterChatCommand("ttd", function() status = not status
  font = renderCreateFont("Arial", 8, 5)
    if not isCharInCar(PLAYER_PED) then
        sampAddChatMessage("Займите машину.", -1)
    else
    sampAddChatMessage("{0CEEDD}[AutoFuel]  "..(status and "{FEFDFD}Инициализация прошла {1DB805}успешно!" or "{FEFDFD}Успешно {ff0000}деактивирован!"), -1)
  end
end)
---------------------------------------------------------------------------
  while true do wait(0)
    ---
    if status then
      if isCharInCar(PLAYER_PED) and isPlayerPlaying(playerHandle) and status then
             ---------------------------------------------------------------------------
      if sampTextdrawIsExists(2082) and sampTextdrawIsExists(2081) then
          ---------------------------------------------------------------------------
          fuel = sampTextdrawGetString(2082)
          fuel1 = fuel:match("%d+")
          fuel2 = tonumber(fuel1)
          speed = sampTextdrawGetString(2081)
          speed1 = tonumber(speed)
          if fuel2 < 99 then
          sampAddChatMessage('Fuel / Speed:'..fuel2.." "..speed1, -1)
          end
        end
      end
    end
  end
end
 

petuch228

Новичок
82
2
Код:
sampRegisterChatCommand('test', OpenDialog)


function OpenDialog()
  sampShowDialog(123, 'Название', 'List1\nList2', 'Выбрать', 'Закрыть', 2) end
 
    while sampIsDialogActive() do wait(10) end
    local result, button, list, input = sampHasDialogRespond(123)
    if button == 0 then sampCloseCurrentDialogWithButton()
    else
    if list == 0 then sampAddChatMessage('test test', -1) end
    OpenDialog()
    end
end
Почему без while sampIsDialogActive() do wait(10) end диалог даже не открывается? Когда эта строчка есть, то всё работает как нужно
 

штейн

Известный
Проверенный
1,002
688
в бесконечный цикл
Lua:
if isKeyJustPressed(VK_NUMPAD5)  then active = not active end
в условие исполнения твоего скрипта
Lua:
if active then
--do
end


https://blast.hk/threads/15482/ ну или вот это
thisScript():pause()




Lua:
if sampTextdrawIsExists(i) then
                    x, y = sampTextdrawGetPos(i)
                  
                    if tostring(x):find('578.66') and tostring(y):find('185.02') then
                        distance1 = tonumber(sampTextdrawGetString(i))
                        d1 = true
                    end
                    if tostring(x):find('578.66') and tostring(y):find('172.82') then
                        money1 = tonumber(sampTextdrawGetString(i))
                        m1 = true
                    end
                    if tostring(x):find('551.66') and tostring(y):find('247.98') then
                        box = tonumber(sampTextdrawGetString(i))
                        b1 = true
                    end
                    print(b1)
                    if d1 and m1 and b1 then
                        mondis = string.format("%.2f", money1 / distance1)
                        print(mondis)
end
почему строка
Lua:
mondis = string.format("%.2f", money1 / distance1)
выдаёт следующую ошибкуПосмотреть вложение 23996 и как её исправить? я понимаю, что там написано nil value, но не могу понять как это исправить, т.к. когда print(money1) то там число
tonumber
 

Petr_Sergeevich

Известный
Проверенный
707
298
Парни как сделать задержку в function test() test - колбек комманды. wait() не работает
И как сделать нажатие на клавишу ALT (не постоянное, тупо жмякнул и все)?
p.s. Кодом пожалуйста)
Задержки доступны только в потоках и main'e.
Lua:
function test()
    lua_thread.create(function()
        -- код с задержкой
    end)
end

https://blast.hk/wiki/lua:luathread
 

DeMoN3D

Известный
368
77
Парни как сделать задержку в function test() test - колбек комманды. wait() не работает
И как сделать нажатие на клавишу ALT (не постоянное, тупо жмякнул и все)?
p.s. Кодом пожалуйста)
в бесконечный цикл
Lua:
if isKeyJustPressed(VK_MENU) then -- если без библиотеки vkeys, то замени VK_MENU на 0x12
--do
end
 

kotov

Участник
128
12
Киньте пример работы iniCFG с этим же файлом .ini

К примеру нужно будет выводить текст который в одном из значений этого файла. Хз как работает, и чет не могу понять
 

Petr_Sergeevich

Известный
Проверенный
707
298
Киньте пример работы iniCFG с этим же файлом .ini

К примеру нужно будет выводить текст который в одном из значений этого файла. Хз как работает, и чет не могу понять

Lua:
inicfg = require 'inicfg' -- Подключаем библиотеку

-- Загрузка параметров .ini файла и запись их в таблицу, вместо settings может быть указан полный путь к файлу
get = inicfg.load({
    Main = {
        text = "образец",
        number = 0
    }
}, "settings")

function main()
    while not isSampAvailable() do wait(0) end
    print(get.Main.text) -- Обращение к элементу таблицы, вывод: "образец"
    while true do
        wait(0)
        if isKeyJustPressed(0x01 --[[ ЛКМ ]]) then
            get.Main.number = get.Main.number + 1
            inicfg.save(get, "settings") -- Чтобы сохранить изменения в файле, пишем это
        end
    end
end

Lua:
-- Сам файл будет иметь такую структуру
[Main]
text="образец"
number=0

https://blast.hk/wiki/lua:inicfg
 
  • Нравится
Реакции: DeMoN3D

FBenz

Активный
328
40
Привет всем.
Приколюха тут такая. Сделал сохранение таблиц в ini. Какое-то время все на "ура" работало. В один день (сегодня) запустил плагин, а в конфиге с таблицей ничего не меняется. То бишь при inicfg.save ничего не происходит. Содержание конфига не меняется от слова совсем. Вот код:
Загрузка таблицы:
Lua:
local testing = inicfg.load(nil, string.format("%s/configs/testing.ini", getWorkingDirectory()))
Изменение таблицы:
Lua:
testing.testtable.ble = 'шаааааааалалалала'
  onSaveTable(testing, testing)
Сохранение таблицы:
Lua:
function onSaveTable(arg1, arg2)
 inicfg.save(arg1, string.format("%s/configs/%s.ini", getWorkingDirectory(), arg2))
end
Вывод таблицы:
Lua:
if imgui.CollapsingHeader(u8'Тесты') then
  imgui.Text(u8(testing.testtable.ble))
end
Что делаю не так и как это пролечить?
 

Natami

Участник
375
26
Хочу в шить в 1 скрипт 2 скрипт, но 2 скрипт блокирует 1, каким путем решения пойти?
 

petuch228

Новичок
82
2
local buff = imgui.ImBuffer(""..tostring(config.input.text), 256)
imgui.InputText(u8'Поле для текста', buff)

config.input.text - содержит русские символы, они отображаются в поле ввода как знак вопроса. как исправить? кодировка везде Win1251
 

Petr_Sergeevich

Известный
Проверенный
707
298
local buff = imgui.ImBuffer(""..tostring(config.input.text), 256)
imgui.InputText(u8'Поле для текста', buff)

config.input.text - содержит русские символы, они отображаются в поле ввода как знак вопроса. как исправить? кодировка везде Win1251
Lua:
u8:decode(buff.v)
 
  • Нравится
Реакции: petuch228

Slayer.

Новичок
14
0
Вопрос. Почему не работает? Что не так с ним? Просто только начинаю потихоньку изучать.
Lua:
function sampev.onServerMessage(color, text)
if text:match("Сообщение от (%s+)[%d+]: +") ~= nil then
local name, id = text:match("Сообщение от (%s+)[(%d+)]: +")
if name and id then
lua_thread.create(function() wait(500)
sampSendChat("/gethere "..id)
end)
return true
end
end
end
 

FBenz

Активный
328
40
Вопрос. Почему не работает? Что не так с ним? Просто только начинаю потихоньку изучать.
Lua:
function sampev.onServerMessage(color, text)
if text:match("Сообщение от (%s+)[%d+]: +") ~= nil then
local name, id = text:match("Сообщение от (%s+)[(%d+)]: +")
if name and id then
lua_thread.create(function() wait(500)
sampSendChat("/gethere "..id)
end)
return true
end
end
end
Если тебе ник и id надо, а id в [], то [] надо обозначить процентами, чтобы их воспринимало, как символ, сделай так в match():
Lua:
('Сообщение от (%s+)%[(%d+)%]: +')
Если не это, то скажи в чем конкретно проблема? Крашит игру или скрипт? Что в логе мунлоадера?