Информация Ответы на часто задаваемые вопросы [FAQ]

AnWu

Известный
Автор темы
Всефорумный модератор
4,777
5,399
Тема является сборником ответов на вопросы по Lua-скриптингу.

Правила темы:
  • Ответ не должен повторяться. В случае если ваше решение лучше - оставьте ссылку на устаревшее решение вопроса в этой теме вместе со своим ответом, модераторы его заменят.
  • Не публикуйте плохие решения. Убедитесь что ваш код достаточно грамотный для решения проблемы.
  • По возможности оставляйте каждый ответ в отдельный пост. В будущем для направления человека на решение оставьте ссылку на пост.
  • Любые сообщения не связанные с ответом на вопрос являются оффтопом.
  • В случае если вы не согласны с каким-то из ответов в теме - оставьте жалобу на пост.
Код-форма решения вопроса:
[b]Вопрос:[/b] *текст*
[b]Ответ:[/b] *пояснение ответа, как можно подробней*
[code=lua]*код*[/code]
 
Последнее редактирование:

AnWu

Известный
Автор темы
Всефорумный модератор
4,777
5,399
Вопрос:
Как при нажатии клавиши задействовать команду которая сразу отправится в чат как сообщение?
Ответ: Для решения вопроса в бесконечном цикле main (или потока если нужно) будем ожидать нажатие клавиши через isKeyJustPressed(). isKeyDown нам не подходит, т.к. при зажатии клавиши команда просто "зафлудит".
По мимо этого нам потребуется список всех клавиш, он поставляется с стандартной библиотекой vkeys.
Lua:
local vkeys = require 'vkeys' -- Подключаем библиотеку vkeys, поместим её в переменную vkeys.
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end -- Т.к. мы работаем с сампом то проверяем что сампфункс и самп загружены
    while not isSampAvailable() do wait(0) end -- Ожидаем когда самп прогрузит все основные структуры игры. Педы, транспорт, игроки и тд.
    while true do -- Бесконечный цикл
        wait(0) -- Чтобы игра не зависла при выполнении скрипта ждем каждую интерацию один кадр.
        if isKeyJustPressed(vkeys.VK_Z) then -- Проверяем что кнопка Z нажата
            sampSendChat("/mm") -- Отправляем сообщение серверу
        end
    end
end
 
  • Нравится
Реакции: Tranzit, MAHEKEH и Shawn

AnWu

Известный
Автор темы
Всефорумный модератор
4,777
5,399
Вопрос: Как получить игровую информацию о другом игроке, например его позицию.
Ответ: Для объяснения решения задачи можно пойти двумя путями, долгий где я рассказываю как работает система игры и самп, а лучше я просто скажу что нам нужно получить PED (HANDLE) персонажа, затем уже получить координаты педа.
Для примера мы создадим команду /getpos, в качестве входящего параметра будет выступать ID игрока. результатом выполнения команды будет вывод в чат текущей позиции. Начнем.
Lua:
-- Для работы скрипта не требуется каких либо библиотек. Всё что нужно это сампфункс. Все функции мы получаем из коробки.

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end -- Проверяем на загруженность СФ и самп
  while not isSampAvailable() do wait(0) end -- Ожидаем когда все структуры сампа будут готовы к работе
  sampRegisterChatCommand("getpos", function (param) -- Регистрируем команду getpos. param - содержит всё что мы передали после команды в чате
    local id = tonumber(param) -- Приобразуем строковые параметры в число, т.к. нам нужен только ИД
    if id == nil then -- Проверяем что id действительно число
      sampAddChatMessage("[GetPos] Испльзуйте: /getpos [id игрока]", -1) -- Выводим ошибку в чат
      return -- Завершаем функцию
    end
    if not sampIsPlayerConnected(id) then -- Проверяем подключен ли игрок
      sampAddChatMessage("[GetPos] Игрок не найден", -1)
      return
    end
    local result, ped = sampGetCharHandleBySampPlayerId(id) -- Получаем PED игрока по id. result - булевое значение (true/false), истина - пед найден (игрок в зоне прорисовки)
    if not result then
      sampAddChatMessage("[GetPos] Игрока нет рядом", -1)
      return
    end
    local x, y, z = getCharCoordinates(ped) -- Получаем 3Д координаты игрока
    sampAddChatMessage(("%s[%d] находится на координатах X: %0.2f | Y: %0.2f | Z: %0.2f"):format(sampGetPlayerNickname(id), id, x, y, z), 0xFFFFC801)
  end)
  wait(-1) -- Бесконечное ожидание
