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

histor

Известный
190
141
как переписать активацию скрипта с sampRegisterChatCommand('cmd', function() -- код ) на активацию по imgui.Checkbox(u8'cmd', Checkbox)

вроде бы смог сам, но теперь у меня не так всё работает, при активации чекбокса лагер выключается, а при его деактивации (чекбокса) лагер включается

Lua:
-- код

        if Checkbox2.v then
         f = not f
        if f then
        for i = 3,1,-1 do
         sampSetSendrate(i, 1000)
        end
        else
        for i = 1,3 do
         sampSetSendrate(i, 0)
        end
        end
        end
       
-- код

function e.onSendPlayerSync(d)
if f then
       local t, k = math.modf(localClock())
    if math.fmod(t, 2) == 0 and k < 0.7 then
        d.moveSpeed.y = -0.036
    else
        return false
    end
         end
end

function e.onSendVehicleSync(d)
if f then
      local t, k = math.modf(localClock())
    if math.fmod(t, 2) == 0 and k < 0.4 then
         d.moveSpeed.y = 0.0125
    else
         return false
    end
          end
end
Так измени проверку на чекбокс. Поставь not после if
 
  • Нравится
Реакции: goodflex

goodflex

Активный
280
58
Так измени проверку на чекбокс. Поставь not после if
не робит теперь скрипт иза not

[ML] (error) new.lua: ...user\Desktop\sborka\moonloader\new.lua:62: unexpected symbol near 'not'
[ML] (error) new.lua: Script died due to an error. (16210DD4)

не робит теперь скрипт иза not

[ML] (error) new.lua: ...user\Desktop\sborka\moonloader\new.lua:62: unexpected symbol near 'not'
[ML] (error) new.lua: Script died due to an error. (16210DD4)
а всё, поправил косяк там


теперь прикол получился иза not, что лагер щас вообще не робит ( имгуи меню работает, но при активации лагера он не включается) XD. а если ставить not к if f then (if not f then) то лагер включается как нужно, но не выключается потом
Так измени проверку на чекбокс. Поставь not после if
 
Последнее редактирование:

histor

Известный
190
141
Подскажите сниппет для определния нажатой клавиши/клавиш. Нужно для создания бинда. Встречал такие в биндерах и мвд хелпере
 
Последнее редактирование:

sosnov

Известный
329
115
как в мимгуи кнопку засунуть нажатие клавиши? к примеру 'z', типо нажимаешь на кнопку мимгуи и у тебя нажимается клавиша z? вот что я вытался сделать, но ничего не вышло, вот код:
Lua:
if imgui.Button(u8'Включить авто-граффити') then
            setVirtualKeyDown(90)
        end
 
  • Нравится
Реакции: goodflex

goodflex

Активный
280
58
как в мимгуи кнопку засунуть нажатие клавиши? к примеру 'z', типо нажимаешь на кнопку мимгуи и у тебя нажимается клавиша z? вот что я вытался сделать, но ничего не вышло, вот код:
Lua:
if imgui.Button(u8'Включить авто-граффити') then
            setVirtualKeyDown(90)
        end
Код:
    setVirtualKeyDown("виртуальная клавиша", true) -- зажал кнопку

    wait(30) -- задержка 0,03 сек

    setVirtualKeyDown("виртуальная клавиша", false) -- отпустил кнопку

виртуальные клавиши: https://api.farmanager.com/ru/winapi/virtualkeycodes.html

Код:
        if imgui.Button(u8'Включить авто-граффити') then
            lua_thread.create(function()
            setVirtualKeyDown(VK_Z, true)
            wait(30)
            setVirtualKeyDown(VK_Z, false)
            end)
        end
как в мимгуи кнопку засунуть нажатие клавиши? к примеру 'z', типо нажимаешь на кнопку мимгуи и у тебя нажимается клавиша z? вот что я вытался сделать, но ничего не вышло, вот код:
Lua:
if imgui.Button(u8'Включить авто-граффити') then
            setVirtualKeyDown(90)
        end
 
D

deleted-user-216129

Гость
Кто может рассказать, почему никто не использует loadstring() для чтение таблиц из файлов? Это связано только с безопасностью? Будет ли рационально так делать, если обычный json не передаёт всю информацию, которая мне нужна? Или всё таки делать функцию-парсер?
 

Revavi

Участник
101
24
Как в json сохранять по ключам, а не по номерам? например, создать список значений, к которым я хочу обращаться как table['a1'], а не tabe[1] и т.д.
При использовании номеров возникают ошибки, если нужно какие-то элементы полностью стереть или что-то подобное
 
D

deleted-user-216129

