From bea09914acf29bd6261d8b4d5ddbb55c3cfc8492 Mon Sep 17 00:00:00 2001 From: Vlamonster Date: Thu, 30 Jul 2026 14:49:22 +0200 Subject: [PATCH 1/2] Allow panel and screen creation to fail --- .../com/cleanroommc/modularui/api/UIFactory.java | 5 +++-- .../modularui/factory/AbstractUIFactory.java | 16 ++++++++-------- .../modularui/factory/GuiManager.java | 3 +++ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/api/UIFactory.java b/src/main/java/com/cleanroommc/modularui/api/UIFactory.java index fc4b18cc4..0ca48587e 100644 --- a/src/main/java/com/cleanroommc/modularui/api/UIFactory.java +++ b/src/main/java/com/cleanroommc/modularui/api/UIFactory.java @@ -15,6 +15,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * An interface for UI factories. They are responsible for opening synced GUIs and syncing necessary data. @@ -41,7 +42,7 @@ public interface UIFactory { * @return new main panel */ @ApiStatus.OverrideOnly - ModularPanel createPanel(D guiData, PanelSyncManager syncManager, UISettings settings); + @Nullable ModularPanel createPanel(D guiData, PanelSyncManager syncManager, UISettings settings); /** * Creates the screen for the GUI. Is only called on client side. @@ -52,7 +53,7 @@ public interface UIFactory { */ @SideOnly(Side.CLIENT) @ApiStatus.OverrideOnly - ModularScreen createScreen(D guiData, ModularPanel mainPanel); + @Nullable ModularScreen createScreen(D guiData, ModularPanel mainPanel); /** * Creates the screen wrapper for the GUI. Is only called on client side. diff --git a/src/main/java/com/cleanroommc/modularui/factory/AbstractUIFactory.java b/src/main/java/com/cleanroommc/modularui/factory/AbstractUIFactory.java index 3181b39dd..4ab579e08 100644 --- a/src/main/java/com/cleanroommc/modularui/factory/AbstractUIFactory.java +++ b/src/main/java/com/cleanroommc/modularui/factory/AbstractUIFactory.java @@ -12,6 +12,7 @@ import net.minecraft.entity.player.EntityPlayerMP; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Objects; @@ -40,19 +41,18 @@ protected AbstractUIFactory(String name) { return this.name; } - @NotNull - public abstract IGuiHolder getGuiHolder(T data); + public abstract @Nullable IGuiHolder getGuiHolder(T data); @Override - public ModularPanel createPanel(T guiData, PanelSyncManager syncManager, UISettings settings) { - IGuiHolder guiHolder = Objects.requireNonNull(getGuiHolder(guiData), "Gui holder must not be null!"); - return guiHolder.buildUI(guiData, syncManager, settings); + public @Nullable ModularPanel createPanel(T guiData, PanelSyncManager syncManager, UISettings settings) { + IGuiHolder guiHolder = getGuiHolder(guiData); + return guiHolder == null ? null : guiHolder.buildUI(guiData, syncManager, settings); } @Override - public ModularScreen createScreen(T guiData, ModularPanel mainPanel) { - IGuiHolder guiHolder = Objects.requireNonNull(getGuiHolder(guiData), "Gui holder must not be null!"); - return guiHolder.createScreen(guiData, mainPanel); + public @Nullable ModularScreen createScreen(T guiData, ModularPanel mainPanel) { + IGuiHolder guiHolder = getGuiHolder(guiData); + return guiHolder == null ? null : guiHolder.createScreen(guiData, mainPanel); } @SuppressWarnings("unchecked") diff --git a/src/main/java/com/cleanroommc/modularui/factory/GuiManager.java b/src/main/java/com/cleanroommc/modularui/factory/GuiManager.java index e2c2f7f3e..0b3290636 100644 --- a/src/main/java/com/cleanroommc/modularui/factory/GuiManager.java +++ b/src/main/java/com/cleanroommc/modularui/factory/GuiManager.java @@ -77,6 +77,7 @@ public static void open(@NotNull UIFactory factory, @NotN ModularSyncManager msm = new ModularSyncManager(false); PanelSyncManager syncManager = new PanelSyncManager(msm, true); ModularPanel panel = factory.createPanel(guiData, syncManager, settings); + if (panel == null) return; WidgetTree.collectSyncValues(syncManager, panel); ModularContainer container = settings.hasCustomContainer() ? settings.createContainer() : factory.createContainer(); container.construct(player, msm, settings, panel.getName(), guiData); @@ -106,8 +107,10 @@ public static void openFromClient(int windowId, int networkI ModularSyncManager msm = new ModularSyncManager(true); PanelSyncManager syncManager = new PanelSyncManager(msm, true); ModularPanel panel = factory.createPanel(guiData, syncManager, settings); + if (panel == null) return; WidgetTree.collectSyncValues(syncManager, panel); ModularScreen screen = factory.createScreen(guiData, panel); + if (screen == null) return; screen.getContext().setSettings(settings); ModularContainer container = settings.hasCustomContainer() ? settings.createContainer() : factory.createContainer(); container.construct(player, msm, settings, panel.getName(), guiData); From 396cb8dcb10c3e9e7b506bb73de46fc23e8bf7ad Mon Sep 17 00:00:00 2001 From: Vlamonster Date: Thu, 30 Jul 2026 17:27:24 +0200 Subject: [PATCH 2/2] Change returns to thrown exceptions --- .../java/com/cleanroommc/modularui/factory/GuiManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/factory/GuiManager.java b/src/main/java/com/cleanroommc/modularui/factory/GuiManager.java index 0b3290636..b9ab0072e 100644 --- a/src/main/java/com/cleanroommc/modularui/factory/GuiManager.java +++ b/src/main/java/com/cleanroommc/modularui/factory/GuiManager.java @@ -107,10 +107,10 @@ public static void openFromClient(int windowId, int networkI ModularSyncManager msm = new ModularSyncManager(true); PanelSyncManager syncManager = new PanelSyncManager(msm, true); ModularPanel panel = factory.createPanel(guiData, syncManager, settings); - if (panel == null) return; + if (panel == null) throw new IllegalStateException("Panel must not be null on Client when Panel was not null on Server!"); WidgetTree.collectSyncValues(syncManager, panel); ModularScreen screen = factory.createScreen(guiData, panel); - if (screen == null) return; + if (screen == null) throw new IllegalStateException("Screen must not be null on Client when Screen was not null on Server!"); screen.getContext().setSettings(settings); ModularContainer container = settings.hasCustomContainer() ? settings.createContainer() : factory.createContainer(); container.construct(player, msm, settings, panel.getName(), guiData);