end

Результат:
43561
 
  • Нравится
Реакции: Tranzit, Shawn и ufdhbi

AnWu

Известный
Автор темы
Всефорумный модератор
4,777
5,399
Вопрос: Как получить уровень розыска в сампе?
Ответ: Самп использует свой показатель звезд игрока, поэтому функцией из сингла его получить нельзя
Lua:
local memory = require 'memory'

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('getlvl', function()
        wantedLevel = memory.getuint8(0x58DB60)
        sampAddChatMessage(wantedLevel, -1)
    end)
    wait(-1)
end
 
Последнее редактирование:
  • Нравится
Реакции: Shawn

AnWu

Известный
Автор темы
Всефорумный модератор
4,777
5,399
Вопрос: Как получить объект между игроком и точкой в пространстве
Ответ: код получает автомобиль между педом и точкой сдвинутой на 10 юнитов по x
Lua:
posX, posY, posZ = getCharCoordinates(PLAYER_PED)
ppX = posX+10
result1, colPoint = processLineOfSight(posX, posY, posZ, ppX, posY, posZ, false, true, false, false, false, false, false, false)
if result1 and colPoint.entityType == 2 then
    car = getVehiclePointerHandle(colPoint.entity)
    modelId = getCarModel(car)
    sampAddChatMessage(modelId)
end
 
Последнее редактирование:

Бубликов И.И

Потрачен
37
13
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Вопрос: Как поймать новое сообщение из чата в SAMP?
Ответ: Воспользуемся библиотекой SAMP.lua, чтобы перехватить входящий RPC и облегчить себе работу
Lua:
local events = require("samp.events")

function events.onServerMessage(color, msg)
    print(msg) -- выводим сообщение из чата в лог SAMPFUNCS
end
 
  • Нравится
Реакции: SerakD, poposhka и AnWu

Double Tap Inside

Известный
Проверенный
1,916
1,256
Вопрос: как убрать стандартный диалог помощи SAMP с клавиши F1
Ответ: подключить модуль memory и воспользоваться примером ниже.

Lua:
memory = require("memory")

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(0) end

    -- Ноп показа диалога
    memory.setuint8(sampGetBase() + 0x67450, 0xC3, true)
end
 
Последнее редактирование модератором:

AnWu

Известный
Автор темы
Всефорумный модератор
4,777
5,399
Вопрос:
Помогите.
У меня есть функция мне нужно сделать так что бы она каждые 5 минут срабатывала. Как это реализовать? Подскажите пожалуйста
Ответ: Устанавливать кастомный таймер на 5 минут и в бесконечном цикле проверять этот таймер. Если время пришло -> вызвать функцию -> установить новый таймер на 5 минут
Lua:
local timer = -1
function main()
    while true do
      wait(0)
      local nowTime = os.time()
      if nowTime >= timer then
        exampleFunc()
        timer = nowTime + 300
      end
    end
end
function exampleFunc()
  print("Right now")
end
 
Последнее редактирование:

AnWu

Известный
Автор темы
Всефорумный модератор
4,777
5,399
Вопрос:
Как через луа поймать момент, что игра свернута.
Типо включена работа в оконном режиме , ты свернул игру и этот момент нужно как то поймать, чтобы луа мог определить что игра свернута.

Ответ: Для решения задачи используем хук оконных сообщений onWindowMessage и отловим событие WM_KILLFOCUS. Оно вызывается при потере окном фокуса.
Lua:
local wm = require 'lib.windows.message' -- Библиотека с списком оконных сообщений

function onWindowMessage(msg, wparam, lparam)
-- msg содержит нужное нам событие
    if msg == wm.WM_KILLFOCUS then -- обрабатываем только WM_KILLFOCUS
        print("Press F to pay Respect") -- При потере фокуса пишем что-то в лог
    end
end
 

PanSeek

