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

darkjer

Активный
134
68
как сохранить значений чекбокса true/false в ини?
code:
local inicfg = require 'inicfg'

local directory = 'directory'

local cfg = inicfg.load({
    config =
    {
        test = false
    }
}, directory)

local test = imgui.ImBool(cfg.config.test)

--ondrawframe
if imgui.Checkbox('checkbox', test) then
    cfg.config.test = test.v
    inicfg.save(cfg, directory)
end
 

enyag

Известный
345
12
почему код не робит? после релога не выводит то, что в textdraw1 и textdraw2
Lua:
        if third_window_state.v then
            local sw, sh = getScreenResolution()
            imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.CondFirstUseEver, imgui.ImVec2(0.5, 0.5))
            imgui.SetNextWindowSize(imgui.ImVec2(1250, 343), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"Смена лого и ника", third_window_state, imgui.WindowFlags.NoResize)
        imgui.InputText(u8'Введите первый текстдрав(Pears)', pearsBufferText)
        imgui.InputText(u8'Введите второй текстдрав(Project)', projectBufferText)
        pears = pearsBufferText.v
        project = projectBufferText.v
        imgui.Text(u8'Сейчас вы можете выбрать подходящий цвет для вашего лого.\nОчень жаль что так мало цветов, но что есть, то есть :(')
        if imgui.CollapsingHeader(u8'Цвета первого текстдрава(Pears)', imgui.ImVec2(100, 50)) then
            if imgui.ColorEdit3(u8'Выбор цвета 1 текстдрава', colortd) then
                clrtd = join_argb(0, colortd.v[1] * 255, colortd.v[2] * 255, colortd.v[3] * 255)
                local x1, y1 = sampTextdrawGetLetterSizeAndColor(2)
                local newcolortd = '0xFF' .. ('%06X'):format(clrtd)
                sampTextdrawSetLetterSizeAndColor(2, x1, y1, newcolortd)
            end
    end
        if imgui.CollapsingHeader(u8'Цвета второго текстдрава(Project)', imgui.ImVec2(100, 50)) then
            imgui.SameLine()
            imgui.TextQuestion(u8'Позволяет изменить цвет первого текстдрава')
            if imgui.ColorEdit3(u8'Выбор цвета 2 текстдрава', colortd_2) then
                clrtd_2 = join_argb(0, colortd_2.v[1] * 255, colortd_2.v[2] * 255, colortd_2.v[3] * 255)
                local x2, y2 = sampTextdrawGetLetterSizeAndColor(3)
                local newcolortd = '0xFF' .. ('%06X'):format(clrtd_2)
                sampTextdrawSetLetterSizeAndColor(3, x2, y2, newcolortd)
            end



if imgui.Button(u8'Сохранить', imgui.ImVec2(90, 25)) then
                mainIni.textdraws.textdraw1 = pears
                mainIni.textdraws.textdraw2 = project
                if inicfg.save(mainIni, directIni) then
                end
                if sampTextdrawIsExists(2) and sampTextdrawIsExists(3) then
                    sampTextdrawSetString(2, mainIni.textdraws.textdraw1)
                    sampTextdrawSetString(3, mainIni.textdraws.textdraw2)
                    sampAddChatMessage("Успешно сохранено, первый текстдрав "..mainIni.textdraws.textdraw1..". Второй текстдрав "..mainIni.textdraws.textdraw2, -1)
                end
            end
 

Demmy

Участник
121
22
Как сделать последовательную загрузку типа нужно скачать файл по ссылке(кфг), взять из него значения и вставить в переменные? Если в функции значения переменных ставлю - не робит почему-то
 

Gruzin Gang

Всефорумный Грузин
823
608
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как сделать последовательную загрузку типа нужно скачать файл по ссылке(кфг), взять из него значения и вставить в переменные? Если в функции значения переменных ставлю - не робит почему-то
скрипт ставь мб помогут (het)
 

