Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
14 changes: 9 additions & 5 deletions .github/workflows/buildRelease.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
13 changes: 6 additions & 7 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
plugins {
id 'fabric-loom' version "${loom_version}"
id 'net.fabricmc.fabric-loom' version "${loom_version}"
id 'maven-publish'
}

Expand Down Expand Up @@ -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 {
Expand All @@ -67,7 +66,7 @@ processResources {
}
}

def targetJavaVersion = JavaVersion.VERSION_21
def targetJavaVersion = JavaVersion.VERSION_25


java {
Expand Down
15 changes: 7 additions & 8 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
cloth_config_version=26.1.154
mod_menu_version=18.0.0-alpha.8
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -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
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/com/mosadie/simplemainmenu/api/MenuTheme.java
Original file line number Diff line number Diff line change
@@ -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();
Expand All @@ -13,7 +14,7 @@ public interface MenuTheme {
int getPriority();

// -- Quick Join Button ---
Text getQuickJoinButtonText();
Component getQuickJoinButtonComponent();
void onQuickJoinClicked();

// --- Button Visibility ---
Expand Down
12 changes: 6 additions & 6 deletions src/main/java/com/mosadie/simplemainmenu/api/NormalTheme.java
Original file line number Diff line number Diff line change
@@ -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.
Expand All @@ -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
Expand Down
18 changes: 9 additions & 9 deletions src/main/java/com/mosadie/simplemainmenu/api/SplashText.java
Original file line number Diff line number Diff line change
@@ -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);
Expand All @@ -17,19 +17,19 @@ public static Builder builder() {
}

public static final class Builder {
private final List<Text> lines = new ArrayList<>();
private final List<Component> 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));
}
}
}
61 changes: 30 additions & 31 deletions src/main/java/com/mosadie/simplemainmenu/api/Util.java
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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);
Expand All @@ -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();
}
}
Expand All @@ -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();
}
Expand All @@ -84,43 +83,43 @@ 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);
}
}

/**
* 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));
}
});
}
Expand All @@ -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();
}
}

Expand Down
Loading