diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..1723548 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,42 @@ +name: Build + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + workflow_dispatch: + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up JDK 25 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: '25' + + - name: Make gradlew executable + run: chmod +x ./gradlew + + - name: Build + uses: gradle/actions/setup-gradle@v4 + with: + cache-read-only: ${{ github.ref != 'refs/heads/master' }} + + - name: Run build + run: ./gradlew build --stacktrace + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: autoserverworldselection-jars + path: build/libs/*.jar + if-no-files-found: error diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..a307a3f --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,39 @@ +name: Release + +on: + push: + tags: + - 'v*' + workflow_dispatch: + +permissions: + contents: write + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up JDK 25 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: '25' + + - name: Make gradlew executable + run: chmod +x ./gradlew + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Build + run: ./gradlew build --stacktrace + + - name: Publish GitHub Release + uses: softprops/action-gh-release@v2 + with: + files: build/libs/*.jar + generate_release_notes: true + fail_on_unmatched_files: true diff --git a/build.gradle b/build.gradle index 17e3f29..b191cae 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'net.fabricmc.fabric-loom-remap' version "${loom_version}" + id 'net.fabricmc.fabric-loom' version "${loom_version}" id 'maven-publish' @@ -20,18 +20,18 @@ repositories { } dependencies { + // Minecraft 26.1+ is unobfuscated and ships with official Mojang names, so no `mappings` line is needed. 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_version}" + implementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}" // Minimap mods - modImplementation "curse.maven:xaerosminimap-263420:${project.xaerosminimap_version}" - modImplementation "curse.maven:xaerosworldmap-317780:${project.xaerosworldmap_version}" + implementation "curse.maven:xaerosminimap-263420:${project.xaerosminimap_version}" + implementation "curse.maven:xaerosworldmap-317780:${project.xaerosworldmap_version}" - modApi "com.terraformersmc:modmenu:${project.modmenu_version}" - modApi("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_config_version}") { + api "com.terraformersmc:modmenu:${project.modmenu_version}" + api("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_config_version}") { exclude(group: "net.fabricmc.fabric-api") } } @@ -49,8 +49,8 @@ processResources { } tasks.withType(JavaCompile).configureEach { - // Minecraft 1.18 (1.18-pre2) upwards uses Java 17. - it.options.release = 21 + // Minecraft 26.1 upwards uses Java 25. + it.options.release = 25 } java { @@ -59,8 +59,8 @@ java { // If you remove this line, sources will not be generated. withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 } jar { diff --git a/gradle.properties b/gradle.properties index b316864..b1c6a5c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,22 +2,22 @@ org.gradle.jvmargs=-Xmx1G # Mod Properties -mod_version=1.0.5-1.21.11 +mod_version=1.0.6-26.2 maven_group=com.mrengman archives_base_name=autoserverworldselection # Fabric Properties -minecraft_version=1.21.11 -yarn_mappings=1.21.11-rc3+build.1 -loader_version=0.18.4 -loom_version=1.15-SNAPSHOT +# Since MC 1.21.11 the game is unobfuscated and uses official Mojang mappings, so yarn_mappings is no longer needed. +minecraft_version=26.2 +loader_version=0.19.3 +loom_version=1.17-SNAPSHOT #Fabric api -fabric_version=0.141.3+1.21.11 +fabric_api_version=0.155.2+26.2 -# Dependencies -xaerosminimap_version=4593188 -xaerosworldmap_version=4594989 +# Dependencies (CurseForge file IDs for the Fabric 26.2 builds) +xaerosminimap_version=8449861 +xaerosworldmap_version=8449956 -modmenu_version=7.1.0 -cloth_config_version=13.0.114 \ No newline at end of file +modmenu_version=20.0.1 +cloth_config_version=26.2.155 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5dc98db..efb903f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/com/mrengman/autoserverworldselection/AutoServerWorldSelection.java b/src/main/java/com/mrengman/autoserverworldselection/AutoServerWorldSelection.java index 6277fbb..4ded69d 100644 --- a/src/main/java/com/mrengman/autoserverworldselection/AutoServerWorldSelection.java +++ b/src/main/java/com/mrengman/autoserverworldselection/AutoServerWorldSelection.java @@ -3,6 +3,7 @@ import com.mrengman.autoserverworldselection.config.AutoServerWorldSelectionConfig; import com.mrengman.autoserverworldselection.config.EnabledServerAddressesGuiProvider; import me.shedaniel.autoconfig.AutoConfig; +import me.shedaniel.autoconfig.AutoConfigClient; import me.shedaniel.autoconfig.event.ConfigSerializeEvent; import me.shedaniel.autoconfig.serializer.GsonConfigSerializer; import net.fabricmc.api.ClientModInitializer; @@ -22,9 +23,9 @@ public void onInitializeClient() { loadConfig(); ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> { - if (!client.isIntegratedServerRunning()) { + if (!client.hasSingleplayerServer()) { try { - currentServerIP = Objects.requireNonNull(client.getCurrentServerEntry()).address; + currentServerIP = Objects.requireNonNull(client.getCurrentServer()).ip; } catch (NullPointerException e) { enabled = false; } @@ -40,7 +41,7 @@ public void onInitializeClient() { public void loadConfig() { AutoConfig.register(AutoServerWorldSelectionConfig.class, GsonConfigSerializer::new); - var guiRegistry = AutoConfig.getGuiRegistry(AutoServerWorldSelectionConfig.class); + var guiRegistry = AutoConfigClient.getGuiRegistry(AutoServerWorldSelectionConfig.class); guiRegistry.registerPredicateProvider( new EnabledServerAddressesGuiProvider(), field -> field.getName().equals("enabledServerAddresses") diff --git a/src/main/java/com/mrengman/autoserverworldselection/config/AutoServerWorldSelectionModMenuIntegration.java b/src/main/java/com/mrengman/autoserverworldselection/config/AutoServerWorldSelectionModMenuIntegration.java index b5432e5..39fb80e 100644 --- a/src/main/java/com/mrengman/autoserverworldselection/config/AutoServerWorldSelectionModMenuIntegration.java +++ b/src/main/java/com/mrengman/autoserverworldselection/config/AutoServerWorldSelectionModMenuIntegration.java @@ -2,11 +2,11 @@ import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; -import me.shedaniel.autoconfig.AutoConfig; +import me.shedaniel.autoconfig.AutoConfigClient; public class AutoServerWorldSelectionModMenuIntegration implements ModMenuApi { @Override public ConfigScreenFactory getModConfigScreenFactory() { - return parent -> AutoConfig.getConfigScreen(AutoServerWorldSelectionConfig.class, parent).get(); + return parent -> AutoConfigClient.getConfigScreen(AutoServerWorldSelectionConfig.class, parent).get(); } } \ No newline at end of file diff --git a/src/main/java/com/mrengman/autoserverworldselection/config/EnabledServerAddressesGuiProvider.java b/src/main/java/com/mrengman/autoserverworldselection/config/EnabledServerAddressesGuiProvider.java index 5fae6a1..077067a 100644 --- a/src/main/java/com/mrengman/autoserverworldselection/config/EnabledServerAddressesGuiProvider.java +++ b/src/main/java/com/mrengman/autoserverworldselection/config/EnabledServerAddressesGuiProvider.java @@ -6,7 +6,7 @@ import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; import me.shedaniel.clothconfig2.gui.entries.StringListListEntry; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Component; import java.lang.reflect.Field; import java.util.Collections; @@ -19,7 +19,7 @@ public class EnabledServerAddressesGuiProvider implements GuiProvider { public List get(String i13n, Field field, Object config, Object defaults, GuiRegistryAccess registry) { return Collections.singletonList( ConfigEntryBuilder.create() - .startStrList(Text.translatable(i13n), Utils.getUnsafely(field, config)) + .startStrList(Component.translatable(i13n), Utils.getUnsafely(field, config)) .setExpanded(true) .setCreateNewInstance(entry -> new StringListListEntry.StringListCell("play.example.com", entry)) .setDefaultValue(() -> Utils.getUnsafely(field, defaults)) diff --git a/src/main/java/com/mrengman/autoserverworldselection/mixins/BiomeAccessAccessor.java b/src/main/java/com/mrengman/autoserverworldselection/mixins/BiomeAccessAccessor.java index b15bc62..2d8f201 100644 --- a/src/main/java/com/mrengman/autoserverworldselection/mixins/BiomeAccessAccessor.java +++ b/src/main/java/com/mrengman/autoserverworldselection/mixins/BiomeAccessAccessor.java @@ -1,11 +1,11 @@ package com.mrengman.autoserverworldselection.mixins; -import net.minecraft.world.biome.source.BiomeAccess; +import net.minecraft.world.level.biome.BiomeManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(BiomeAccess.class) +@Mixin(BiomeManager.class) public interface BiomeAccessAccessor { - @Accessor + @Accessor("biomeZoomSeed") long getSeed(); } diff --git a/src/main/java/com/mrengman/autoserverworldselection/mixins/MixinMapProcessor.java b/src/main/java/com/mrengman/autoserverworldselection/mixins/MixinMapProcessor.java index 1884a4f..158ada0 100644 --- a/src/main/java/com/mrengman/autoserverworldselection/mixins/MixinMapProcessor.java +++ b/src/main/java/com/mrengman/autoserverworldselection/mixins/MixinMapProcessor.java @@ -1,7 +1,7 @@ package com.mrengman.autoserverworldselection.mixins; import com.mrengman.autoserverworldselection.AutoServerWorldSelection; -import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.multiplayer.ClientLevel; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -12,9 +12,9 @@ public abstract class MixinMapProcessor { @Inject(at = @At("TAIL"), method = "getAutoIdBase", cancellable = true) - public void getAutoIdBase(ClientWorld world, CallbackInfoReturnable cir) { + public void getAutoIdBase(ClientLevel world, CallbackInfoReturnable cir) { if(!AutoServerWorldSelection.enabled) return; - Integer seedHash = (int) ((BiomeAccessAccessor) world.getBiomeAccess()).getSeed(); + Integer seedHash = (int) ((BiomeAccessAccessor) world.getBiomeManager()).getSeed(); cir.setReturnValue(seedHash); } diff --git a/src/main/resources/autoserverworldselection.mixins.json b/src/main/resources/autoserverworldselection.mixins.json index de65a23..ab2ff65 100644 --- a/src/main/resources/autoserverworldselection.mixins.json +++ b/src/main/resources/autoserverworldselection.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "com.mrengman.autoserverworldselection.mixins", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "JAVA_25", "client": [ "MixinMapProcessor", "BiomeAccessAccessor" diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index c431a4f..7c5f8dd 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -22,10 +22,10 @@ ], "icon": "assets/autoserverworldselection/icon.png", "depends": { - "fabricloader": ">=0.18.4", - "minecraft": "~1.21.11", - "xaeroworldmap": ">=1.30.4", - "java":">=21", + "fabricloader": ">=0.19.3", + "minecraft": ">=26.2", + "xaeroworldmap": ">=1.44.2", + "java":">=25", "fabric-api": "*", "cloth-config2": "*" }