diff --git a/CHANGELOG.md b/CHANGELOG.md index a1b7434..fa7db76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1 +1,2 @@ -- Updated to 1.21.11. +- Fixed Menderman game rules not being data fixed to the new format. +- Fixed game rule value changes not updating the Anvil GUI's information on clients. diff --git a/fabric-unobfuscated/build.gradle.kts b/fabric-unobfuscated/build.gradle.kts index 293ebcd..3cd76a4 100644 --- a/fabric-unobfuscated/build.gradle.kts +++ b/fabric-unobfuscated/build.gradle.kts @@ -24,12 +24,6 @@ dependencies { "unobfJava"(project(":fabric", "unobfJava")) "unobfResources"(project(":fabric", "unobfResources")) -// modCompileOnly(libs.jei.fabric) -// modCompileOnly(libs.rei.fabric) -// modCompileOnly(libs.emi.fabric) - - // Uncomment to test. CTRL + / will comment the current line. -// modLocalRuntime(libs.jei.fabric) } fabricApi { @@ -52,22 +46,6 @@ loom { } } runs { - named("client") { - client() - configName = "Fabric Client" - setSource(sourceSets["test"]) - ideConfigGenerated(true) - vmArgs("-Dmixin.debug.export=true") - runDir("runs/client") - } - named("server") { - server() - configName = "Fabric Server" - setSource(sourceSets["test"]) - ideConfigGenerated(true) - vmArgs("-Dmixin.debug.export=true") - runDir("runs/server") - } register("datagen") { server() configName = "Fabric Datagen" @@ -80,15 +58,6 @@ loom { ) runDir("build/datagen") } - register("gameTest") { - server() - configName = "Fabric Game Tests" - runDir("build/gametest") - setSource(sourceSets["test"]) - ideConfigGenerated(true) - property("fabric-api.gametest") - runDir("build/gametest") - } } } diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index acb61b1..b0bcf18 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -16,12 +16,15 @@ dependencies { modImplementation(libs.fabric.loader) modImplementation(libs.fabric.api) -// modCompileOnly(libs.jei.fabric) + modLocalRuntime(libs.mod.menu) + + modCompileOnly(libs.jei.fabric) // modCompileOnly(libs.rei.fabric) // modCompileOnly(libs.emi.fabric) // Uncomment to test. CTRL + / will comment the current line. -// modLocalRuntime(libs.jei.fabric) + modLocalRuntime(libs.jei.fabric) + } loom { @@ -36,6 +39,24 @@ loom { sourceSet(sourceSets["test"]) } } + runs { + named("client") { + client() + configName = "Fabric Client" + setSource(sourceSets["test"]) + ideConfigGenerated(true) + vmArgs("-Dmixin.debug.export=true") + runDir("runs/client") + } + named("server") { + server() + configName = "Fabric Server" + setSource(sourceSets["test"]) + ideConfigGenerated(true) + vmArgs("-Dmixin.debug.export=true") + runDir("runs/server") + } + } } configurations { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c163ab2..1e0074e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,32 +1,32 @@ [versions] -minecraft = "25w45a" -minecraft-unobf = "25w45a_unobfuscated" +minecraft = "1.21.11" +minecraft-unobf = "1.21.11_unobfuscated" minecraft-parchment = "1.21.10" parchment = "2025.10.12" # Xplat -neoform = "1.21.11-pre2-20251124.022710" +neoform = "1.21.11-20251209.172050" mixin = "0.16.5+mixin.0.8.7" mixin-extras = "0.5.0" # Fabric -fabric-loader = "0.18.1" -fabric-api = "0.138.3+1.21.11" -fabric-api-unobf = "0.138.3+1.21.11_unobfuscated" -mod-menu = "16.0.0-rc.1" +fabric-loader = "0.18.4" +fabric-api = "0.139.4+1.21.11" +fabric-api-unobf = "0.139.4+1.21.11_unobfuscated" +mod-menu = "17.0.0-beta.2" # NeoForge -neoforge = "21.10.52-beta" +neoforge = "21.11.37-beta" # Integrations -jei = "26.1.0.16" -rei = "16.0.799" +jei = "27.4.0.15" +rei = "21.11.814" emi = "1.1.22+1.21.1" # Gradle -loom = "1.13+" -loom-unobf = "1.14.0-alpha.20" -moddev = "2.0.120" +loom = "1.14+" +loom-unobf = "1.14+" +moddev = "2.0.140" mod-publish = "1.1.0" [libraries] @@ -42,11 +42,11 @@ fabric-api = { module = "net.fabricmc.fabric-api:fabric-api", version.ref = "fab fabric-api-unobf = { module = "net.fabricmc.fabric-api:fabric-api", version.ref = "fabric-api-unobf" } mod-menu = { module = "com.terraformersmc:modmenu", version.ref = "mod-menu" } -jei-common-api = { module = "mezz.jei:jei-1.21.10-common-api", version.ref = "jei" } -jei-common = { module = "mezz.jei:jei-1.21.10-common", version.ref = "jei" } -jei-lib = { module = "mezz.jei:jei-1.21.10-lib", version.ref = "jei" } -jei-fabric = { module = "mezz.jei:jei-1.21.10-fabric", version.ref = "jei" } -jei-neoforge = { module = "mezz.jei:jei-1.21.10-neoforge", version.ref = "jei" } +jei-common-api = { module = "mezz.jei:jei-1.21.11-common-api", version.ref = "jei" } +jei-common = { module = "mezz.jei:jei-1.21.11-common", version.ref = "jei" } +jei-lib = { module = "mezz.jei:jei-1.21.11-lib", version.ref = "jei" } +jei-fabric = { module = "mezz.jei:jei-1.21.11-fabric", version.ref = "jei" } +jei-neoforge = { module = "mezz.jei:jei-1.21.11-neoforge", version.ref = "jei" } rei-fabric = { module = "me.shedaniel:RoughlyEnoughItems-fabric", version.ref = "rei" } rei-neoforge = { module = "me.shedaniel:RoughlyEnoughItems-neoforge", version.ref = "rei" } @@ -56,7 +56,7 @@ emi-fabric = { module = "dev.emi:emi-fabric", version.ref = "emi" } emi-neoforge = { module = "dev.emi:emi-neoforge", version.ref = "emi" } [plugins] -loom = { id = "fabric-loom", version.ref = "loom" } -loom-unobf = { id = "net.fabricmc.fabric-loom-no-remap", version.ref = "loom-unobf" } +loom = { id = "net.fabricmc.fabric-loom-remap", version.ref = "loom" } +loom-unobf = { id = "net.fabricmc.fabric-loom", version.ref = "loom-unobf" } moddev = { id = "net.neoforged.moddev", version.ref = "moddev" } mod-publish = { id = "me.modmuss50.mod-publish-plugin", version.ref = "mod-publish" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2e11132..23449a2 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.1.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle.kts b/settings.gradle.kts index 4418f05..7542c17 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -26,4 +26,4 @@ rootProject.name = "menderman" include("xplat") include("fabric") include("fabric-unobfuscated") -//include("neoforge") +include("neoforge") diff --git a/xplat/build.gradle.kts b/xplat/build.gradle.kts index fa84548..2364b35 100644 --- a/xplat/build.gradle.kts +++ b/xplat/build.gradle.kts @@ -19,7 +19,7 @@ dependencies { } sourceSets { - create("generated") { + register("generated") { resources { srcDir("src/generated/resources") } @@ -28,10 +28,10 @@ sourceSets { neoForge { neoFormVersion = libs.versions.neoform.get() -// parchment { -// minecraftVersion = libs.versions.minecraft.parchment.get() -// mappingsVersion = libs.versions.parchment.get() -// } + parchment { + minecraftVersion = libs.versions.minecraft.parchment.get() + mappingsVersion = libs.versions.parchment.get() + } addModdingDependenciesTo(sourceSets["test"]) val at = file("src/main/resources/${Properties.MOD_ID}.cfg") diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/gamerule/MendermanGamerulesInternal.java b/xplat/src/main/java/lgbt/greenhouse/menderman/gamerule/MendermanGamerulesInternal.java index 6f6dc6f..ba2b808 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/gamerule/MendermanGamerulesInternal.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/gamerule/MendermanGamerulesInternal.java @@ -8,6 +8,7 @@ import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; +import net.minecraft.world.level.gamerules.GameRule; import net.minecraft.world.level.gamerules.GameRules; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -18,6 +19,10 @@ public class MendermanGamerulesInternal { @NotNull private static final Object2ObjectArrayMap CLIENT_GAMERULE_STORAGE = new Object2ObjectArrayMap<>(); + public static boolean isMendermanGameRule(GameRule gameRule) { + return CLIENT_GAMERULE_STORAGE.containsKey(gameRule.getIdentifier()); + } + public static void init() { CLIENT_GAMERULE_STORAGE.put(MendermanGamerules.COMPOUNDING_REPAIR_COST.key().identifier(), false); CLIENT_GAMERULE_STORAGE.put(MendermanGamerules.RENAMING_CAN_DAMAGE_ANVIL.key().identifier(), false); diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_GameRuleRegistryFix.java b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_GameRuleRegistryFix.java new file mode 100644 index 0000000..e57530d --- /dev/null +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_GameRuleRegistryFix.java @@ -0,0 +1,32 @@ +package lgbt.greenhouse.menderman.mixin; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.mojang.serialization.Dynamic; +import net.minecraft.util.datafix.fixes.GameRuleRegistryFix; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(GameRuleRegistryFix.class) +public class Mixin_GameRuleRegistryFix { + @ModifyReturnValue(method = { "lambda$makeRule$9", "method_76071" }, at = @At("RETURN")) + private static Dynamic menderman$modifyMendermanGamerules(Dynamic original) { + return original + .renameAndFixField( + "mendermanCompoundingRepairCost", + "menderman:compounding_repair_cost", + dynamic -> dynamic.createInt(dynamic.asString("false").equals("true") ? 1 : 0) + ).renameAndFixField( + "mendermanRenamingCanDamageAnvil", + "menderman:renaming_can_damage_anvil", + dynamic -> dynamic.createInt(dynamic.asString("false").equals("true") ? 1 : 0) + ).renameAndFixField( + "mendermanRenamingCostsExperience", + "menderman:renaming_costs_experience", + dynamic -> dynamic.createInt(dynamic.asString("false").equals("true") ? 1 : 0) + ).renameAndFixField( + "mendermanRepairingCostsExperience", + "menderman:repairing_costs_experience", + dynamic -> dynamic.createInt(dynamic.asString("false").equals("true") ? 1 : 0) + ); + } +} diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_MinecraftServer.java b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_MinecraftServer.java new file mode 100644 index 0000000..8fd8186 --- /dev/null +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_MinecraftServer.java @@ -0,0 +1,22 @@ +package lgbt.greenhouse.menderman.mixin; + +import lgbt.greenhouse.menderman.Menderman; +import lgbt.greenhouse.menderman.gamerule.MendermanGamerulesInternal; +import lgbt.greenhouse.menderman.network.UpdateGameruleClientboundPacket; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.gamerules.GameRule; +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; + +@Mixin(MinecraftServer.class) +public class Mixin_MinecraftServer { + @Inject(method = "onGameRuleChanged", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/notifications/NotificationManager;onGameRuleChanged(Lnet/minecraft/world/level/gamerules/GameRule;Ljava/lang/Object;)V", shift = At.Shift.AFTER), cancellable = true) + private void menderman$onGameRuleChanged(GameRule gameRule, T value, CallbackInfo ci) { + if (MendermanGamerulesInternal.isMendermanGameRule(gameRule) && value instanceof Boolean bool) { + Menderman.getHelper().sendPacketsToAllServerPlayers((MinecraftServer)(Object)this, new UpdateGameruleClientboundPacket(gameRule.getIdentifier(), bool)); + ci.cancel(); + } + } +} diff --git a/xplat/src/main/resources/menderman.mixins.json b/xplat/src/main/resources/menderman.mixins.json index 2967494..c810605 100644 --- a/xplat/src/main/resources/menderman.mixins.json +++ b/xplat/src/main/resources/menderman.mixins.json @@ -8,7 +8,9 @@ "Accessor_Item", "Invoker_MappedRegistry", "Mixin_AnvilMenu", - "Mixin_GrindstoneMenu" + "Mixin_GameRuleRegistryFix", + "Mixin_GrindstoneMenu", + "Mixin_MinecraftServer" ], "client": [ "client.Mixin_AnvilScreen",