Implement Auto Config Screen registration (Forge/ModMenu)

This commit is contained in:
2022-08-06 23:36:19 +02:00
parent 34eca384e5
commit ff8301f7e2
11 changed files with 119 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
package me.hypherionmc.craterlib.mixin;
import me.hypherionmc.craterlib.client.gui.config.CraterConfigScreen;
import me.hypherionmc.craterlib.common.config.ConfigController;
import me.hypherionmc.craterlib.common.config.ModuleConfig;
import me.hypherionmc.craterlib.common.config.annotations.NoConfigScreen;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraftforge.client.ConfigScreenHandler;
import net.minecraftforge.forgespi.language.IModInfo;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Optional;
import java.util.function.BiFunction;
/**
* @author HypherionSA
* @date 06/08/2022
*/
@Mixin(ConfigScreenHandler.class)
public class ConfigScreenHandlerMixin {
/**
* Inject Auto Generated config Screens into forge
* @param selectedMod
* @param cir
*/
@Inject(at = @At("RETURN"), method = "getScreenFactoryFor", cancellable = true, remap = false)
private static void injectConfigScreen(IModInfo selectedMod, CallbackInfoReturnable<Optional<BiFunction<Minecraft, Screen, Screen>>> cir) {
ConfigController.getMonitoredConfigs().forEach((conf, watcher) -> {
if (!conf.getClass().isAnnotationPresent(NoConfigScreen.class)) {
ModuleConfig config = (ModuleConfig) conf;
if (config.getModId().equals(selectedMod.getModId())) {
cir.setReturnValue(
Optional.of((minecraft, screen) -> new CraterConfigScreen(config, screen))
);
}
}
});
}
}

View File

@@ -6,6 +6,7 @@
"mixins": [
],
"client": [
"ConfigScreenHandlerMixin"
],
"server": [
],