Исходник [ImGui] Pie

MedvedCrack

Новичок
7
1
Форматирование кода
Уже второй час сижу, не вижу ошибки.
orgInfo.org_rangs[1] -- Это "Стажёр" в u8 кодировке


if use_window_general.v then
imgui.OpenPopup('PieMenu')
if pie.BeginPiePopup('PieMenu', 1) then
if pie.PieMenuItem(u8'Вылечить\nигрока') then end
if pie.PieMenuItem(u8'Выдать\nМед. карту') then end
if pie.PieMenuItem(u8'Снять\nтату') then end
if pie.PieMenuItem(u8'Выдать \nрецепт') then end
if pie.BeginPieMenu(u8'Старший\nсостав') then
if pie.BeginPieMenu(u8'Повысить') then
if orgInfo.org_rangs[1] == nil then
if pie.PieMenuItem(u8'Ошибка') then end
else
if pie.PieMenuItem(orgInfo.org_rangs[1]) then
print("ЦЕ ПЫЗДА")
end
end
pie.EndPieMenu()
end
pie.EndPieMenu()
end
pie.EndPiePopup()
end
end
 

Poloman

Новичок
2
0
Тут проблемка.Скриптер каторый это взял и добовил в биндер.В биндере сказанно,нажмите атл-Е потом зажмите ПКМ.Не х*я не робит.Не ток там в МВДхелпере а ещё и в других.Может косяк у вас,и сможете помочь мне?
 

Bananious

Известный
238
17
Можно сделать биндер, например такой бежишь нажимаешь q , а там заюзать аптечку , нарко и.т.д.
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,133
Привет. Решил склепать что-нибудь с помощью данной либы, но столкнулся с проблемой, что нужно вручную прописывать названия для элементов, а также функции, да и создавать саб-меню в некоторых моментах было просто не удобно. Было принято решение создать массив, который работал бы примерно также, как в реализации FYP'овских диалогов - на самом деле очень интересный механизм. В конечном итоге всё было написано и имело работоспособный вид. Начнём.

Сначала, как и всегда, в начале кода создаём переменные:
Lua:
local pie_mode = imgui.ImBool(true) -- режим PieMenu
local pie_keyid = 2 -- 0 ЛКМ, 1 ПКМ, 2 СКМ
local pie_elements =
{
  {name = 'Сказать привет', action = function() sampSendChat('Привет.') end, next = nil},
  {name = 'Сказать пока', action = function() sampSendChat('Пока.') end, next = nil},
  {name = 'Сказать что-то', action = function() end, next = {
    {name = 'Сказать как дела', action = function() sampSendChat('Как дела.') end, next = nil},
    {name = 'Сказать ку-ку', action = function() sampSendChat('Ку-ку.') end, next = nil},
    {name = 'Сказать дароу', action = function() sampSendChat('Дароу.') end, next = nil}
  }}
}
Как мы видим, у нас есть три переменные. Переменная pie_mode отвечает за активность нашего меню. Если ровнять эту переменную к false, то меню просто напросто не будет появляться. Потом идёт pie_keyid, которая равна два. Эта переменная задаёт кнопку мыши, по которой будет открываться меню. После идёт массив pie_elements, который содержит все настройки элементов меню. Всё просто: name - название текущего элемента, action - функция текущего элемента, next - следующие элементы, если речь идёт о саб-меню. Кстати, если next содержит в себе таблицу, то action не выполняется, так что функцию можно оставить пустой. Теперь переходим в main и добавляем в одно из условий imgui.Process переменную pie_mode.v, чтобы ImGUI был активен - думаю, что это понятно. Переходим в imgui.onDrawFrame - тут самое интересное. Добавляем в самый конец функции это:
Lua:
if pie_mode.v then
    if imgui.IsMouseClicked(pie_keyid) then imgui.OpenPopup('PieMenu') end
    if pie.BeginPiePopup('PieMenu', pie_keyid) then
      for k, v in ipairs(pie_elements) do
        if v.next == nil then if pie.PieMenuItem(u8(v.name)) then v.action() end
        elseif type(v.next) == 'table' then drawPieSub(v) end
      end
      pie.EndPiePopup()
    end