t.me/dailypanseek
Всефорумный модератор
908
1,776
Вопрос: Как закрыть imgui окно на клавишу "ESC"?
Ответ: Нужно использовать событие оконных сообщений "onWindowMessage" и отлавливать событие "WM_KEYUP" - вызывается при отжатии клавиши и "WM_KEYDOWN" - вызывается при нажатии клавиши (подробнее про WM_KEYDOWN и подробнее про WM_KEYUP). Также понадобится "consumeWindowMessage" - игнорирует текущее оконное сообщение (подробнее).
Все в одном событии "WM_KEYDOWN" не сделать, так как может быть баг с input.
Lua:
local wm = require 'lib.windows.message' -- Библиотека с оконными сообщениями
local vkeys = require 'vkeys' -- Библиотека с клавишами
function onWindowMessage(msg, wparam, lparam) -- Hook "onWindowMessage"
    if wparam == vkeys.VK_ESCAPE and window[0] then
    --[[
        wparam == vkeys.VK_ESCAPE - Сама клавиша
        window[0] - ImGui переменная отвечающая за рисование окна (в данном случае, если окно "true")
        Если условия соблюдены:
    ]]
        if msg == wm.WM_KEYDOWN then -- это событие отвечает за нажатие клавиши
            consumeWindowMessage(true, false) -- Текущее оконное сообщение помечаем для игнорирования
            --[[
                Первый аргумент - игнорируем нажатие кнопки ESCAPE для окна (чтобы не открылось "Главное меню" игры)
                Второй аргумент - не игнорируем сообщение для Lua скриптов
            ]]
        end
        if msg == wm.WM_KEYUP then -- это событие отвечает за отжатие клавиши
            window[0] = false -- Переменную отвечающая за рисование окна ставим в "false", чтобы окно перестало рисоваться
        end
    end
end
 
Последнее редактирование:

PanSeek

t.me/dailypanseek
Всефорумный модератор
908
1,776
Вопрос: Как сделать вкладки в ImGui меню?
Ответ: Нам нужно использовать moonimgui (Версия 1.52) или mimgui (Версия 1.72).
Необязательно: Также буду использовать событие оконных сообщений (onWindowMessage) и библиотеку с клавишами (vkeys).
Способ:
if imgui.BeginTabBar('Tabs') then -- Создание Tab Bar'а, то есть вкладок сверху
    if imgui.BeginTabItem('Tab 1') then -- Создаем новый Item в данный Tab Bar и передаем ему в аргумент наименование
        imgui.Text('Tab 1') -- Вывод текста во "вкладке"
        imgui.EndTabItem() -- Закрытие данного Item'а
    end
    if imgui.BeginTabItem('Tab 2') then -- Тоже самое, что и выше, только другое наименование Item'а
        imgui.Text('Tab 2')
        imgui.Text('Tab 2')
        imgui.EndTabItem()
    end
    if imgui.BeginTabItem('Tab 3') then -- Тоже самое, что и выше, только другое наименование Item'а
        imgui.Text('Tab 3')
        imgui.Text('Tab 3')
        imgui.Text('Tab 3')
        imgui.EndTabItem()
    end
    imgui.EndTabBar() -- Закрытие Всего Tab Bar'а
end
Весь скрипт:
local imgui = require 'mimgui'
local wm = require 'windows.message'
local vkeys = require 'vkeys'

local sw, sh = 200, 200
local active = imgui.new.bool(false)
local checkbox = imgui.new.bool(false)

function onWindowMessage(msg, wparam, lparam)
    if msg == wm.WM_KEYUP and wparam == vkeys.VK_F2 then
        active[0] = not active[0]
    end
end

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
    imgui.StyleColorsLight()
end)

