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

Heav

Активный
185
71
Lua:
local time = {
   '0:00', '2:00', '4:00', '7:00', '0:00'
}
        imgui.Text(u8'Время')
        for i, text in pairs(time) do
            imgui.Text(u8(text))
        end
попробуй такой вариант
Спасибо! Все работает как следует. А imgui.Button() таким же образом используя таблицу можно как-то назначить разные функции? Может нужны ключи в таблице?
 

Дядя Энрик.

Активный
338
81
Спасибо! Все работает как следует. А imgui.Button() таким же образом используя таблицу можно как-то назначить разные функции? Может нужны ключи в таблице?
Замени imgui.Text() на imgui.Button(u8(text)), или что именно нужно?
 

Heav

Активный
185
71
Замени imgui.Text() на imgui.Button(u8(text)), или что именно нужно?
Да, я так и сделал. Вопрос в том, смогу ли я сделать различные функции которые будут выполняться при нажатии этих кнопок. Пример того что я имею ввиду при использовании кнопок без таблицы. По-моему для этого нужно добавить к значениям ключи в таблице, только я не совсем знаю как потом их использовать
Lua:
imgui.button(u8'Кнопка')
    sampAddChatMessage('Test', -1)
end
 

Дядя Энрик.

Активный
338
81
Да, я так и сделал. Вопрос в том, смогу ли я сделать различные функции которые будут выполняться при нажатии этих кнопок. Пример того что я имею ввиду при использовании кнопок без таблицы. По-моему для этого нужно добавить к значениям ключи в таблице, только я не совсем знаю как потом их использовать
Lua:
imgui.button(u8'Кнопка')
    sampAddChatMessage('Test', -1)
end
Lua:
        for i, text in pairs(time) do
            if imgui.Button(u8(text)) then
                sampAddChatMessage('Вы нажали '..text..':', -1)
            end
        end
тип так ?
 
  • Нравится
Реакции: Heav

ChаtGPT

Активный
397
96
Добрый вечер.
У меня есть задача: Необходимо сделать проверку и сравнить цвет игрока и цвет ганг зоны, на которой он находится. Я не могу понять, почему выходит 2 разных цвета, пытался конвертировать, тоже самое. Цвет ника - красный, цвет территории - красный, проверка не проходит, не знаю что делать.

Код:
local gang_zone_color
local set_player_color
local zones = {}

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('getgz', function()
        local zone = getPlayerGangZone(PLAYER_PED)
        print('onSetPlayerColor: '..set_player_color..' hex_to_argb: '..hex_to_argb(set_player_color))
        print('onCreateGangZone: '..gang_zone_color..' hex_to_argb: '..hex_to_argb(gang_zone_color))
        if gang_zone_color == set_player_color then
             print('+')
        end
    end)
    wait(-1)
end

function sampev.onCreateGangZone(zoneId, squareStart, squareEnd, color)
    zones[zoneId] = {
        from = squareStart,
        to = squareEnd
    }
    gang_zone_color = color -- Получаю и записываю цвет ганг зоны
end

---@param ped any Player handle
---@return number | nil id
function getPlayerGangZone(ped)
    for id, data in pairs(zones) do
        if isCharInArea3d(ped, data.from.x, data.from.y, -100, data.to.x, data.to.y, 1000, false) then  -- 00A4
            return id
        end
    end
end


function sampev.onSetPlayerColor(playerID, color) -- Вызывается каждый раз, когда у любого игрока на сервере меняется цвет
    local result, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- Получаем id нашего персонажа
    if id == playerID then -- Проверяем, если id того персонажа, у которого изменился цвет совпадает с id нашего персонажа
        local ccolr = sampGetPlayerColor(PLAYER_PED)
        set_player_color = color
      sampAddChatMessage("onSetPlayerColor| "..color..' |sampGetPlayerColor| '..ccolr, 16777215) -- Добавляем в чат строчку о том, что изменился цвет. Второй аргумент - цвет (16777215 - FFFFFF (белый) в десятичной системе счисления)
    end
end




function join_argb(a, r, g, b)
    local argb = b  -- b
    argb = bit.bor(argb, bit.lshift(g, 8))  -- g
    argb = bit.bor(argb, bit.lshift(r, 16)) -- r
    argb = bit.bor(argb, bit.lshift(a, 24)) -- a
    return argb
end

function hex_to_argb(hex)
    local a, r, g, b = explode_argb(tonumber(hex, 16))
    return a, r, g, b
end

function explode_argb(argb)
    local a = bit.band(bit.rshift(argb, 24), 0xFF)
    local r = bit.band(bit.rshift(argb, 16), 0xFF)
    local g = bit.band(bit.rshift(argb, 8), 0xFF)
    local b = bit.band(argb, 0xFF)
    return a, r, g, b
end
помогите плес
 

tsunamiqq

Участник
433
17
dl:AddRect(p, imgui.ImVec2(p.x + size.x, p.y + size.y), color.temp_color, rounding, nil, 2) --обводка toggle
если используешь custom_togglebutton цифру 2 повышай или 0 поставь это обводка
у меня не custom_togglebutton

Вот мой:

