6464import java .io .IOException ;
6565import java .util .Collections ;
6666import java .util .List ;
67- import java .util .Objects ;
6867import java .util .function .Predicate ;
6968
7069@ ApiStatus .Internal
@@ -80,51 +79,42 @@ public class ClientScreenHandler {
8079
8180 private static IMuiScreen lastMui ;
8281
83- // we need to know the actual gui and not some fake bs some other mod overwrites
82+ // we need to know the actual gui and not some fake screen some other mod overwrites
8483 @ SubscribeEvent (priority = EventPriority .LOWEST )
8584 public void onGuiOpen (GuiOpenEvent event ) {
86- GuiScreen newGui = event .getGui ();
85+ onGuiChanged (getMCScreen (), event .getGui ());
86+ }
8787
88+ private static void onGuiChanged (GuiScreen oldScreen , GuiScreen newScreen ) {
89+ if (oldScreen == newScreen ) return ;
8890 defaultContext .reset ();
89- if (lastMui != null && newGui == null ) {
90- if (lastMui .getScreen ().getPanelManager ().isOpen ()) {
91- lastMui .getScreen ().getPanelManager ().closeAll ();
91+
92+ GuiScreen lastParent = null ;
93+ if (lastMui != null ) {
94+ if (newScreen == lastMui ) {
95+ // reopen
96+ return ;
9297 }
93- lastMui .getScreen ().getPanelManager ().dispose ();
98+ lastParent = lastMui .getScreen ().getContext ().getParentScreen ();
99+ lastMui .getScreen ().onCloseParent ();
94100 lastMui = null ;
95- } else if (newGui instanceof IMuiScreen screenWrapper ) {
96- if (lastMui == null ) {
97- lastMui = screenWrapper ;
98- } else if (lastMui == newGui ) {
99- lastMui .getScreen ().getPanelManager ().reopen ();
100- } else {
101- if (lastMui .getScreen ().getPanelManager ().isOpen ()) {
102- lastMui .getScreen ().getPanelManager ().closeAll ();
103- }
104- lastMui .getScreen ().getPanelManager ().dispose ();
105- lastMui = screenWrapper ;
106- }
101+ currentScreen = null ;
102+ lastChar = null ;
107103 }
108104
109- if (newGui instanceof IMuiScreen muiScreen ) {
110- Objects .requireNonNull (muiScreen .getScreen (), "ModularScreen must not be null!" );
111- if (currentScreen != muiScreen .getScreen ()) {
112- if (hasScreen ()) {
113- currentScreen .onCloseParent ();
114- currentScreen = null ;
115- lastChar = null ;
116- }
117- currentScreen = muiScreen .getScreen ();
118- currentScreen .getContext ().setParentScreen (Minecraft .getMinecraft ().currentScreen );
119- fpsCounter .reset ();
105+ if (newScreen instanceof IMuiScreen muiScreen ) {
106+ lastMui = muiScreen ;
107+ currentScreen = muiScreen .getScreen ();
108+ GuiScreen parent = oldScreen ;
109+ if (lastParent == parent && parent instanceof IMuiScreen oldMuiScreen ) {
110+ parent = oldMuiScreen .getScreen ().getContext ().getParentScreen ();
120111 }
121- } else if (hasScreen () && getMCScreen () != null && newGui != getMCScreen ()) {
122- currentScreen .onCloseParent ();
123- currentScreen = null ;
124- lastChar = null ;
112+ currentScreen .getContext ().setParentScreen (parent );
113+ fpsCounter .reset ();
125114 }
115+
126116 GuiErrorHandler .INSTANCE .clear ();
127- OverlayManager .onGuiOpen (event );
117+ OverlayManager .onGuiOpen (newScreen );
128118 }
129119
130120 @ SubscribeEvent
0 commit comments