Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 0
LUGU

Пытаюсь сделать меню по кнопке. layout NULL

Решил сделать тестовое меню, которое открывается на кнопку "K". Однако столкнулся с проблемой. Нажимая на кнопку ничего не происходит. Ниже код и

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.





ЛОГИ SCRIPTS:

SCRIPT       : [MyMod] Key K Pressed
SCRIPT       : [MyMod] Opening menu...
SCRIPT       : [MyMod] Initializing MyModMenu via Init()...
SCRIPT       : [MyMod] ✅ MyModMenu initialized successfully.
SCRIPT       : [MyMod] ✅ Menu is now visible!
SCRIPT    (E): NullPointerError
Class:      'MyModMenu'
Function: 'Remove'
Stack trace:
scripts/3_Game/tools\uiscriptedmenu.c:186
MyMod/scripts/5_Mission/mymodmenu.c:31
SCRIPT       : [MyMod] ✅ Menu is now hidden!
SCRIPT       : [MyMod] Key K Pressed
SCRIPT       : [MyMod] Opening menu...
SCRIPT       : [MyMod] Initializing MyModMenu via Init()...
SCRIPT       : [MyMod] ✅ MyModMenu initialized successfully.
SCRIPT       : [MyMod] ✅ Menu is now visible!
SCRIPT    (E): NullPointerError
Class:      'MyModMenu'
Function: 'Remove'
Stack trace:
scripts/3_Game/tools\uiscriptedmenu.c:186
MyMod/scripts/5_Mission/mymodmenu.c:31

Насколько я понимаю в layoutRoot передается NULL, но почему я понять не могу. Путь указан правильно. Надеюсь кто-нибудь поможет потому-что в инете инфы про UI минимум.





 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0

ПРОБЛЕМА БЫЛА РЕШЕНА!
Я немного изменил код, но выдавало ту же ошибку.
Дело в том что MyModMenu не был создан во время использовать Toggle(). Поэтому в missiongameplay нужно сохранять ссылку на MyModMenu - private ref MyModMenu m_Menu;
Коду кому нужно:

///MissionGameplay
modded class MissionGameplay {
    private ref MyModMenu m_Menu; 

    override void OnKeyPress(int key) {
        super.OnKeyPress(key);

        if (key == KeyCode.KC_K) {
            Print("[MyMod] Key K Pressed");

            UIManager uiManager = GetGame().GetUIManager();
            MyModMenu menu = MyModMenu.Cast(uiManager.GetMenu());

            if (!menu) {
                Print("[MyMod] Opening new menu...");
                m_Menu = new MyModMenu(); 
                uiManager.ShowScriptedMenu(m_Menu, NULL);
            } else {
                Print("[MyMod] Toggling existing menu...");
                menu.Toggle();
            }
        }
    }
}

///MyModMenu
class MyModMenu : UIScriptedMenu {
    private ButtonWidget m_CloseButton;

    override Widget Init() {
        Print("[MyMod] Initializing MyModMenu via Init()...");

        layoutRoot = GetGame().GetWorkspace().CreateWidgets("MyMod/gui/layouts/MyModUI.layout");

        if (!layoutRoot) {
            Print("[MyMod] ❌ ERROR: Layout file not found! Check the path: MyMod/gui/layouts/MyModUI.layout");
            return null;
        }

        // Находим кнопку закрытия
        m_CloseButton = ButtonWidget.Cast(layoutRoot.FindAnyWidget("TextWidget1"));
        if (!m_CloseButton) {
            Print("[MyMod] ❌ ERROR: CloseButton (TextWidget1) not found in layout!");
        }

        Print("[MyMod] ✅ MyModMenu initialized successfully.");
        return layoutRoot;
    }

    override void OnShow() {
        super.OnShow();
        Print("[MyMod] ✅ Menu is now visible!");

        // ? Блокируем управление игроком
        GetGame().GetInput().ChangeGameFocus(1);
    }

    override void OnHide() {
        super.OnHide();
        Print("[MyMod] ✅ Menu is now hidden!");

        // ? Возвращаем управление игроку
        GetGame().GetInput().ResetGameFocus();
    }

    void Toggle() {
        if (!layoutRoot) {
            Print("[MyMod] ❌ ERROR: layoutRoot is NULL in Toggle()!");
            return;
        }

        if (!layoutRoot.IsVisible()) {
            Show();
        } else {
            Hide();
        }
    }

    void Show() {
        UIManager uiManager = GetGame().GetUIManager();
        
        if (!uiManager) {
            Print("[MyMod] ❌ ERROR: UIManager not found!");
            return;
        }

        if (!layoutRoot) {
            Print("[MyMod] ❌ ERROR: layoutRoot is NULL in Show()!");
            return;
        }

        if (!layoutRoot.IsVisible()) {
            Print("[MyMod] ? Showing MyModMenu...");

            uiManager.HideDialog();
            uiManager.CloseAll();
            uiManager.ShowScriptedMenu(this, NULL);
        } else {
            Print("[MyMod] ⏳ Menu is already visible.");
        }
    }

    void Hide() {
        UIManager uiManager = GetGame().GetUIManager();
        if (uiManager && layoutRoot && layoutRoot.IsVisible()) {
            Print("[MyMod] ? Hiding MyModMenu...");
            uiManager.HideDialog();
            uiManager.CloseAll();
            uiManager.HideScriptedMenu(this);
        }
    }

    override bool OnClick(Widget w, int x, int y, int button) {
        if (w == m_CloseButton) {
            Print("[MyMod] ✅ Close button pressed!");
            Hide();
            return true;
        }
        return false;
    }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
MagicByte MagicByte MagicByte

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.

Поддержка