MidnightLib 1.5.2 - NeoForge & more cleanness

- Native support for NeoForge (& dropped support for regular Forge)
- Cleanup of some code -> Overview button is now added via callbacks instead of a mixin
- Unify client & server classes
  - Minor breaking change only affecting mods using the hiding functionality
This commit is contained in:
Martin Prokoph
2023-12-11 19:28:04 +01:00
parent 29c8a9ccfe
commit fb1c4c1158
25 changed files with 135 additions and 155 deletions

View File

@@ -3,6 +3,7 @@ architectury {
} }
loom { loom {
accessWidenerPath = file("src/main/resources/midnightlib.accesswidener")
} }
dependencies { dependencies {

View File

@@ -1,12 +1,23 @@
package eu.midnightdust.core; package eu.midnightdust.core;
import eu.midnightdust.core.config.MidnightLibConfig;
import eu.midnightdust.lib.config.AutoCommand; import eu.midnightdust.lib.config.AutoCommand;
import eu.midnightdust.lib.config.MidnightConfig; import eu.midnightdust.lib.config.MidnightConfig;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class MidnightLibServer { public class MidnightLib {
public static List<String> hiddenMods = new ArrayList<>();
@Environment(EnvType.CLIENT)
public static void onInitializeClient() {
MidnightLibConfig.init("midnightlib", MidnightLibConfig.class);
}
@Environment(EnvType.SERVER)
public static void onInitializeServer() { public static void onInitializeServer() {
MidnightConfig.configClass.forEach((modid, config) -> { MidnightConfig.configClass.forEach((modid, config) -> {
for (Field field : config.getFields()) { for (Field field : config.getFields()) {

View File

@@ -1,14 +0,0 @@
package eu.midnightdust.core;
import eu.midnightdust.core.config.MidnightLibConfig;
import java.util.ArrayList;
import java.util.List;
public class MidnightLibClient {
public static List<String> hiddenMods = new ArrayList<>();
public static void onInitializeClient() {
MidnightLibConfig.init("midnightlib", MidnightLibConfig.class);
}
}

View File

@@ -1,34 +0,0 @@
package eu.midnightdust.core.mixin;
import eu.midnightdust.core.config.MidnightLibConfig;
import eu.midnightdust.core.screen.MidnightConfigOverviewScreen;
import eu.midnightdust.lib.util.PlatformFunctions;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.option.OptionsScreen;
import net.minecraft.client.gui.widget.TextIconButtonWidget;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
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.CallbackInfo;
import java.util.Objects;
@Mixin(OptionsScreen.class)
public class MixinOptionsScreen extends Screen {
protected MixinOptionsScreen(Text title) {
super(title);
}
@Inject(at = @At("HEAD"),method = "init")
private void midnightlib$init(CallbackInfo ci) {
if (MidnightLibConfig.config_screen_list.equals(MidnightLibConfig.ConfigButton.TRUE) || (MidnightLibConfig.config_screen_list.equals(MidnightLibConfig.ConfigButton.MODMENU) && !PlatformFunctions.isModLoaded("modmenu"))) {
TextIconButtonWidget button = TextIconButtonWidget.builder(Text.translatable("midnightlib.overview.title"), (
buttonWidget) -> Objects.requireNonNull(client).setScreen(new MidnightConfigOverviewScreen(this)), true)
.texture(new Identifier("midnightlib","icon/midnightlib"), 16, 16).dimension(20, 20).build();
button.setPosition(this.width / 2 + 158, this.height / 6 - 12);
this.addDrawableChild(button);
}
}
}

View File

@@ -1,14 +1,20 @@
package eu.midnightdust.core.screen; package eu.midnightdust.core.screen;
import eu.midnightdust.core.MidnightLibClient; import eu.midnightdust.core.MidnightLib;
import eu.midnightdust.core.config.MidnightLibConfig;
import eu.midnightdust.lib.config.MidnightConfig; import eu.midnightdust.lib.config.MidnightConfig;
import eu.midnightdust.lib.util.PlatformFunctions;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.option.OptionsScreen;
import net.minecraft.client.gui.widget.*; import net.minecraft.client.gui.widget.*;
import net.minecraft.screen.ScreenTexts; import net.minecraft.screen.ScreenTexts;
import net.minecraft.text.*; import net.minecraft.text.*;
import net.minecraft.util.Identifier;
import java.util.*; import java.util.*;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
@@ -31,7 +37,7 @@ public class MidnightConfigOverviewScreen extends Screen {
List<String> sortedMods = new ArrayList<>(MidnightConfig.configClass.keySet()); List<String> sortedMods = new ArrayList<>(MidnightConfig.configClass.keySet());
Collections.sort(sortedMods); Collections.sort(sortedMods);
sortedMods.forEach((modid) -> { sortedMods.forEach((modid) -> {
if (!MidnightLibClient.hiddenMods.contains(modid)) { if (!MidnightLib.hiddenMods.contains(modid)) {
list.addButton(List.of(ButtonWidget.builder(Text.translatable(modid +".midnightconfig.title"), (button) -> list.addButton(List.of(ButtonWidget.builder(Text.translatable(modid +".midnightconfig.title"), (button) ->
Objects.requireNonNull(client).setScreen(MidnightConfig.getScreen(this,modid))).dimensions(this.width / 2 - 125, this.height - 28, 250, 20).build()), null, null); Objects.requireNonNull(client).setScreen(MidnightConfig.getScreen(this,modid))).dimensions(this.width / 2 - 125, this.height - 28, 250, 20).build()), null, null);
} }
@@ -47,4 +53,15 @@ public class MidnightConfigOverviewScreen extends Screen {
context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 15, 0xFFFFFF); context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 15, 0xFFFFFF);
} }
@Override public void renderBackground(DrawContext c, int x, int y, float d) {} @Override public void renderBackground(DrawContext c, int x, int y, float d) {}
public static void addButtonToOptionsScreen(Screen screen, MinecraftClient client) {
if (screen.getClass() == OptionsScreen.class && MidnightLibConfig.config_screen_list.equals(MidnightLibConfig.ConfigButton.TRUE)
|| (MidnightLibConfig.config_screen_list.equals(MidnightLibConfig.ConfigButton.MODMENU) && !PlatformFunctions.isModLoaded("modmenu"))) {
TextIconButtonWidget button = TextIconButtonWidget.builder(Text.translatable("midnightlib.overview.title"), (
buttonWidget) -> Objects.requireNonNull(client).setScreen(new MidnightConfigOverviewScreen(screen)), true)
.texture(new Identifier("midnightlib","icon/midnightlib"), 16, 16).dimension(20, 20).build();
button.setPosition(screen.width / 2 + 158, screen.height / 6 - 12);
screen.addDrawableChild(button);
}
}
} }

View File

@@ -194,7 +194,7 @@ public abstract class MidnightConfig {
if (!Files.exists(path)) Files.createFile(path); if (!Files.exists(path)) Files.createFile(path);
Files.write(path, gson.toJson(getClass(modid)).getBytes()); Files.write(path, gson.toJson(getClass(modid)).getBytes());
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.fillInStackTrace();
} }
} }
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)

View File

@@ -1 +1,3 @@
{} {
"accessWidener": "midnightlib.accesswidener"
}

View File

@@ -0,0 +1,3 @@
accessWidener v2 named
accessible method net/minecraft/client/gui/screen/Screen addDrawableChild (Lnet/minecraft/client/gui/Element;)Lnet/minecraft/client/gui/Element;

View File

@@ -1 +0,0 @@
{"required": true,"minVersion": "0.8","package": "eu.midnightdust.core.mixin","compatibilityLevel": "JAVA_17","client": ["MixinOptionsScreen"],"injectors": {"defaultRequire": 1}}

View File

@@ -2,7 +2,7 @@ package eu.midnightdust.lib.config;
import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ConfigScreenFactory;
import com.terraformersmc.modmenu.api.ModMenuApi; import com.terraformersmc.modmenu.api.ModMenuApi;
import eu.midnightdust.core.MidnightLibClient; import eu.midnightdust.core.MidnightLib;
import eu.midnightdust.core.config.MidnightLibConfig; import eu.midnightdust.core.config.MidnightLibConfig;
import java.util.HashMap; import java.util.HashMap;
@@ -19,7 +19,7 @@ public class AutoModMenu implements ModMenuApi {
public Map<String, ConfigScreenFactory<?>> getProvidedConfigScreenFactories() { public Map<String, ConfigScreenFactory<?>> getProvidedConfigScreenFactories() {
HashMap<String, ConfigScreenFactory<?>> map = new HashMap<>(); HashMap<String, ConfigScreenFactory<?>> map = new HashMap<>();
MidnightConfig.configClass.forEach((modid, cClass) -> { MidnightConfig.configClass.forEach((modid, cClass) -> {
if (!MidnightLibClient.hiddenMods.contains(modid)) if (!MidnightLib.hiddenMods.contains(modid))
map.put(modid, parent -> MidnightConfig.getScreen(parent, modid)); map.put(modid, parent -> MidnightConfig.getScreen(parent, modid));
} }
); );

View File

@@ -1,19 +1,21 @@
package eu.midnightdust.fabric.core; package eu.midnightdust.fabric.core;
import eu.midnightdust.core.MidnightLibClient; import eu.midnightdust.core.MidnightLib;
import eu.midnightdust.core.MidnightLibServer; import eu.midnightdust.core.screen.MidnightConfigOverviewScreen;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.api.DedicatedServerModInitializer; import net.fabricmc.api.DedicatedServerModInitializer;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
public class MidnightLibFabric implements ClientModInitializer, DedicatedServerModInitializer { public class MidnightLibFabric implements ClientModInitializer, DedicatedServerModInitializer {
@Override @Environment(EnvType.CLIENT) @Override @Environment(EnvType.CLIENT)
public void onInitializeClient() { public void onInitializeClient() {
MidnightLibClient.onInitializeClient(); MidnightLib.onInitializeClient();
ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
MidnightConfigOverviewScreen.addButtonToOptionsScreen(screen, client);
});
} }
@Override @Environment(EnvType.SERVER) @Override @Environment(EnvType.SERVER)
public void onInitializeServer() { public void onInitializeServer() {MidnightLib.onInitializeServer();}
MidnightLibServer.onInitializeServer();
}
} }

View File

@@ -32,13 +32,9 @@
}, },
"depends": { "depends": {
"fabric-resource-loader-v0": "*", "fabric-resource-loader-v0": "*",
"minecraft": ">=1.20.2" "minecraft": ">=1.20.3"
}, },
"mixins": [
"midnightlib.mixins.json"
],
"custom": { "custom": {
"modmenu": { "modmenu": {
"links": { "links": {
@@ -50,5 +46,6 @@
}, },
"badges": [ "library" ] "badges": [ "library" ]
} }
} },
"accessWidener": "midnightlib.accesswidener"
} }

View File

@@ -1 +0,0 @@
loom.platform=forge

View File

@@ -1,25 +0,0 @@
package eu.midnightdust.forge;
import eu.midnightdust.lib.config.MidnightConfig;
import eu.midnightdust.lib.util.MidnightColorUtil;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.ConfigScreenHandler;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
@Mod.EventBusSubscriber(modid = "midnightlib", bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
public class MidnightLibClientEvents {
@SubscribeEvent
public static void onPostInit(FMLClientSetupEvent event) {
ModList.get().forEachModContainer((modid, modContainer) -> {
if (MidnightConfig.configClass.containsKey(modid)) {
modContainer.registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, () ->
new ConfigScreenHandler.ConfigScreenFactory((client, parent) -> MidnightConfig.getScreen(parent, modid)));
}
});
}
}

View File

@@ -1,20 +0,0 @@
package eu.midnightdust.forge;
import eu.midnightdust.core.MidnightLibClient;
import eu.midnightdust.core.MidnightLibServer;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.IExtensionPoint;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import static net.minecraftforge.fml.IExtensionPoint.DisplayTest.IGNORESERVERONLY;
@Mod("midnightlib")
public class MidnightLibForge {
public MidnightLibForge() {
ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> IGNORESERVERONLY, (remote, server) -> true));
DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> MidnightLibClient::onInitializeClient);
DistExecutor.safeRunWhenOn(Dist.DEDICATED_SERVER, () -> MidnightLibServer::onInitializeServer);
}
}

View File

@@ -1,19 +0,0 @@
package eu.midnightdust.forge;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import eu.midnightdust.lib.config.AutoCommand;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
@Mod.EventBusSubscriber(modid = "midnightlib", value = Dist.DEDICATED_SERVER)
public class MidnightLibServerEvents {
@SubscribeEvent
public static void registerCommands(RegisterCommandsEvent event) {
for (LiteralArgumentBuilder<ServerCommandSource> command : AutoCommand.commands){
event.getDispatcher().register(command);
}
}
}

View File

@@ -2,16 +2,16 @@ org.gradle.jvmargs=-Xmx4096M
minecraft_version=1.20.4 minecraft_version=1.20.4
yarn_mappings=1.20.4+build.1 yarn_mappings=1.20.4+build.1
enabled_platforms=fabric enabled_platforms=fabric,neoforge
archives_base_name=midnightlib archives_base_name=midnightlib
mod_version=1.5.1 mod_version=1.5.2
maven_group=eu.midnightdust maven_group=eu.midnightdust
fabric_loader_version=0.15.0 fabric_loader_version=0.15.1
fabric_api_version=0.91.1+1.20.4 fabric_api_version=0.91.1+1.20.4
forge_version=1.20.3-49.0.2 neoforge_version=20.4.12-beta
quilt_loader_version=0.19.0-beta.18 quilt_loader_version=0.19.0-beta.18
quilt_fabric_api_version=7.0.1+0.83.0-1.20 quilt_fabric_api_version=7.0.1+0.83.0-1.20

View File

@@ -1,16 +1,17 @@
plugins { plugins {
id "com.github.johnrengelman.shadow" version "7.1.2" id "com.github.johnrengelman.shadow" version "7.1.2"
} }
repositories{
maven {url "https://maven.neoforged.net/releases"}
}
architectury { architectury {
platformSetupLoomIde() platformSetupLoomIde()
forge() neoForge()
} }
loom { loom {
forge { accessWidenerPath = project(":common").loom.accessWidenerPath
mixinConfig "midnightlib.mixins.json"
}
} }
configurations { configurations {
@@ -19,14 +20,14 @@ configurations {
compileClasspath.extendsFrom common compileClasspath.extendsFrom common
runtimeClasspath.extendsFrom common runtimeClasspath.extendsFrom common
developmentForge.extendsFrom common developmentForge.extendsFrom common
archivesBaseName = rootProject.archives_base_name + "-forge" archivesBaseName = rootProject.archives_base_name + "-neoforge"
} }
dependencies { dependencies {
forge "net.minecraftforge:forge:${rootProject.forge_version}" neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}"
common(project(path: ":common", configuration: "namedElements")) { transitive false } common(project(path: ":common", configuration: "namedElements")) { transitive false }
shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false }
} }
processResources { processResources {
@@ -46,6 +47,7 @@ shadowJar {
} }
remapJar { remapJar {
atAccessWideners.add('midnightlib.accesswidener')
input.set shadowJar.archiveFile input.set shadowJar.archiveFile
dependsOn shadowJar dependsOn shadowJar
} }

View File

@@ -0,0 +1 @@
loom.platform=neoforge

View File

@@ -1,11 +1,11 @@
package eu.midnightdust.lib.util.forge; package eu.midnightdust.lib.util.neoforge;
import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import eu.midnightdust.lib.util.PlatformFunctions; import eu.midnightdust.lib.util.PlatformFunctions;
import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.command.ServerCommandSource;
import net.minecraftforge.fml.ModList; import net.neoforged.fml.ModList;
import net.minecraftforge.fml.loading.FMLEnvironment; import net.neoforged.fml.loading.FMLEnvironment;
import net.minecraftforge.fml.loading.FMLPaths; import net.neoforged.fml.loading.FMLPaths;
import java.nio.file.Path; import java.nio.file.Path;

View File

@@ -0,0 +1,58 @@
package eu.midnightdust.neoforge;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import eu.midnightdust.core.MidnightLib;
import eu.midnightdust.core.screen.MidnightConfigOverviewScreen;
import eu.midnightdust.lib.config.AutoCommand;
import eu.midnightdust.lib.config.MidnightConfig;
import net.minecraft.server.command.ServerCommandSource;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.IExtensionPoint;
import net.neoforged.fml.ModList;
import net.neoforged.fml.ModLoadingContext;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
import net.neoforged.fml.loading.FMLEnvironment;
import net.neoforged.neoforge.client.ConfigScreenHandler;
import net.neoforged.neoforge.client.event.ScreenEvent;
import net.neoforged.neoforge.event.RegisterCommandsEvent;
import static net.neoforged.fml.IExtensionPoint.DisplayTest.IGNORESERVERONLY;
@Mod("midnightlib")
public class MidnightLibNeoForge {
public MidnightLibNeoForge() {
ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> IGNORESERVERONLY, (remote, server) -> true));
if (FMLEnvironment.dist == Dist.CLIENT) MidnightLib.onInitializeClient(); else MidnightLib.onInitializeServer();
}
@Mod.EventBusSubscriber(modid = "midnightlib", bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
public static class MidnightLibBusEvents {
@SubscribeEvent
public static void onPostInit(FMLClientSetupEvent event) {
ModList.get().forEachModContainer((modid, modContainer) -> {
if (MidnightConfig.configClass.containsKey(modid)) {
modContainer.registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, () ->
new ConfigScreenHandler.ConfigScreenFactory((client, parent) -> MidnightConfig.getScreen(parent, modid)));
}
});
}
}
@Mod.EventBusSubscriber(modid = "midnightlib", value = Dist.CLIENT)
public static class MidnightLibClientEvents {
@SubscribeEvent
public static void afterInitScreen(ScreenEvent.Init.Post event) {
MidnightConfigOverviewScreen.addButtonToOptionsScreen(event.getScreen(), event.getScreen().getMinecraft());
}
}
@Mod.EventBusSubscriber(modid = "midnightlib", value = Dist.DEDICATED_SERVER)
public static class MidnightLibServerEvents {
@SubscribeEvent
public static void registerCommands(RegisterCommandsEvent event) {
for (LiteralArgumentBuilder<ServerCommandSource> command : AutoCommand.commands){
event.getDispatcher().register(command);
}
}
}
}