local mainFrame = imgui.OnFrame(function() return active[0] end, function(self)
    imgui.SetNextWindowSize(imgui.ImVec2(sw, sh), imgui.Cond.FirstUseEver)
    imgui.Begin('Testing', active)
    if imgui.BeginTabBar('Tabs') then
        if imgui.BeginTabItem('Tab 1') then
            imgui.Text('Tab 1')
            imgui.EndTabItem()
        end
        if imgui.BeginTabItem('Tab 2') then
            imgui.Text('Tab 2')
            imgui.Checkbox('Tab 2', checkbox)
            imgui.EndTabItem()
        end
        if imgui.BeginTabItem('Tab 3') then
            imgui.Text('Tab 3')
            imgui.Checkbox('Tab 3', checkbox)
            imgui.Checkbox('Tab 3##2', checkbox)
            imgui.EndTabItem()
        end
        imgui.EndTabBar()
    end
    imgui.End()
end)
1_1.png
1_2.png
1_3.png
Способ:
-- Вне frame создал: local tab = 0
if imgui.Button('Tab 1') then -- Создаем проверку на нажатие кнопки
    tab = 0 -- Если кнопка была нажата, то переменной tab передаем 0
end
imgui.SameLine() -- Рисовать следующий элемент на этой же строке
if imgui.Button('Tab 2') then
    tab = 1 -- Если кнопка была нажата, то переменной tab передаем 1
end
imgui.SameLine()
if imgui.Button('Tab 3') then
    tab = 2
end

if tab == 1 then -- Если tab равен 1, то рисуем BeginChild
    imgui.BeginChild('tabs2', imgui.ImVec2(140, 140), true)
    imgui.Text('Tab 2') -- Выводим текст
    imgui.Text('Tab 2')
    imgui.EndChild() -- Закрываем Child
elseif tab == 2 then -- Также как и сверху, но с другим значением переменной
    imgui.BeginChild('tabs3', imgui.ImVec2(140, 140), true)
    imgui.Text('Tab 3')
    imgui.Text('Tab 3')
    imgui.Text('Tab 3')
    imgui.EndChild()
else -- Если tab не равен ничему, что описано выше
    imgui.BeginChild('tabs1', imgui.ImVec2(140, 140), true)
    imgui.Text('Tab 1')
    imgui.EndChild()
end
mimgui:
local imgui = require 'mimgui'
local wm = require 'windows.message'
local vkeys = require 'vkeys'

local sw, sh = 160, 200
local tab = 0
local active = imgui.new.bool(false)
local checkbox = imgui.new.bool(false)

function onWindowMessage(msg, wparam, lparam)
    if msg == wm.WM_KEYUP and wparam == vkeys.VK_F2 then
        active[0] = not active[0]
    end
end

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
    imgui.StyleColorsLight()
end)

local mainFrame = imgui.OnFrame(function() return active[0] end, function(self)
    imgui.SetNextWindowSize(imgui.ImVec2(sw, sh), imgui.Cond.FirstUseEver)
    imgui.Begin('Testing', active)
    if imgui.Button('Tab 1') then
        tab = 0
    end
    imgui.SameLine()
    if imgui.Button('Tab 2') then
        tab = 1
    end
    imgui.SameLine()
    if imgui.Button('Tab 3') then
        tab = 2
    end

    if tab == 1 then
        imgui.BeginChild('tabs2', imgui.ImVec2(sw-20, sh-60), true)
        imgui.Text('Tab 2')
        imgui.Checkbox('Tab 2', checkbox)
        imgui.EndChild()
    elseif tab == 2 then
        imgui.BeginChild('tabs3', imgui.ImVec2(sw-20, sh-60), true)
        imgui.Text('Tab 3')
        imgui.Checkbox('Tab 3', checkbox)
        imgui.Checkbox('Tab 3##2', checkbox)
        imgui.EndChild()
    else
        imgui.BeginChild('tabs1', imgui.ImVec2(sw-20, sh-60), true)
        imgui.Text('Tab 1')
        imgui.EndChild()
    end
    imgui.End()
end)
moonimgui:
local imgui = require 'imgui'
local wm = require 'windows.message'
local vkeys = require 'vkeys'

local sw, sh = 200, 200
local active = imgui.ImBool(false)
local checkbox = imgui.ImBool(false)

function onWindowMessage(msg, wparam, lparam)
    if msg == wm.WM_KEYUP and wparam == vkeys.VK_F2 then
        active.v = not active.v
        imgui.Process = active.v
    end
end

