11package fast_reset .client .mixin ;
22
3+ import com .llamalad7 .mixinextras .sugar .Share ;
4+ import com .llamalad7 .mixinextras .sugar .ref .LocalRef ;
35import fast_reset .client .Client ;
46import net .minecraft .client .gui .*;
57import net .minecraft .client .gui .screen .*;
68import net .minecraft .client .gui .widget .*;
79import net .minecraft .text .Text ;
10+ import org .jetbrains .annotations .Nullable ;
811import org .spongepowered .asm .mixin .*;
912import org .spongepowered .asm .mixin .injection .*;
13+ import org .spongepowered .asm .mixin .injection .callback .CallbackInfo ;
1014
1115@ Mixin (GameMenuScreen .class )
1216public abstract class GameMenuMixin extends Screen {
@@ -20,8 +24,11 @@ protected GameMenuMixin(Text title) {
2024 @ Unique
2125 private static final int bottomRightWidth = 102 ;
2226
27+ @ Shadow
28+ private @ Nullable ButtonWidget exitButton ;
29+
2330 @ Redirect (method = "initWidgets" , at = @ At (value = "INVOKE" , target = "Lnet/minecraft/client/gui/widget/GridWidget$Adder;add(Lnet/minecraft/client/gui/widget/Widget;I)Lnet/minecraft/client/gui/widget/Widget;" ))
24- private <T extends Widget > T addButtons (GridWidget .Adder instance , T widget , int occupiedColumns ) {
31+ private <T extends Widget > T addButtons (GridWidget .Adder instance , T widget , int occupiedColumns , @ Share ( "saveButton" ) LocalRef < ButtonWidget . Builder > saveButtonStore , @ Share ( "quitButton" ) LocalRef < T > quitButton ) {
2532 final ButtonWidget .Builder saveButton = ButtonWidget .builder (Text .translatable ("menu.quitWorld" ), (buttonWidgetX ) -> {
2633 Client .saveOnQuit = false ;
2734 this .disconnect ();
@@ -30,7 +37,19 @@ private <T extends Widget> T addButtons(GridWidget.Adder instance, T widget, int
3037 if (Client .buttonLocation == 2 ) {
3138 // add menu.quitWorld button instead of save button
3239 instance .add (saveButton .width (204 ).build (), occupiedColumns );
33- return (T ) this .addDrawableChild ((ButtonWidget ) widget );
40+ quitButton .set (widget );
41+ return null ; // warning: GameMenu#exitButton is null here, needs to be set later
42+ }
43+
44+ saveButtonStore .set (saveButton );
45+ return instance .add (widget , occupiedColumns );
46+ }
47+
48+ @ Inject (method = "initWidgets" , at = @ At ("TAIL" ))
49+ private <T extends Element & Drawable & Selectable > void addFastResetWidget (CallbackInfo ci , @ Share ("saveButton" ) LocalRef <ButtonWidget .Builder > saveButtonStore , @ Share ("quitButton" ) LocalRef <T > quitButton ) {
50+ if (Client .buttonLocation == 2 ) {
51+ this .exitButton = (ButtonWidget ) this .addDrawableChild (quitButton .get ());
52+ return ;
3453 }
3554
3655 int height = 20 ;
@@ -52,9 +71,7 @@ private <T extends Widget> T addButtons(GridWidget.Adder instance, T widget, int
5271 }
5372 }
5473
55-
56- this .addDrawableChild (saveButton .dimensions (x , y , width , height ).build ());
57- return instance .add (widget , occupiedColumns );
74+ this .addDrawableChild (saveButtonStore .get ().dimensions (x , y , width , height ).build ());
5875 }
5976
6077 @ Redirect (method = "initWidgets" , at = @ At (value = "INVOKE" , target = "Lnet/minecraft/client/gui/widget/ButtonWidget$Builder;width(I)Lnet/minecraft/client/gui/widget/ButtonWidget$Builder;" , ordinal = 1 ))
0 commit comments