Гость
Как в json сохранять по ключам, а не по номерам? например, создать список значений, к которым я хочу обращаться как table['a1'], а не tabe[1] и т.д.
При использовании номеров возникают ошибки, если нужно какие-то элементы полностью стереть или что-то подобное
А как ты в таблицу добавляешь значение?
 

de_clain

Активный
232
64
Как в json сохранять по ключам, а не по номерам? например, создать список значений, к которым я хочу обращаться как table['a1'], а не tabe[1] и т.д.
При использовании номеров возникают ошибки, если нужно какие-то элементы полностью стереть или что-то подобное
Не понял, разве tbl = { name = "Алумбек", age = "228" } не сохраняет по ключам
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,203
12,526
Кто может рассказать, почему никто не использует loadstring() для чтение таблиц из файлов? Это связано только с безопасностью? Будет ли рационально так делать, если обычный json не передаёт всю информацию, которая мне нужна? Или всё таки делать функцию-парсер?
скорее всего потому что надо ебаться с записью таблицы в файл
 

_Dino_

Активный
122
49
Как увеличивать шрифт fAwesome6?
Пример из скрипта fAwesome5

LUA:
imgui.OnInitialize(function()
    local config = imgui.ImFontConfig()
    config.MergeMode = true
    local glyph_ranges = imgui.GetIO().Fonts:GetGlyphRangesCyrillic()
    local iconRanges = imgui.new.ImWchar[3](fa.min_range, fa.max_range, 0)
    imgui.GetIO().Fonts:AddFontFromFileTTF('trebucbd.ttf', 14.0, nil, glyph_ranges)
    for Size = 10, 25 do
        FaFont[Size] = imgui.GetIO().Fonts:AddFontFromFileTTF('moonloader/resource/fonts/fa-solid-900.ttf', Size, config, iconRanges)
    end
    icon = imgui.GetIO().Fonts:AddFontFromFileTTF('moonloader/resource/fonts/fa-solid-900.ttf', 14, config, iconRanges)
end)
 
D

deleted-user-216129

Гость
через table.insert, там по команде мне надо значение сохранять
я плох с json, можно как то по-другому?
Я тоже немного не понял, вроде encodeJson должен сохранять таблицу и с ключами, такими как a1 и т. п.
Можешь вот так попробывать, если тебе надо добавлять в конец таблицы,

Lua:
local tab = {}
tab[tostring(#tab + 1)] = {} -- вместо '{}', вставляй то, что тебе надо
 

goodflex

Активный
280
58
при нажатии на чекбокс то что нужно начинает работать, но при убратии галочки с чекбокса скрипт дальше работает, как сиправить?
Код:
function main()
-- код
    while true do
-- код
        if Checkbox11.v then
        afk = not afk
        end

        if afk then
            memory.setuint8(7634870, 1, false)
            memory.setuint8(7635034, 1, false)
            memory.fill(7623723, 144, 8, false)
            memory.fill(5499528, 144, 6, false)
        else
            memory.setuint8(7634870, 0, false)
            memory.setuint8(7635034, 0, false)
            memory.hex2bin('0F 84 7B 01 00 00', 7623723, 8)
            memory.hex2bin('50 51 FF 15 00 83 85 00', 5499528, 6)
        end
    end
end
 

DZONE

Известный
185
200
при нажатии на чекбокс то что нужно начинает работать, но при убратии галочки с чекбокса скрипт дальше работает, как сиправить?
Код:
function main()
-- код
    while true do
-- код
        if Checkbox11.v then
        afk = not afk
        end

        if afk then
            memory.setuint8(7634870, 1, false)
            memory.setuint8(7635034, 1, false)
            memory.fill(7623723, 144, 8, false)
            memory.fill(5499528, 144, 6, false)
        else
            memory.setuint8(7634870, 0, false)
            memory.setuint8(7635034, 0, false)
            memory.hex2bin('0F 84 7B 01 00 00', 7623723, 8)
            memory.hex2bin('50 51 FF 15 00 83 85 00', 5499528, 6)
        end
    end
end
Lua:
function main()
-- код
    while true do
-- код
        if Checkbox11.v then
            memory.setuint8(7634870, 1, false)
            memory.setuint8(7635034, 1, false)
            memory.fill(7623723, 144, 8, false)
            memory.fill(5499528, 144, 6, false)
        else
            memory.setuint8(7634870, 0, false)
            memory.setuint8(7635034, 0, false)
            memory.hex2bin('0F 84 7B 01 00 00', 7623723, 8)
            memory.hex2bin('50 51 FF 15 00 83 85 00', 5499528, 6)
        end
    end
end
 
  • Нравится
Реакции: goodflex