end
Также не забудьте привести вашу мышку в состояние и указать, что активироваться нужно только, если активен pie_mode.v и зажата кнопка активации. Если у вас уже есть ShowCursor, то добавляем в конец условия.
Lua:
imgui.ShowCursor = (pie_mode.v and imgui.IsMouseDown(pie_keyid))
Осталось немного - дописать функцию построения саб-меню. Дописываем в конец скрипта:
Lua:
function drawPieSub(v)
  if pie.BeginPieMenu(u8(v.name)) then
    for i, l in ipairs(v.next) do
      if l.next == nil then
        if pie.PieMenuItem(u8(l.name)) then l.action() end
      elseif type(l.next) == 'table' then
        drawPieSub(l)
      end
    end
    pie.EndPieMenu()
  end
end
В конечном итоге получаем вот такое вот красивое меню:
 

Flokich

Новичок
9
0
Привет. Решил склепать что-нибудь с помощью данной либы, но столкнулся с проблемой, что нужно вручную прописывать названия для элементов, а также функции, да и создавать саб-меню в некоторых моментах было просто не удобно. Было принято решение создать массив, который работал бы примерно также, как в реализации FYP'овских диалогов - на самом деле очень интересный механизм. В конечном итоге всё было написано и имело работоспособный вид. Начнём.

Сначала, как и всегда, в начале кода создаём переменные:
Lua:
local pie_mode = imgui.ImBool(true) -- режим PieMenu
local pie_keyid = 2 -- 0 ЛКМ, 1 ПКМ, 2 СКМ
local pie_elements =
{
  {name = 'Сказать привет', action = function() sampSendChat('Привет.') end, next = nil},
  {name = 'Сказать пока', action = function() sampSendChat('Пока.') end, next = nil},
  {name = 'Сказать что-то', action = function() end, next = {
    {name = 'Сказать как дела', action = function() sampSendChat('Как дела.') end, next = nil},
    {name = 'Сказать ку-ку', action = function() sampSendChat('Ку-ку.') end, next = nil},
    {name = 'Сказать дароу', action = function() sampSendChat('Дароу.') end, next = nil}
  }}
}
Как мы видим, у нас есть три переменные. Переменная pie_mode отвечает за активность нашего меню. Если ровнять эту переменную к false, то меню просто напросто не будет появляться. Потом идёт pie_keyid, которая равна два. Эта переменная задаёт кнопку мыши, по которой будет открываться меню. После идёт массив pie_elements, который содержит все настройки элементов меню. Всё просто: name - название текущего элемента, action - функция текущего элемента, next - следующие элементы, если речь идёт о саб-меню. Кстати, если next содержит в себе таблицу, то action не выполняется, так что функцию можно оставить пустой. Теперь переходим в main и добавляем в одно из условий imgui.Process переменную pie_mode.v, чтобы ImGUI был активен - думаю, что это понятно. Переходим в imgui.onDrawFrame - тут самое интересное. Добавляем в самый конец функции это:
Lua:
if pie_mode.v then
    if imgui.IsMouseClicked(pie_keyid) then imgui.OpenPopup('PieMenu') end
    if pie.BeginPiePopup('PieMenu', pie_keyid) then
      for k, v in ipairs(pie_elements) do
        if v.next == nil then if pie.PieMenuItem(u8(v.name)) then v.action() end
        elseif type(v.next) == 'table' then drawPieSub(v) end
      end
      pie.EndPiePopup()
    end