function imgui.OnDrawFrame()
    imgui.SetNextWindowSize(imgui.ImVec2(sw, sh), imgui.Cond.FirstUseEver)
    imgui.Begin('Testing', active)
    if imgui.Button('Tab 1') then
        tab = 0
    end
    imgui.SameLine()
    if imgui.Button('Tab 2') then
        tab = 1
    end
    imgui.SameLine()
    if imgui.Button('Tab 3') then
        tab = 2
    end

    if tab == 1 then
        imgui.BeginChild('tabs2', imgui.ImVec2(sw-20, sh-60), true)
        imgui.Text('Tab 2')
        imgui.Checkbox('Tab 2', checkbox)
        imgui.EndChild()
    elseif tab == 2 then
        imgui.BeginChild('tabs3', imgui.ImVec2(sw-20, sh-60), true)
        imgui.Text('Tab 3')
        imgui.Checkbox('Tab 3', checkbox)
        imgui.Checkbox('Tab 3##2', checkbox)
        imgui.EndChild()
    else
        imgui.BeginChild('tabs1', imgui.ImVec2(sw-20, sh-60), true)
        imgui.Text('Tab 1')
        imgui.EndChild()
    end
    imgui.End()
end
2_m1.png
2_m2.png
2_m3.png
2_i1.png
2_i2.png
2_i3.png
Способ:
-- Вне frame создал: local tab = 0
imgui.BeginChild('tabs', imgui.ImVec2(60, 140), true) -- Создаем BeginChild для "вкладок"
if imgui.Button('Tab 1') then -- Создаем проверку на нажатие кнопки
    tab = 0 -- Если кнопка была нажата, то переменной tab передаем 0
end
if imgui.Button('Tab 2') then
    tab = 1 -- Если кнопка была нажата, то переменной tab передаем 1
end
if imgui.Button('Tab 3') then
    tab = 2
end
imgui.EndChild() -- Закрываем данный Child
imgui.SameLine() -- Отступаем от Item'а и рисуем на той же строке
if tab == 1 then -- Если tab равен 1, то рисуем BeginChild
    imgui.BeginChild('tabs2', imgui.ImVec2(140, 140), true)
    imgui.Text('Tab 2') -- Выводим текст
    imgui.Text('Tab 2')
    imgui.EndChild() -- Закрываем Child
elseif tab == 2 then -- Также как и сверху, но с другим значением переменной
    imgui.BeginChild('tabs3', imgui.ImVec2(140, 140), true)
    imgui.Text('Tab 3')
    imgui.Text('Tab 3')
    imgui.Text('Tab 3')
    imgui.EndChild()
else -- Если tab не равен ничему, что описано выше
    imgui.BeginChild('tabs1', imgui.ImVec2(140, 140), true)
    imgui.Text('Tab 1')
    imgui.EndChild()
end
mimgui:
local imgui = require 'mimgui'
local wm = require 'windows.message'
local vkeys = require 'vkeys'

local sw, sh = 160, 200
local tab = 0
local active = imgui.new.bool(false)
local checkbox = imgui.new.bool(false)

function onWindowMessage(msg, wparam, lparam)
    if msg == wm.WM_KEYUP and wparam == vkeys.VK_F2 then
        active[0] = not active[0]
    end
end

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
    imgui.StyleColorsLight()
end)

local mainFrame = imgui.OnFrame(function() return active[0] end, function(self)
    imgui.SetNextWindowSize(imgui.ImVec2(sw, sh), imgui.Cond.FirstUseEver)
    imgui.Begin('Testing', active)
    imgui.BeginChild('tabs', imgui.ImVec2(sw-100, sh-60), true)
    if imgui.Button('Tab 1') then
        tab = 0
    end
    if imgui.Button('Tab 2') then
        tab = 1
    end
    if imgui.Button('Tab 3') then
        tab = 2
    end
    imgui.EndChild()
    imgui.SameLine()
    if tab == 1 then
        imgui.BeginChild('tabs2', imgui.ImVec2(sw-90, sh-60), true)
        imgui.Text('Tab 2')
        imgui.Checkbox('Tab 2', checkbox)
        imgui.EndChild()
    elseif tab == 2 then
        imgui.BeginChild('tabs3', imgui.ImVec2(sw-90, sh-60), true)
        imgui.Text('Tab 3')
        imgui.Checkbox('Tab 3', checkbox)
        imgui.Checkbox('Tab 3##2', checkbox)
        imgui.EndChild()
    else
        imgui.BeginChild('tabs1', imgui.ImVec2(sw-90, sh-60), true)
        imgui.Text('Tab 1')
        imgui.EndChild()
    end
    imgui.End()
end)
moonimgui:
local imgui = require 'imgui'
local wm = require 'windows.message'
local vkeys = require 'vkeys'