Lua:
function imgui.ToggleButton(str_id, bool)
    local anim_speed = 0.1
    local function ImSaturate(f) return f < 0.0 and 0.0 or (f > 1.0 and 1.0 or f) end
    if LastActiveTime == nil then LastActiveTime = {} end
    if LastActive == nil then LastActive = {} end
    local rBool = false
    local p = imgui.GetCursorScreenPos()
    local height = 20
    local width = height * 1.55
    local radius = height * 0.50
    if imgui.InvisibleButton(str_id, imgui.ImVec2(width, height)) then
        bool[0] = not bool[0]
        rBool = true
        LastActiveTime[tostring(str_id)] = os.clock()
        LastActive[tostring(str_id)] = true
    end
    local t = bool[0] and 1.0 or 0.0
    if LastActive[str_id] then
        local time = os.clock() - LastActiveTime[tostring(str_id)]
        if time <= anim_speed then
           local t_anim = ImSaturate(time / anim_speed)
           t = bool[0] and t_anim or 1.0 - t_anim
        else
           LastActive[str_id] = false
        end
     end
    local col_bg = imgui.ColorConvertFloat4ToU32(imgui.ImVec4(100 / 255, 100 / 255, 100 / 255, imgui.IsItemHovered() and 220 or 180 / 255))
    imgui.GetWindowDrawList():AddRectFilled(
        imgui.ImVec2(p.x, p.y + (height / 8)),
        imgui.ImVec2(p.x + width, p.y + (height - (height / 8))),
        col_bg, 10
    )
    imgui.GetWindowDrawList():AddRectFilled(
        imgui.ImVec2(p.x + (bool[0] and radius / 2 or 0) + t * (width - radius * 2.0), p.y + (height / 8)),
        imgui.ImVec2(p.x + (bool[0] and 30 or 15), p.y + (height - (height / 8))),
        imgui.ColorConvertFloat4ToU32(imgui.GetStyle().Colors[imgui.Col.Text]),
        6, 1 + (bool[0] and 9 or 4)
    )
    return rBool
end

Можете дать типу такой кнопки для mimgui
206453
 
Последнее редактирование:

Дядя Энрик.

Активный
338
81
у меня не custom_togglebutton

Вот мой:

Lua:
function imgui.ToggleButton(str_id, bool)
    local anim_speed = 0.1
    local function ImSaturate(f) return f < 0.0 and 0.0 or (f > 1.0 and 1.0 or f) end
    if LastActiveTime == nil then LastActiveTime = {} end
    if LastActive == nil then LastActive = {} end
    local rBool = false
    local p = imgui.GetCursorScreenPos()
    local height = 20
    local width = height * 1.55
    local radius = height * 0.50
    if imgui.InvisibleButton(str_id, imgui.ImVec2(width, height)) then
        bool[0] = not bool[0]
        rBool = true
        LastActiveTime[tostring(str_id)] = os.clock()
        LastActive[tostring(str_id)] = true
    end
    local t = bool[0] and 1.0 or 0.0
    if LastActive[str_id] then
        local time = os.clock() - LastActiveTime[tostring(str_id)]
        if time <= anim_speed then
           local t_anim = ImSaturate(time / anim_speed)
           t = bool[0] and t_anim or 1.0 - t_anim
        else
           LastActive[str_id] = false
        end
     end
    local col_bg = imgui.ColorConvertFloat4ToU32(imgui.ImVec4(100 / 255, 100 / 255, 100 / 255, imgui.IsItemHovered() and 220 or 180 / 255))
    imgui.GetWindowDrawList():AddRectFilled(
        imgui.ImVec2(p.x, p.y + (height / 8)),
        imgui.ImVec2(p.x + width, p.y + (height - (height / 8))),
        col_bg, 10
    )
    imgui.GetWindowDrawList():AddRectFilled(
        imgui.ImVec2(p.x + (bool[0] and radius / 2 or 0) + t * (width - radius * 2.0), p.y + (height / 8)),
        imgui.ImVec2(p.x + (bool[0] and 30 or 15), p.y + (height - (height / 8))),
        imgui.ColorConvertFloat4ToU32(imgui.GetStyle().Colors[imgui.Col.Text]),
        6, 1 + (bool[0] and 9 or 4)
    )
    return rBool
end

Можете дать типу такой кнопки для mimgui
206453
 

tsunamiqq

Участник
433
17

Где там менять цвет?
 

chromiusj

average yakuza perk user
Модератор
5,681
3,991
Как создать текстдрав на экране допустим из игровых моделек? Нашел урок только для павно,а желательно бы для luaбля
 

ChаtGPT

Активный
397
96
Как создать текстдрав на экране допустим из игровых моделек? Нашел урок только для павно,а желательно бы для luaбля
Используй render,
renderDrawTexture, renderDrawBox,
renderDrawPolygon
и т.д
 
D

deleted-user-139653

Гость
Как создать текстдрав на экране допустим из игровых моделек? Нашел урок только для павно,а желательно бы для luaбля
Сообщение в теме 'Вопросы по Lua скриптингу' https://www.blast.hk/threads/13892/post-1223287
 
  • Нравится
Реакции: chromiusj

ARMOR

I felt like I was in another dimension
Модератор
4,972
6,908
Как создать текстдрав на экране допустим из игровых моделек? Нашел урок только для павно,а желательно бы для luaбля
В отличии от того что кинули выше - можно поворачивать модель и т.д
 

chromiusj

average yakuza perk user
Модератор
5,681
3,991
В отличии от того что кинули выше - можно поворачивать модель и т.д
Мне салат ее кидал,но я так и не разобрался как с этим секситься,сделай пожалуйста как будет выглядеть код рисующий допустим любую иконку карты,если это возможно
 
  • Нравится
Реакции: deleted-user-139653