Вопросы по 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

Известный
366
77
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)
выдаёт следующую ошибку
upload_2019-1-17_20-45-18.png
и как её исправить? я понимаю, что там написано nil value, но не могу понять как это исправить, т.к. когда print(money1) то там число
 

DeMoN3D

Известный
366
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,000
686
в бесконечный цикл
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
296
Парни как сделать задержку в 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

Известный
366
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
296
Киньте пример работы 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

Участник
377
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
296
local buff = imgui.ImBuffer(""..tostring(config.input.text), 256)
imgui.InputText(u8'Поле для текста', buff)

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