ソースを参照

Hooks for getting buttons in a screen

shedaniel 4 年 前
コミット
01901636b6

+ 8 - 0
common/src/main/java/me/shedaniel/architectury/hooks/ScreenHooks.java

@@ -24,6 +24,8 @@ import net.minecraft.client.gui.components.AbstractWidget;
 import net.minecraft.client.gui.components.events.GuiEventListener;
 import net.minecraft.client.gui.screens.Screen;
 
+import java.util.List;
+
 @Environment(EnvType.CLIENT)
 public final class ScreenHooks {
     private ScreenHooks() {}
@@ -31,6 +33,10 @@ public final class ScreenHooks {
     @Populatable
     private static final Impl IMPL = null;
     
+    public static List<AbstractWidget> getButtons(Screen screen) {
+        return IMPL.getButtons(screen);
+    }
+    
     public static <T extends AbstractWidget> T addButton(Screen screen, T widget) {
         return IMPL.addButton(screen, widget);
     }
@@ -40,6 +46,8 @@ public final class ScreenHooks {
     }
     
     public interface Impl {
+        List<AbstractWidget> getButtons(Screen screen);
+        
         <T extends AbstractWidget> T addButton(Screen screen, T widget);
         
         <T extends GuiEventListener> T addChild(Screen screen, T listener);

+ 7 - 0
fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/ScreenHooksImpl.java

@@ -23,8 +23,15 @@ import net.minecraft.client.gui.components.AbstractWidget;
 import net.minecraft.client.gui.components.events.GuiEventListener;
 import net.minecraft.client.gui.screens.Screen;
 
+import java.util.List;
+
 @Environment(EnvType.CLIENT)
 public class ScreenHooksImpl implements ScreenHooks.Impl {
+    @Override
+    public List<AbstractWidget> getButtons(Screen screen) {
+        return screen.buttons;
+    }
+    
     @Override
     public <T extends AbstractWidget> T addButton(Screen screen, T widget) {
         return screen.addButton(widget);

+ 2 - 1
fabric/src/main/resources/architectury.accessWidener

@@ -1,3 +1,4 @@
 accessWidener v1 named
 accessible method net/minecraft/client/gui/screens/Screen addButton (Lnet/minecraft/client/gui/components/AbstractWidget;)Lnet/minecraft/client/gui/components/AbstractWidget;
-accessible method net/minecraft/client/gui/screens/Screen addWidget (Lnet/minecraft/client/gui/components/events/GuiEventListener;)Lnet/minecraft/client/gui/components/events/GuiEventListener;
+accessible method net/minecraft/client/gui/screens/Screen addWidget (Lnet/minecraft/client/gui/components/events/GuiEventListener;)Lnet/minecraft/client/gui/components/events/GuiEventListener;
+accessible field net/minecraft/client/gui/screens/Screen buttons Ljava/util/List;

+ 10 - 0
forge/src/main/java/me/shedaniel/architectury/hooks/forge/ScreenHooksImpl.java

@@ -23,8 +23,18 @@ import net.minecraft.client.gui.widget.Widget;
 import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
 
 import java.lang.reflect.InvocationTargetException;
+import java.util.List;
 
 public class ScreenHooksImpl implements ScreenHooks.Impl {
+    @Override
+    public List<Widget> getButtons(Screen screen) {
+        try {
+            return (List<Widget>) ObfuscationReflectionHelper.findField(Screen.class, "field_230710_m_").get(screen);
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
     @Override
     public <T extends Widget> T addButton(Screen screen, T t) {
         try {