end
Также не забудьте привести вашу мышку в состояние и указать, что активироваться нужно только, если активен pie_mode.v и зажата кнопка активации. Если у вас уже есть ShowCursor, то добавляем в конец условия.
Lua:
imgui.ShowCursor = (pie_mode.v and imgui.IsMouseDown(pie_keyid))
Осталось немного - дописать функцию построения саб-меню. Дописываем в конец скрипта:
Lua:
function drawPieSub(v)
  if pie.BeginPieMenu(u8(v.name)) then
    for i, l in ipairs(v.next) do
      if l.next == nil then
        if pie.PieMenuItem(u8(l.name)) then l.action() end
      elseif type(l.next) == 'table' then
        drawPieSub(l)
      end
    end
    pie.EndPieMenu()
  end
end
В конечном итоге получаем вот такое вот красивое меню:
Найдете говнокод - сорян. Уж сильно сгорел с некоторых моментов либы.
Массив, кстати, можно заполнять по ходу выполнения кода. Жду новые MVDHelper'ы.

А почему при запуске такая ошибка?

(error) test3.lua: ...to San Andreas + MultiPlayer\moonloader\test3.lua:1: attempt to index global 'imgui' (a nil value)
stack traceback:
 

Flokich

Новичок
9
0
Потому что нужно подключить imgui.
Я как и было написано перекинул файлы в папку, работает тестовый "moon imgui demo", а данный скрипт нет

Потому что нужно подключить imgui.
Помоги пожалуйста разобраться, MoonImGui.dll и imgui.lua у меня установлены в папку lib, но все равно ничего не работает
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,133
Я как и было написано перекинул файлы в папку, работает тестовый "moon imgui demo", а данный скрипт нет


Помоги пожалуйста разобраться, MoonImGui.dll и imgui.lua у меня установлены в папку lib, но все равно ничего не работает
Ты немного не по адресу. Сначала разберись как работать с ImGUI, а потом залезай во всякие дополнительные функции.
Lua:
local imgui = require 'imgui'
 

Flokich

Новичок
9
0
Ты немного не по адресу. Сначала разберись как работать с ImGUI, а потом залезай во всякие дополнительные функции.
Lua:
local imgui = require 'imgui'
Да мне всего-то нужно, чтобы твой код работал, но этого не происходит

Lua:
local imgui = require("imgui")
local pie_mode = imgui.ImBool(true) -- режим PieMenu
local pie_keyid = 1 -- 0 ЛКМ, 1 ПКМ, 2 СКМ
local pie_elements =
{
  {name = 'Сказать привет', action = function() sampSendChat('Привет.') end, next = nil},
  {name = 'Сказать пока', action = function() sampSendChat('Пока.') end, next = nil},
  {name = 'Сказать что-то', action = function() end, next = {
    {name = 'Сказать как дела', action = function() sampSendChat('Как дела.') end, next = nil},
    {name = 'Сказать ку-ку', action = function() sampSendChat('Ку-ку.') end, next = nil},
    {name = 'Сказать дароу', action = function() sampSendChat('Дароу.') end, next = nil}
  }}
}
if pie_mode.v then
    if imgui.IsMouseClicked(pie_keyid) then imgui.OpenPopup('PieMenu') end
    if pie.BeginPiePopup('PieMenu', pie_keyid) then
      for k, v in ipairs(pie_elements) do
        if v.next == nil then if pie.PieMenuItem(u8(v.name)) then v.action() end
        elseif type(v.next) == 'table' then drawPieSub(v) end
      end
      pie.EndPiePopup()
    end
end
imgui.ShowCursor = (pie_mode.v and imgui.IsMouseDown(pie_keyid))
function drawPieSub(v)
  if pie.BeginPieMenu(u8(v.name)) then
    for i, l in ipairs(v.next) do
      if l.next == nil then
        if pie.PieMenuItem(u8(l.name)) then l.action() end
      elseif type(l.next) == 'table' then
        drawPieSub(l)
      end
    end
    pie.EndPieMenu()
  end
end

16. attempt to index global 'pie' (a nil value)