MrBidloKoder

Известный
423
249
Щас уже иду спать и не могу уснуть из за одного вопроса....
function main()
.........
object = createObject(не нужная инфа)
end

object можно будет юзать в других функциях? т.е то что создам в main можно будет юзать везде?
 
  • Нравится
Реакции: user390868

Gruzin Gang

Всефорумный Грузин
823
608
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Щас уже иду спать и не могу уснуть из за одного вопроса....
function main()
.........
object = createObject(не нужная инфа)
end

object можно будет юзать в других функциях? т.е то что создам в main можно будет юзать везде?
я мб тебя не так понял но после local object = createobject писав это в начале можно будет использовать и потом
если не то то дополни
upd: уже комп оффаю иду спать пиши vk/gru31n или дискорд Gruzin#8426
 
  • Влюблен
  • Нравится
Реакции: MrBidloKoder и user390868

neverlane

t.me/neverlane00
Друг
1,010
1,161
Щас уже иду спать и не могу уснуть из за одного вопроса....
function main()
.........
object = createObject(не нужная инфа)
end

object можно будет юзать в других функциях? т.е то что создам в main можно будет юзать везде?
Можно, если переменная будет не локальная
Lua:
local param = 'q' --локальная переменная
param = 'q' --глобальная переменная
 
  • Влюблен
  • Нравится
Реакции: user390868 и MrBidloKoder

S-Sirius

Известный
351
21
Можно как то делать автоматическую регулировку размера окна imgui, чтобы размер окна настроился автоматически в зависимости от строк в окне?
Т.е. у меня некоторые строки в окно должны появится и исчезать с окна при включении/выключении определённых функции но надо делать так чтобы все строки помещались в окно не не было много свободного место в окно
 

neverlane

t.me/neverlane00
Друг
1,010
1,161
Можно как то делать автоматическую регулировку размера окна imgui, чтобы размер окна настроился автоматически в зависимости от строк в окне?
Т.е. у меня некоторые строки в окно должны появится и исчезать с окна при включении/выключении определённых функции но надо делать так чтобы все строки помещались в окно не не было много свободного место в окно
Флаг для окна imgui.WindowFlags.AlwaysAutoResize
 
  • Влюблен
  • Нравится
Реакции: S-Sirius и darkjer

frit

Известный
389
174
Как сделать последовательную загрузку типа нужно скачать файл по ссылке(кфг), взять из него значения и вставить в переменные? Если в функции значения переменных ставлю - не робит почему-то
downloadUrlToFile(url, filename)
 

S-Sirius

Известный
351
21
Флаг для окна imgui.WindowFlags.AlwaysAutoResize
Спасибо, окно теперь автоматически меняет размер, но теперь не работает imgui.SameLine(nil, 10) (нет отступа), с этим можно что то делать? Или поставить первоначальный размер окна чтобы меньше этого она не было
 
У

Удалённый пользователь 341712

Гость
Спасибо, окно теперь автоматически меняет размер, но теперь не работает imgui.SameLine(nil, 10) (нет отступа), с этим можно что то делать? Или поставить первоначальный размер окна чтобы меньше этого она не было
imgui.SameLine() дает место для следующего текста, если его нет, то и отступа не будет
 

NoName_001

Участник
152
21
Встал в афк - вышел - пришли все сообщения от сервера за время, которое я был в афк. Мне нужно сделать так, чтобы onServerMessage не работал после афк(т.е. скрипт не должен видеть те сообщения, которые пришли за время паузы). Как это оформить?
 

CaJlaT

Овощ
Модератор
2,824
2,655
Встал в афк - вышел - пришли все сообщения от сервера за время, которое я был в афк. Мне нужно сделать так, чтобы onServerMessage не работал после афк(т.е. скрипт не должен видеть те сообщения, которые пришли за время паузы). Как это оформить?
Lua:
if not isGamePaused() then
    --code
end