local sw, sh = 200, 200
local active = imgui.ImBool(false)
local checkbox = imgui.ImBool(false)

function onWindowMessage(msg, wparam, lparam)
    if msg == wm.WM_KEYUP and wparam == vkeys.VK_F2 then
        active.v = not active.v
        imgui.Process = active.v
    end
end

function imgui.OnDrawFrame()
    imgui.SetNextWindowSize(imgui.ImVec2(sw, sh), imgui.Cond.FirstUseEver)
    imgui.Begin('Testing', active)
    imgui.BeginChild('tabs', imgui.ImVec2(sw-140, sh-60), true)
    if imgui.Button('Tab 1') then
        tab = 0
    end
    if imgui.Button('Tab 2') then
        tab = 1
    end
    if imgui.Button('Tab 3') then
        tab = 2
    end
    imgui.EndChild()
    imgui.SameLine()
    if tab == 1 then
        imgui.BeginChild('tabs2', imgui.ImVec2(sw-90, sh-60), true)
        imgui.Text('Tab 2')
        imgui.Checkbox('Tab 2', checkbox)
        imgui.EndChild()
    elseif tab == 2 then
        imgui.BeginChild('tabs3', imgui.ImVec2(sw-90, sh-60), true)
        imgui.Text('Tab 3')
        imgui.Checkbox('Tab 3', checkbox)
        imgui.Checkbox('Tab 3##2', checkbox)
        imgui.EndChild()
    else
        imgui.BeginChild('tabs1', imgui.ImVec2(sw-90, sh-60), true)
        imgui.Text('Tab 1')
        imgui.EndChild()
    end
    imgui.End()
end
3_m1.png
3_m2.png
3_m3.png
3_i1.png
3_i2.png
3_i3.png
 

Вложения

  • 2_m1.png
    2_m1.png
    3.8 KB · Просмотры: 43

kizn

\ 0 _ 0 /
Всефорумный модератор
2,407
2,108
Вопрос: Почему функция setAudioStreamState не воспроизводит звук?
Ответ: Для решения данной проблемы необходимо включить звук радио в настройках игры и перезапустить игру. Также на работоспособность этой функции могут влиять скрипты/плагины, полностью выпиливающие радио из игры.
 
  • Нравится
Реакции: PanSeek

Lenny Adams

Участник
97
5
Вопрос: Как сделать допустим что бы на координатах x1040 y1600 z8 скрипт жмякал альи и какое у него название в VKeys?
 
Последнее редактирование:
  • Эм
Реакции: lorgon

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,798
2,659
Вопрос:
Вопрос: Как сделать допустим что бы на координатах x1040 y1600 z8 скрипт жмякал альи
Ответ: В бесконечном цикле делаешь проверку на то, что дистанция между локальным игроком и нужными координатами < 1, и если условие выполняется, делаешь доп. проверку, которая не дает флудить альтом. Если все проверки пройдены, записываешь в переменную keys айди ALT'а. После чего обновляешь свою онфут синхру. В конце кода стоит обработчик, который как раз таки перезаписывает синхру, которую мы обновили, тем самым отправляя нажатие кнопки серверу.
Lua:
local sampev = require("samp.events")


local actived, key
local x, y, z = 1040, 1600, 8

-- в бесконечном цикле
if (getDistanceBetweenCoords3d(x, y, z, getCharCoordinates()) < 1) then
    if actived then
        key = 1024
        sampForceOnfootSync()
        actived = false
    end
else
    actived = false
end
--

function sampev.onSendPlayerSync(data)
    if key then
        data.keysData = key
        key = nil
    end
end

Вопрос:
какое у него название в VKeys?
Ответ: VK_MENU
 
Последнее редактирование:

nivycvv

Участник
118
11
Вопрос, как сменить цвет имгуи менюшки?Сейчас он желтый,я хочу красный ,
1707634565964.png
по windowsbg только такое