View File

@@ -1,5 +1,5 @@
modLoader = "javafml" modLoader = "javafml"
loaderVersion = "[43,)" loaderVersion = "[1,)"
#issueTrackerURL = "" #issueTrackerURL = ""
license = "MIT License" license = "MIT License"
@@ -15,15 +15,15 @@ Common Library for Team MidnightDust's mods.
#logoFile = "" #logoFile = ""
[[dependencies.midnightlib]] [[dependencies.midnightlib]]
modId = "forge" modId = "neoforge"
mandatory = true mandatory = true
versionRange = "[43,)" versionRange = "[20.3,)"
ordering = "NONE" ordering = "NONE"
side = "BOTH" side = "BOTH"
[[dependencies.midnightlib]] [[dependencies.midnightlib]]
modId = "minecraft" modId = "minecraft"
mandatory = true mandatory = true
versionRange = "[1.19.4,)" versionRange = "[1.20.3,)"
ordering = "NONE" ordering = "NONE"
side = "BOTH" side = "BOTH"

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -1,6 +1,6 @@
{ {
"pack": { "pack": {
"description": "MidnightLib", "description": "MidnightLib",
"pack_format": 9 "pack_format": 22
} }
} }

View File

@@ -2,7 +2,7 @@ pluginManagement {
repositories { repositories {
maven { url "https://maven.fabricmc.net/" } maven { url "https://maven.fabricmc.net/" }
maven { url "https://maven.architectury.dev/" } maven { url "https://maven.architectury.dev/" }
maven { url "https://maven.minecraftforge.net/" } maven { url "https://maven.neoforged.net/releases" }
gradlePluginPortal() gradlePluginPortal()
} }
} }
@@ -11,6 +11,6 @@ include("common")
include("fabric-like") include("fabric-like")
include("fabric") include("fabric")
//include("quilt") //include("quilt")
//include("forge") include("neoforge")
rootProject.name = "midnightlib" rootProject.name = "midnightlib"