diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/MinecraftMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/MinecraftMixin.java index fe2b37d..ed17969 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/MinecraftMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/MinecraftMixin.java @@ -13,7 +13,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public class MinecraftMixin { @Inject(method = "setScreen", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/BufferUploader;reset()V")) private void changeScreen(Screen screen, CallbackInfo ci) { - ScreenProcessorProvider.REGISTRY.clearCache(); ComponentProcessorProvider.REGISTRY.clearCache(); } } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/ScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/ScreenMixin.java index 0186229..6724109 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/ScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/ScreenMixin.java @@ -1,5 +1,6 @@ package dev.isxander.controlify.mixins.feature.screenop; +import dev.isxander.controlify.screenop.ScreenProcessorFactory; import dev.isxander.controlify.screenop.ScreenProcessorProvider; import dev.isxander.controlify.screenop.ScreenProcessor; import net.minecraft.client.Minecraft; @@ -13,10 +14,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Screen.class) public class ScreenMixin implements ScreenProcessorProvider { @Unique - private final ScreenProcessor controlify$processor = new ScreenProcessor<>((Screen) (Object) this); + private final ScreenProcessor controlify$processor = ScreenProcessorFactory.createForScreen((Screen) (Object) this); @Override - public ScreenProcessor screenProcessor() { + public ScreenProcessor screenProcessor() { return controlify$processor; } diff --git a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessorFactory.java b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessorFactory.java new file mode 100644 index 0000000..1818213 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessorFactory.java @@ -0,0 +1,32 @@ +package dev.isxander.controlify.screenop; + +import net.minecraft.client.gui.screens.Screen; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +@SuppressWarnings("unchecked") +public final class ScreenProcessorFactory { + private static final Map, Function>> factories = new HashMap<>(); + + private ScreenProcessorFactory() { + } + + public static ScreenProcessor createForScreen(T screen) { + Class screenClass = screen.getClass(); + while (!factories.containsKey(screenClass) && screenClass != Screen.class) { + screenClass = (Class) screenClass.getSuperclass(); + } + + return (ScreenProcessor) factories.getOrDefault(screenClass, ScreenProcessorFactory::createDefault).apply(screen); + } + + public static void registerProvider(Class screenClass, Function> factory) { + factories.put(screenClass, (Function>) factory); + } + + private static ScreenProcessor createDefault(T screen) { + return new ScreenProcessor<>(screen); + } +} diff --git a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessorProvider.java b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessorProvider.java index 0db164b..9b1b9db 100644 --- a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessorProvider.java +++ b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessorProvider.java @@ -3,20 +3,16 @@ package dev.isxander.controlify.screenop; import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.NotNull; -import java.util.Optional; +import java.util.function.Function; public interface ScreenProcessorProvider { ScreenProcessor screenProcessor(); static ScreenProcessor provide(@NotNull Screen screen) { - Optional> optional = REGISTRY.get(screen); - if (optional.isPresent()) return optional.get(); - return ((ScreenProcessorProvider) screen).screenProcessor(); } - /** - * Register a screen processor for a screen from an entrypoint - */ - Registry> REGISTRY = new Registry<>(); + static void registerProvider(@NotNull Class screenClass, @NotNull Function> factory) { + ScreenProcessorFactory.registerProvider(screenClass, factory); + } }