diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 19434cb..4693f2f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,21 +8,25 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - - name: Set up JDK 21 - uses: actions/setup-java@v4 + - name: Set up JDK 25 + uses: actions/setup-java@v5 with: distribution: microsoft - java-version: 21 + java-version: 25 - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 + uses: gradle/actions/setup-gradle@v6 + with: + build-scan-publish: true + build-scan-terms-of-use-url: 'https://gradle.com/terms-of-service' + build-scan-terms-of-use-agree: 'yes' - name: Build run: './gradlew build' - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: SimpleMainMenu-Lib Jar path: build/libs/*.jar \ No newline at end of file diff --git a/.github/workflows/buildRelease.yml b/.github/workflows/buildRelease.yml index f50a851..39ecc52 100644 --- a/.github/workflows/buildRelease.yml +++ b/.github/workflows/buildRelease.yml @@ -14,16 +14,20 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - - name: Set up JDK 21 - uses: actions/setup-java@v3 + - name: Set up JDK 25 + uses: actions/setup-java@v5 with: distribution: microsoft - java-version: 21 + java-version: 25 - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 + uses: gradle/actions/setup-gradle@v6 + with: + build-scan-publish: true + build-scan-terms-of-use-url: 'https://gradle.com/terms-of-service' + build-scan-terms-of-use-agree: 'yes' - name: Build with Gradle run: './gradlew build' diff --git a/build.gradle b/build.gradle index 4f05223..c591763 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version "${loom_version}" + id 'net.fabricmc.fabric-loom' version "${loom_version}" id 'maven-publish' } @@ -46,16 +46,15 @@ repositories { dependencies { // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" - modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + implementation "net.fabricmc:fabric-loader:${project.loader_version}" - modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}" + implementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}" - modApi("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_config_version}") { + api("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_config_version}") { exclude(group: "net.fabricmc.fabric-api") } - modApi("com.terraformersmc:modmenu:${project.mod_menu_version}") + api("com.terraformersmc:modmenu:${project.mod_menu_version}") } processResources { @@ -67,7 +66,7 @@ processResources { } } -def targetJavaVersion = JavaVersion.VERSION_21 +def targetJavaVersion = JavaVersion.VERSION_25 java { diff --git a/gradle.properties b/gradle.properties index cc4d0f8..71dc47d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,19 +2,18 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.21.11 -yarn_mappings=1.21.11+build.4 -loader_version=0.18.4 +minecraft_version=26.1 +loader_version=0.18.5 loom_version=1.15-SNAPSHOT -#Fabric api -fabric_api_version=0.141.2+1.21.11 +# Fabric API +fabric_api_version=0.144.3+26.1 # Mod Properties -mod_version=2.1.0 +mod_version=3.0.0 maven_group=com.mosadie archiveBaseName=simplemainmenu-lib # Dependency Versions (easy to check on https://linkie.shedaniel.dev/dependencies) -cloth_config_version=21.11.153 -mod_menu_version=17.0.0-beta.1 \ No newline at end of file +cloth_config_version=26.1.154 +mod_menu_version=18.0.0-alpha.8 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 23449a2..c61a118 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/main/java/com/mosadie/simplemainmenu/api/MenuTheme.java b/src/main/java/com/mosadie/simplemainmenu/api/MenuTheme.java index 1eb9a54..7bf993e 100644 --- a/src/main/java/com/mosadie/simplemainmenu/api/MenuTheme.java +++ b/src/main/java/com/mosadie/simplemainmenu/api/MenuTheme.java @@ -1,7 +1,8 @@ package com.mosadie.simplemainmenu.api; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; public interface MenuTheme { String getId(); @@ -13,7 +14,7 @@ public interface MenuTheme { int getPriority(); // -- Quick Join Button --- - Text getQuickJoinButtonText(); + Component getQuickJoinButtonComponent(); void onQuickJoinClicked(); // --- Button Visibility --- diff --git a/src/main/java/com/mosadie/simplemainmenu/api/NormalTheme.java b/src/main/java/com/mosadie/simplemainmenu/api/NormalTheme.java index 4f974c9..48168d1 100644 --- a/src/main/java/com/mosadie/simplemainmenu/api/NormalTheme.java +++ b/src/main/java/com/mosadie/simplemainmenu/api/NormalTheme.java @@ -1,7 +1,7 @@ package com.mosadie.simplemainmenu.api; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; /** * An example of a simple menu theme. @@ -14,21 +14,21 @@ public String getId() { @Override public Identifier getPanorama() { - return Identifier.of("minecraft", "textures/gui/title/background/panorama"); + return Identifier.fromNamespaceAndPath("minecraft", "textures/gui/title/background/panorama"); } @Override public SplashText getSplashText() { return SplashText.builder() .addLine("Just a normal menu...") // Example of using addLine with a String... - .addLine(Text.literal("for now!").setStyle(Util.SPLASH_TEXT_STYLE)) // Or using a Text object with styling! + .addLine(Component.literal("for now!").setStyle(Util.SPLASH_TEXT_STYLE)) // Or using a Text object with styling! .build(); } @Override - public Text getQuickJoinButtonText() { + public Component getQuickJoinButtonComponent() { // Use Text.translatable for translatable text, or Text.literal to statically define text. - return Text.translatable("text.smmlib.normaltheme.joinserver"); + return Component.translatable("text.smmlib.normaltheme.joinserver"); } @Override diff --git a/src/main/java/com/mosadie/simplemainmenu/api/SplashText.java b/src/main/java/com/mosadie/simplemainmenu/api/SplashText.java index ffa971d..c4a9096 100644 --- a/src/main/java/com/mosadie/simplemainmenu/api/SplashText.java +++ b/src/main/java/com/mosadie/simplemainmenu/api/SplashText.java @@ -1,13 +1,13 @@ package com.mosadie.simplemainmenu.api; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Component; import java.util.ArrayList; import java.util.List; -public record SplashText(Text[] lines) { - public static Builder builder(Text text) { - return builder().addLine(text); +public record SplashText(Component[] lines) { + public static Builder builder(Component component) { + return builder().addLine(component); } public static Builder builder(String text) { return builder().addLine(text); @@ -17,19 +17,19 @@ public static Builder builder() { } public static final class Builder { - private final List lines = new ArrayList<>(); + private final List lines = new ArrayList<>(); - public Builder addLine(Text text) { - lines.add(text); + public Builder addLine(Component component) { + lines.add(component); return this; } public Builder addLine(String text) { - lines.add(Text.literal(text).setStyle(Util.SPLASH_TEXT_STYLE)); + lines.add(Component.literal(text).setStyle(Util.SPLASH_TEXT_STYLE)); return this; } public SplashText build() { - return new SplashText(lines.toArray(Text[]::new)); + return new SplashText(lines.toArray(Component[]::new)); } } } diff --git a/src/main/java/com/mosadie/simplemainmenu/api/Util.java b/src/main/java/com/mosadie/simplemainmenu/api/Util.java index 7cc09d8..688ee65 100644 --- a/src/main/java/com/mosadie/simplemainmenu/api/Util.java +++ b/src/main/java/com/mosadie/simplemainmenu/api/Util.java @@ -1,16 +1,15 @@ package com.mosadie.simplemainmenu.api; import com.mosadie.simplemainmenu.client.SimpleMainMenuLibClient; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.NoticeScreen; -import net.minecraft.client.gui.screen.TitleScreen; -import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; -import net.minecraft.client.network.ServerAddress; -import net.minecraft.client.network.ServerInfo; -import net.minecraft.screen.ScreenTexts; -import net.minecraft.text.Style; -import net.minecraft.text.Text; -import net.minecraft.util.math.random.Random; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.AlertScreen; +import net.minecraft.client.gui.screens.ConnectScreen; +import net.minecraft.client.gui.screens.TitleScreen; +import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.client.multiplayer.resolver.ServerAddress; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.util.RandomSource; import java.time.LocalDate; @@ -28,7 +27,7 @@ public class Util { * @return True if the theme should be selected, false otherwise. Usable in {@link MenuTheme#rollOdds} */ public static boolean rollOddsMonthDay(int month, int day, int daysBefore, int daysAfter) { - Random random = Random.create(); + RandomSource random = RandomSource.create(); LocalDate now = LocalDate.now(); LocalDate themeDate = LocalDate.of(now.getYear(), month, day); @@ -52,10 +51,10 @@ public static boolean rollOddsMonthDay(int month, int day, int daysBefore, int d int roll; if (now.isBefore(themeDate)) { - roll = random.nextBetween(0, daysBefore); + roll = random.nextInt(0, daysBefore); return roll <= firstDate.until(now).getDays(); } else { - roll = random.nextBetween(0, daysAfter); + roll = random.nextInt(0, daysAfter); return roll >= now.until(lastDate).getDays(); } } @@ -65,7 +64,7 @@ public static boolean rollOddsMonthDay(int month, int day, int daysBefore, int d * @return True if the theme should be selected, false otherwise. Usable in {@link MenuTheme#rollOdds()} */ public static boolean rollOddsFlipCoin() { - Random random = Random.create(); + RandomSource random = RandomSource.create(); return random.nextBoolean(); } @@ -84,10 +83,10 @@ public static void joinServer(String address) { * @param address Address of the server */ public static void joinServer(String name, String address) { - if (ServerAddress.isValid(address)) { - ServerInfo serverInfo = new ServerInfo(name, address, ServerInfo.ServerType.OTHER); - serverInfo.setResourcePackPolicy(ServerInfo.ResourcePackPolicy.ENABLED); - joinServer(serverInfo); + if (ServerAddress.isValidAddress(address)) { + ServerData serverData = new ServerData(name, address, ServerData.Type.OTHER); + serverData.setResourcePackStatus(ServerData.ServerPackStatus.ENABLED); + joinServer(serverData); } } @@ -95,32 +94,32 @@ public static void joinServer(String name, String address) { * Directs Minecraft to connect to the specified server. * @param server The ServerInfo of the server to join. */ - public static void joinServer(ServerInfo server) { - MinecraftClient.getInstance().send(() -> { + public static void joinServer(ServerData server) { + Minecraft.getInstance().execute(() -> { leaveIfNeeded(); - SimpleMainMenuLibClient.LOGGER.info("Connecting to " + server.address); + SimpleMainMenuLibClient.LOGGER.info("Connecting to " + server.ip); // Connect to server - ConnectScreen.connect(new TitleScreen(), MinecraftClient.getInstance(), ServerAddress.parse(server.address), server, false, null); + ConnectScreen.startConnecting(new TitleScreen(), Minecraft.getInstance(), ServerAddress.parseString(server.ip), server, false, null); }); } public static void loadWorld(String worldName) { - MinecraftClient.getInstance().send(() -> { - if (MinecraftClient.getInstance().getLevelStorage().levelExists(worldName)) { + Minecraft.getInstance().execute(() -> { + if (Minecraft.getInstance().getLevelSource().levelExists(worldName)) { leaveIfNeeded(); SimpleMainMenuLibClient.LOGGER.info("Loading world..."); - MinecraftClient.getInstance().createIntegratedServerLoader().start(worldName, () -> { + Minecraft.getInstance().createWorldOpenFlows().openWorld(worldName, () -> { SimpleMainMenuLibClient.LOGGER.info("World load cancelled."); - MinecraftClient.getInstance().setScreen(new TitleScreen()); + Minecraft.getInstance().setScreen(new TitleScreen()); }); } else { SimpleMainMenuLibClient.LOGGER.warn("World " + worldName + " does not exist!"); - if (MinecraftClient.getInstance().world == null) - MinecraftClient.getInstance().setScreen(new NoticeScreen(() -> MinecraftClient.getInstance().setScreen(new TitleScreen()), Text.translatable("text.smm-lib.error.worldnotfound.title"), Text.translatable("text.smm-lib.error.worldnotfound.body", worldName), ScreenTexts.TO_TITLE, true)); + if (Minecraft.getInstance().level == null) + Minecraft.getInstance().setScreen(new AlertScreen(() -> Minecraft.getInstance().setScreen(new TitleScreen()), Component.translatable("text.smm-lib.error.worldnotfound.title"), Component.translatable("text.smm-lib.error.worldnotfound.body", worldName), Component.translatable("gui.toTitle"), true)); } }); } @@ -129,11 +128,11 @@ public static void loadWorld(String worldName) { * Checks if in a world and leaves it. */ private static void leaveIfNeeded() { - if (MinecraftClient.getInstance().world != null) { + if (Minecraft.getInstance().level != null) { SimpleMainMenuLibClient.LOGGER.info("Disconnecting from world..."); - MinecraftClient.getInstance().world.disconnect(Text.translatable("menu.disconnect")); - MinecraftClient.getInstance().disconnectWithProgressScreen(); + Minecraft.getInstance().level.disconnect(Component.translatable("menu.disconnect")); + Minecraft.getInstance().disconnectWithProgressScreen(); } } diff --git a/src/main/java/com/mosadie/simplemainmenu/client/SimpleMainMenuLibClient.java b/src/main/java/com/mosadie/simplemainmenu/client/SimpleMainMenuLibClient.java index b0ff11f..e018d89 100644 --- a/src/main/java/com/mosadie/simplemainmenu/client/SimpleMainMenuLibClient.java +++ b/src/main/java/com/mosadie/simplemainmenu/client/SimpleMainMenuLibClient.java @@ -8,11 +8,11 @@ import me.shedaniel.autoconfig.serializer.GsonConfigSerializer; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; -import net.minecraft.text.Text; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Identifier; +import net.minecraft.core.Registry; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.InteractionResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,8 +21,8 @@ public class SimpleMainMenuLibClient implements ClientModInitializer { public static final String MOD_ID = "smm-lib"; public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); - static RegistryKey> registryKey = RegistryKey.ofRegistry(Identifier.of(MOD_ID, "menu_theme")); - public static Registry registry = FabricRegistryBuilder.createSimple(registryKey) + static ResourceKey> registryKey = ResourceKey.createRegistryKey(Identifier.fromNamespaceAndPath(MOD_ID, "menu_theme")); + public static Registry registry = FabricRegistryBuilder.create(registryKey) .buildAndRegister(); private static MenuTheme selectTheme() { @@ -33,9 +33,9 @@ private static MenuTheme selectTheme() { if (config != null && config.themeOptions.themeNamespace != null && config.themeOptions.themeId != null && config.themeOptions.overrideTheme) { LOGGER.info("Theme selected via override: " + config.themeOptions.themeNamespace + ":" + config.themeOptions.themeId); - Identifier id = Identifier.of(config.themeOptions.themeNamespace, config.themeOptions.themeId); - if (registry.containsId(id)) { - selectedTheme = registry.get(id); + Identifier id = Identifier.fromNamespaceAndPath(config.themeOptions.themeNamespace, config.themeOptions.themeId); + if (registry.containsKey(id)) { + selectedTheme = registry.getValue(id); } else { LOGGER.info("Failed to get theme via override! Falling back to Normal."); @@ -78,20 +78,20 @@ public static MenuTheme getTheme() { private static SimpleMainMenuLibConfig config; - public static Text[] getSplashText() { + public static Component[] getSplashText() { if (config != null && config.splashOptions.overrideSplash) { - return new Text[] { Text.of(config.splashOptions.overrideSplashText) }; + return new Component[] { Component.literal(config.splashOptions.overrideSplashText).setStyle(Util.SPLASH_TEXT_STYLE) }; } return getTheme().getSplashText().lines(); } - public static Text getButtonText() { + public static Component getButtonComponent() { if (config != null && config.quickJoinButtonOptions.overrideQuickJoinButton) { - return Text.of(config.quickJoinButtonOptions.buttonTextOverride); + return Component.literal(config.quickJoinButtonOptions.buttonTextOverride); } - return getTheme().getQuickJoinButtonText(); + return getTheme().getQuickJoinButtonComponent(); } public static void onQuickJoinClick() { @@ -150,16 +150,16 @@ public void onInitializeClient() { config = AutoConfig.getConfigHolder(SimpleMainMenuLibConfig.class).getConfig(); - LOGGER.info("SimpleServerMenu-Lib Initialized!"); + LOGGER.info("SimpleMainMenu-Lib Initialized!"); } - private static ActionResult onConfigSave(ConfigHolder simpleMainMenuLibConfigConfigHolder, SimpleMainMenuLibConfig simpleMainMenuLibConfig) { + private static InteractionResult onConfigSave(ConfigHolder simpleMainMenuLibConfigConfigHolder, SimpleMainMenuLibConfig simpleMainMenuLibConfig) { LOGGER.info("Updating config!"); config = simpleMainMenuLibConfig; menuTheme = selectTheme(); - return ActionResult.PASS; + return InteractionResult.PASS; } } diff --git a/src/main/java/com/mosadie/simplemainmenu/client/data/SimpleMainMenuLibEnLangProvider.java b/src/main/java/com/mosadie/simplemainmenu/client/data/SimpleMainMenuLibEnLangProvider.java index 7b1fb84..6cfb55c 100644 --- a/src/main/java/com/mosadie/simplemainmenu/client/data/SimpleMainMenuLibEnLangProvider.java +++ b/src/main/java/com/mosadie/simplemainmenu/client/data/SimpleMainMenuLibEnLangProvider.java @@ -1,18 +1,18 @@ package com.mosadie.simplemainmenu.client.data; -import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.FabricPackOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricLanguageProvider; -import net.minecraft.registry.RegistryWrapper; +import net.minecraft.core.HolderLookup; import java.util.concurrent.CompletableFuture; public class SimpleMainMenuLibEnLangProvider extends FabricLanguageProvider { - protected SimpleMainMenuLibEnLangProvider(FabricDataOutput dataOutput, CompletableFuture registryLookup) { - super(dataOutput, "en_us", registryLookup); + protected SimpleMainMenuLibEnLangProvider(FabricPackOutput packOutput, CompletableFuture registryLookup) { + super(packOutput, "en_us", registryLookup); } - @Override - public void generateTranslations(RegistryWrapper.WrapperLookup wrapperLookup, TranslationBuilder translationBuilder) { + public void generateTranslations(HolderLookup.Provider provider, TranslationBuilder translationBuilder) { + translationBuilder.add("text.smmlib.normaltheme.joinserver", "Join the server!"); translationBuilder.add("text.autoconfig.smm-lib.title", "SimpleMainMenu Lib Settings"); diff --git a/src/main/java/com/mosadie/simplemainmenu/duck/MultilineSplashTextRenderer.java b/src/main/java/com/mosadie/simplemainmenu/duck/MultilineSplashTextRenderer.java index 8e08212..660578e 100644 --- a/src/main/java/com/mosadie/simplemainmenu/duck/MultilineSplashTextRenderer.java +++ b/src/main/java/com/mosadie/simplemainmenu/duck/MultilineSplashTextRenderer.java @@ -1,7 +1,7 @@ package com.mosadie.simplemainmenu.duck; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Component; public interface MultilineSplashTextRenderer { - void smm_lib$setMultilineText(Text[] multilineText); + void smm_lib$setMultilineText(Component[] multilineComponent); } diff --git a/src/main/java/com/mosadie/simplemainmenu/mixin/IdentifierMixin.java b/src/main/java/com/mosadie/simplemainmenu/mixin/IdentifierMixin.java index 1a7ff19..01719ee 100644 --- a/src/main/java/com/mosadie/simplemainmenu/mixin/IdentifierMixin.java +++ b/src/main/java/com/mosadie/simplemainmenu/mixin/IdentifierMixin.java @@ -1,7 +1,7 @@ package com.mosadie.simplemainmenu.mixin; import com.mosadie.simplemainmenu.client.SimpleMainMenuLibClient; -import net.minecraft.util.Identifier; +import net.minecraft.resources.Identifier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; @@ -14,12 +14,12 @@ public class IdentifierMixin { * @reason Trying to get the panorama ID to resolve to a custom one instead, am tied of running into so many rendering issues so time for hacky solutions. Added in v2.0.5 when updating to Minecraft 1.21.5 because I could not get the previous system of overwriting the panorama renderer completely to work. */ @Overwrite - public static Identifier ofVanilla(String path) { + public static Identifier withDefaultNamespace(String path) { // If we are getting the background panorama texture, we want to return the custom panorama texture from the selected theme instead. if (path != null && path.equals("textures/gui/title/background/panorama")) { return SimpleMainMenuLibClient.getTheme().getPanorama(); } - return Identifier.of("minecraft", path); + return Identifier.fromNamespaceAndPath("minecraft", path); } } diff --git a/src/main/java/com/mosadie/simplemainmenu/mixin/SplashTextRendererMixin.java b/src/main/java/com/mosadie/simplemainmenu/mixin/SplashTextRendererMixin.java index fe54a4c..4f2acc0 100644 --- a/src/main/java/com/mosadie/simplemainmenu/mixin/SplashTextRendererMixin.java +++ b/src/main/java/com/mosadie/simplemainmenu/mixin/SplashTextRendererMixin.java @@ -3,60 +3,60 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.mosadie.simplemainmenu.duck.MultilineSplashTextRenderer; -import net.minecraft.client.font.Alignment; -import net.minecraft.client.font.DrawnTextConsumer; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.screen.SplashTextRenderer; -import net.minecraft.text.StringVisitable; -import net.minecraft.text.Text; +import net.minecraft.client.gui.ActiveTextCollector; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.TextAlignment; +import net.minecraft.client.gui.components.SplashRenderer; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.FormattedText; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -@Mixin(SplashTextRenderer.class) +@Mixin(SplashRenderer.class) public abstract class SplashTextRendererMixin implements MultilineSplashTextRenderer { @Unique - private Text[] smm_lib$multilineText; + private Component[] smm_lib$multilineText; @WrapOperation( - method = "render", + method = "extractRenderState", at = @At( value = "INVOKE", - target = "Lnet/minecraft/client/font/TextRenderer;getWidth(Lnet/minecraft/text/StringVisitable;)I" + target = "Lnet/minecraft/client/gui/Font;width(Lnet/minecraft/network/chat/FormattedText;)I" ) ) - private int smm_lib$getMultilineTextWidth(TextRenderer instance, StringVisitable text, Operation original) { + private int smm_lib$getMultilineTextWidth(Font instance, FormattedText text, Operation original) { if (smm_lib$multilineText == null) return original.call(instance, text); int result = 0; - for (Text line : smm_lib$multilineText) { + for (Component line : smm_lib$multilineText) { result = Math.max(original.call(instance, line), result); } return result; } @WrapOperation( - method = "render", + method = "extractRenderState", at = @At( value = "INVOKE", - target = "Lnet/minecraft/client/font/DrawnTextConsumer;text(Lnet/minecraft/client/font/Alignment;IILnet/minecraft/client/font/DrawnTextConsumer$Transformation;Lnet/minecraft/text/Text;)V" + target = "Lnet/minecraft/client/gui/ActiveTextCollector;accept(Lnet/minecraft/client/gui/TextAlignment;IILnet/minecraft/client/gui/ActiveTextCollector$Parameters;Lnet/minecraft/network/chat/Component;)V" ) ) - private void smm_lib$renderMultilineText(DrawnTextConsumer instance, Alignment alignment, int x, int y, DrawnTextConsumer.Transformation transformation, Text text, Operation original) { + private void smm_lib$renderMultilineText(ActiveTextCollector instance, TextAlignment alignment, int x, int y, ActiveTextCollector.Parameters parameters, Component text, Operation original) { if (smm_lib$multilineText == null) { - original.call(instance, alignment, x, y, transformation, text); + original.call(instance, alignment, x, y, parameters, text); return; } - for (Text line : smm_lib$multilineText) { + for (Component line : smm_lib$multilineText) { // Use center alignment as then... idk I'd say it looks better - original.call(instance, Alignment.CENTER, 0, y, transformation, line); + original.call(instance, TextAlignment.CENTER, 0, y, parameters, line); y += 9; } } @Override - public void smm_lib$setMultilineText(Text[] multilineText) { + public void smm_lib$setMultilineText(Component[] multilineText) { this.smm_lib$multilineText = multilineText; } } diff --git a/src/main/java/com/mosadie/simplemainmenu/mixin/TitleScreenInvoker.java b/src/main/java/com/mosadie/simplemainmenu/mixin/TitleScreenInvoker.java index 546c19b..91be7d9 100644 --- a/src/main/java/com/mosadie/simplemainmenu/mixin/TitleScreenInvoker.java +++ b/src/main/java/com/mosadie/simplemainmenu/mixin/TitleScreenInvoker.java @@ -1,13 +1,13 @@ package com.mosadie.simplemainmenu.mixin; -import net.minecraft.client.gui.screen.TitleScreen; -import net.minecraft.text.Text; +import net.minecraft.client.gui.screens.TitleScreen; +import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(TitleScreen.class) public interface TitleScreenInvoker { - @Invoker("getMultiplayerDisabledText") - Text invokeGetMultiplayerDisabledText(); + @Invoker("getMultiplayerDisabledReason") + Component invokeGetMultiplayerDisabledReason(); } diff --git a/src/main/java/com/mosadie/simplemainmenu/mixin/TitleScreenMixin.java b/src/main/java/com/mosadie/simplemainmenu/mixin/TitleScreenMixin.java index e733b25..e9df0fa 100644 --- a/src/main/java/com/mosadie/simplemainmenu/mixin/TitleScreenMixin.java +++ b/src/main/java/com/mosadie/simplemainmenu/mixin/TitleScreenMixin.java @@ -1,20 +1,20 @@ package com.mosadie.simplemainmenu.mixin; +import com.mojang.realmsclient.gui.screens.RealmsNotificationsScreen; import com.mosadie.simplemainmenu.client.SimpleMainMenuLibClient; import com.mosadie.simplemainmenu.duck.MultilineSplashTextRenderer; import com.terraformersmc.modmenu.ModMenu; import com.terraformersmc.modmenu.api.ModMenuApi; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.SplashTextRenderer; -import net.minecraft.client.gui.screen.TitleScreen; -import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; -import net.minecraft.client.gui.screen.multiplayer.MultiplayerWarningScreen; -import net.minecraft.client.gui.screen.world.SelectWorldScreen; -import net.minecraft.client.gui.tooltip.Tooltip; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.realms.gui.screen.RealmsNotificationsScreen; -import net.minecraft.text.Text; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.SplashRenderer; +import net.minecraft.client.gui.components.Tooltip; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.TitleScreen; +import net.minecraft.client.gui.screens.multiplayer.JoinMultiplayerScreen; +import net.minecraft.client.gui.screens.multiplayer.SafetyScreen; +import net.minecraft.client.gui.screens.worldselection.SelectWorldScreen; +import net.minecraft.network.chat.Component; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -26,35 +26,36 @@ @Mixin(TitleScreen.class) public abstract class TitleScreenMixin extends Screen { - @Shadow @Nullable private SplashTextRenderer splashText; - @Shadow @Nullable private RealmsNotificationsScreen realmsNotificationGui; + @Shadow @Nullable private SplashRenderer splash; + @Shadow @Nullable private RealmsNotificationsScreen realmsNotificationsScreen; - protected TitleScreenMixin(Text title) { + protected TitleScreenMixin(Component title) { super(title); } - @Inject(method = "Lnet/minecraft/client/gui/screen/TitleScreen;isRealmsNotificationsGuiDisplayed()Z", at = @At("HEAD"), cancellable = true) + // "Lnet/minecraft/client/gui/screen/TitleScreen;isRealmsNotificationsGuiDisplayed()Z" + @Inject(method = "realmsNotificationsEnabled", at = @At("HEAD"), cancellable = true) private void injectRealmNotification(CallbackInfoReturnable info) { info.setReturnValue(false); } - @Inject(method = "onDisplayed", at = @At("HEAD"), cancellable = true) - private void injectOnDisplayed(CallbackInfo ci) { - super.onDisplayed(); - ci.cancel(); - } +// @Inject(method = "onDisplayed", at = @At("HEAD"), cancellable = true) +// private void injectOnDisplayed(CallbackInfo ci) { +// super.onDisplayed(); +// ci.cancel(); +// } @Inject(method = "init()V", at = @At("HEAD")) private void injectSplashText(CallbackInfo info) { - if (splashText == null) { - Text[] splashes = SimpleMainMenuLibClient.getSplashText(); + if (splash == null) { + Component[] splashes = SimpleMainMenuLibClient.getSplashText(); // Still provide the first line or empty to avoid anything else that tries to use it crashing - this.splashText = new SplashTextRenderer(splashes.length == 0 ? Text.of("") : splashes[0]); - ((MultilineSplashTextRenderer) this.splashText).smm_lib$setMultilineText(splashes); + this.splash = new SplashRenderer(splashes.length == 0 ? Component.literal("") : splashes[0]); + ((MultilineSplashTextRenderer) this.splash).smm_lib$setMultilineText(splashes); } } - @Redirect(method = "init()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/TitleScreen;addNormalWidgets(II)I")) + @Redirect(method = "init()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/TitleScreen;createNormalMenuOptions(II)I")) private int redirectInitWidgetsNormal(TitleScreen self, int y, int spacingY) { int buttonYMulti = 0; @@ -69,27 +70,27 @@ private int redirectInitWidgetsNormal(TitleScreen self, int y, int spacingY) { } if (SimpleMainMenuLibClient.isSingleplayerVisible()) { - ButtonWidget.Builder singlePlayerButtonWidgetBuilder = ButtonWidget.builder(Text.translatable("menu.singleplayer"), (button -> { - MinecraftClient.getInstance().setScreen(new SelectWorldScreen((self))); + Button.Builder singlePlayerButtonWidgetBuilder = Button.builder(Component.translatable("menu.singleplayer"), (button -> { + Minecraft.getInstance().setScreen(new SelectWorldScreen((self))); })) .size(200, 20) - .position(self.width / 2 - 100, y); + .pos(self.width / 2 - 100, y); - this.addDrawableChild(singlePlayerButtonWidgetBuilder.build()); + this.addRenderableWidget(singlePlayerButtonWidgetBuilder.build()); buttonYMulti++; } - final Text disabledText = ((TitleScreenInvoker) this).invokeGetMultiplayerDisabledText(); + final Component disabledText = ((TitleScreenInvoker) this).invokeGetMultiplayerDisabledReason(); boolean isDisabled = disabledText != null; - Tooltip tooltip = Tooltip.of(disabledText); + Tooltip tooltip = Tooltip.create(disabledText); if (SimpleMainMenuLibClient.isQuickJoinVisible()) { - ButtonWidget.Builder quickJoinButtonWidgetBuilder = ButtonWidget.builder(SimpleMainMenuLibClient.getButtonText(), (button) -> { + Button.Builder quickJoinButtonWidgetBuilder = Button.builder(SimpleMainMenuLibClient.getButtonComponent(), (button) -> { SimpleMainMenuLibClient.onQuickJoinClick(); - }).position(self.width / 2 - 100, y + (spacingY * buttonYMulti++)).size(200, 20); + }).pos(self.width / 2 - 100, y + (spacingY * buttonYMulti++)).size(200, 20); // Technically as of v2.0.0, this button can connect to things outside of multiplayer, // but since it's possible, still going to disable it. @@ -98,35 +99,35 @@ private int redirectInitWidgetsNormal(TitleScreen self, int y, int spacingY) { quickJoinButtonWidgetBuilder.tooltip(tooltip); } - ButtonWidget joinServerButtonWidget = quickJoinButtonWidgetBuilder.build(); + Button joinServerButtonWidget = quickJoinButtonWidgetBuilder.build(); joinServerButtonWidget.active = !isDisabled; - this.addDrawableChild(quickJoinButtonWidgetBuilder.build()); + this.addRenderableWidget(quickJoinButtonWidgetBuilder.build()); } if (SimpleMainMenuLibClient.isMultiplayerVisible()) { - ButtonWidget.Builder multiplayerButtonWidgetBuilder = ButtonWidget.builder(Text.translatable("menu.multiplayer"), button -> { - Screen screen = MinecraftClient.getInstance().options.skipMultiplayerWarning ? new MultiplayerScreen(self) : new MultiplayerWarningScreen(self); - MinecraftClient.getInstance().setScreen(screen); - }).position(self.width / 2 - 100, y + (spacingY * buttonYMulti++)).size(200, 20); + Button.Builder multiplayerButtonWidgetBuilder = Button.builder(Component.translatable("menu.multiplayer"), button -> { + Screen screen = Minecraft.getInstance().options.skipMultiplayerWarning ? new JoinMultiplayerScreen(self) : new SafetyScreen(self); + Minecraft.getInstance().setScreen(screen); + }).pos(self.width / 2 - 100, y + (spacingY * buttonYMulti++)).size(200, 20); if (isDisabled) multiplayerButtonWidgetBuilder.tooltip(tooltip); - ButtonWidget multiplayerButtonWidget = multiplayerButtonWidgetBuilder.build(); + Button multiplayerButtonWidget = multiplayerButtonWidgetBuilder.build(); multiplayerButtonWidget.active = !isDisabled; - this.addDrawableChild(multiplayerButtonWidget); + this.addRenderableWidget(multiplayerButtonWidget); } if (SimpleMainMenuLibClient.isModsVisible()) { - ButtonWidget.Builder modsButtonWidgetBuilder = ButtonWidget.builder(ModMenu.createModsButtonText(true), button -> { - Screen modsScreen = ModMenuApi.createModsScreen(MinecraftClient.getInstance().currentScreen); - MinecraftClient.getInstance().setScreen(modsScreen); - }).position(self.width / 2 + 104, y + spacingY).size(50, 20); + Button.Builder modsButtonWidgetBuilder = Button.builder(ModMenu.createModsButtonText(true), button -> { + Screen modsScreen = ModMenuApi.createModsScreen(Minecraft.getInstance().screen); + Minecraft.getInstance().setScreen(modsScreen); + }).pos(self.width / 2 + 104, y + spacingY).size(50, 20); - ButtonWidget modsButtonWidget = modsButtonWidgetBuilder.build(); + Button modsButtonWidget = modsButtonWidgetBuilder.build(); - this.addDrawableChild(modsButtonWidget); + this.addRenderableWidget(modsButtonWidget); } return y + (--buttonYMulti * spacingY); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 8648f7a..a60f758 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -31,10 +31,10 @@ ], "depends": { "fabricloader": ">=0.18.0", - "fabric-api": ">=0.128.2", - "minecraft": "~1.21", - "modmenu": ">=16.0.0", - "cloth-config": ">=21.0.0" + "fabric-api": ">=0.144.3", + "minecraft": "~26.1", + "modmenu": ">=17.0.0", + "cloth-config": ">=26.0.0" }, "custom": { "modmenu": {