diff --git a/CHANGELOG.md b/CHANGELOG.md index df5edac..5866773 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,6 @@ ## Changes -- Modified the logic for the durability gained when repairing items. - - Items now repair based on the current damage value rather than the maximum value. - - `current_damage - ceil(max_damage / max_materials) * material_count` -- All Spears now have a repair requirements component. +- Updated to 26.1.x. +- Fixing items to have repair requirements now operates on a parallel stream, which should increase the speed of these operations. ## Bugfixes -- Fixed Menderman game rules not being data fixed to the new 1.21.11 game rule format. -- Fixed game rule value changes not updating the Anvil GUI's information on clients. -- Fixed JEI recipes being misplaced. -- Fixed item combining not being modified within JEI. -- Fixed the ability to repair at a lower result than you started with in situations where a material repairs less than the item to repair's current durability. +- Fixed Anvil renaming being able to damage the anvil when the gamerule is active. diff --git a/build.gradle.kts b/build.gradle.kts index 7994985..1f146c2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,5 @@ plugins { alias(libs.plugins.loom) apply false - alias(libs.plugins.loom.unobf) apply false alias(libs.plugins.moddev) apply false alias(libs.plugins.mod.publish) apply false } diff --git a/buildSrc/src/main/kotlin/conventions.xplat.gradle.kts b/buildSrc/src/main/kotlin/conventions.xplat.gradle.kts index 288b7a5..c95a5ac 100644 --- a/buildSrc/src/main/kotlin/conventions.xplat.gradle.kts +++ b/buildSrc/src/main/kotlin/conventions.xplat.gradle.kts @@ -13,7 +13,7 @@ val libs = the() base.archivesName.set("${Properties.MOD_ID}-${project.name}") group = Properties.GROUP -version = "${Properties.MOD_VERSION}+${Properties.MINECRAFT_VERSION}" +version = "${Properties.MOD_VERSION}+${Properties.FRIENDLY_MINECRAFT_VERSION}" java { toolchain.languageVersion.set(JavaLanguageVersion.of(Properties.JAVA_VERSION)) @@ -32,17 +32,6 @@ repositories { } filter { includeGroupAndSubgroups("org.spongepowered") } } - exclusiveContent { - forRepositories( - maven("https://maven.parchmentmc.org/") { - name = "ParchmentMC" - }, - maven("https://maven.neoforged.net/releases") { - name = "NeoForge" - } - ) - filter { includeGroup("org.parchmentmc.data") } - } maven("https://maven.fabricmc.net/") { name = "Fabric" } @@ -75,15 +64,15 @@ tasks { attributes["Implementation-Title"] = project.name attributes["Implementation-Version"] = archiveVersion attributes["Implementation-Vendor"] = Properties.MOD_AUTHOR - attributes["Built-On-Minecraft"] = libs.versions.minecraft.asProvider().get() + attributes["Built-On-Minecraft"] = libs.versions.minecraft.get() } } val expandProps = mapOf( "mod_version" to Properties.MOD_VERSION, "group" to project.group, //Else we target the task's group. - "minecraft_version" to Properties.MINECRAFT_VERSION, - "fabric_api_version" to libs.versions.fabric.api.asProvider().get(), + "minecraft_version" to Properties.FRIENDLY_MINECRAFT_VERSION, + "fabric_api_version" to libs.versions.fabric.api.get(), "fabric_loader_version" to libs.versions.fabric.loader.get(), "fabric_minecraft_version_range" to Properties.FABRIC_MINECRAFT_RANGE, "fabric_loader_range" to Properties.FABRIC_LOADER_RANGE, diff --git a/buildSrc/src/main/kotlin/lgbt/greenhouse/menderman/gradle/Properties.kt b/buildSrc/src/main/kotlin/lgbt/greenhouse/menderman/gradle/Properties.kt index fbf2b06..cd3ff92 100644 --- a/buildSrc/src/main/kotlin/lgbt/greenhouse/menderman/gradle/Properties.kt +++ b/buildSrc/src/main/kotlin/lgbt/greenhouse/menderman/gradle/Properties.kt @@ -2,8 +2,8 @@ package lgbt.greenhouse.menderman.gradle object Properties { const val MOD_VERSION = "1.1.0" - const val MINECRAFT_VERSION = "1.21.11" - const val JAVA_VERSION = 21 + const val FRIENDLY_MINECRAFT_VERSION = "26.1.x" + const val JAVA_VERSION = 25 const val GROUP = "lgbt.greenhouse.menderman" const val MOD_NAME = "Menderman" @@ -13,14 +13,14 @@ object Properties { const val DESCRIPTION = "Minor repairing reworks for the anvil." const val LICENSE = "MPL-2.0" - val SUPPORTED_MINECRAFT_VERSIONS = listOf("1.21.11") + val SUPPORTED_MINECRAFT_VERSIONS = listOf("26.1", "26.1.1") - const val FABRIC_LOADER_RANGE = ">=0.17" - const val FABRIC_MINECRAFT_RANGE = ">=1.21.11- <=1.21.11" + const val FABRIC_LOADER_RANGE = ">=0.18" + const val FABRIC_MINECRAFT_RANGE = "~26.1" const val NEOFORGE_LOADER_RANGE = "[4,)" - const val NEOFORGE_RANGE = "[21.11-beta,26.1)" - const val NEOFORGE_MINECRAFT_RANGE = "[1.21.11,1.21.12)" + const val NEOFORGE_RANGE = "[26.1.0.0-beta.1,26.2.0.0)" + const val NEOFORGE_MINECRAFT_RANGE = "[26.1,26.2)" const val CURSEFORGE_PAGE = "https://www.curseforge.com/minecraft/mc-mods/menderman" const val CURSEFORGE_PROJECT_ID = "1384572" diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index e489dd0..a2b9178 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -8,22 +8,18 @@ plugins { dependencies { minecraft(libs.minecraft) - mappings(loom.layered { - officialMojangMappings() - parchment(libs.parchment) - }) - modImplementation(libs.fabric.loader) - modImplementation(libs.fabric.api) + implementation(libs.fabric.loader) + implementation(libs.fabric.api) - modLocalRuntime(libs.mod.menu) + localRuntime(libs.mod.menu) - modCompileOnly(libs.jei.fabric) - modCompileOnly(libs.rei.fabric) -// modCompileOnly(libs.emi.fabric) + compileOnly(libs.jei.fabric) + compileOnly(libs.rei.neoforge) +// compileOnly(libs.emi.fabric) // Uncomment to test. CTRL + / will comment the current line. - modLocalRuntime(libs.jei.fabric) + localRuntime(libs.jei.fabric) } gradle.projectsEvaluated { @@ -78,11 +74,11 @@ loom { } publishMods { - file.set(tasks.named("remapJar").get().archiveFile) + file.set(tasks.named("jar").get().archiveFile) modLoaders.add("fabric") changelog = rootProject.file("CHANGELOG.md").readText() - displayName = "v${Properties.MOD_VERSION} (Fabric ${Properties.MINECRAFT_VERSION})" - version = "${Properties.MOD_VERSION}+${Properties.MINECRAFT_VERSION}-fabric" + displayName = "v${Properties.MOD_VERSION} (Fabric ${Properties.FRIENDLY_MINECRAFT_VERSION})" + version = "${Properties.MOD_VERSION}+${Properties.FRIENDLY_MINECRAFT_VERSION}-fabric" type = BETA curseforge { diff --git a/fabric/src/main/java/lgbt/greenhouse/menderman/MendermanFabric.java b/fabric/src/main/java/lgbt/greenhouse/menderman/MendermanFabric.java index c5e3c78..b0f739a 100644 --- a/fabric/src/main/java/lgbt/greenhouse/menderman/MendermanFabric.java +++ b/fabric/src/main/java/lgbt/greenhouse/menderman/MendermanFabric.java @@ -31,7 +31,7 @@ public class MendermanFabric implements ModInitializer { MendermanDefaultComponentsFabric.modifyRepairRequirements(ctx::modify); }); - PayloadTypeRegistry.playS2C().register(SyncGamerulesClientboundPacket.TYPE, SyncGamerulesClientboundPacket.STREAM_CODEC); - PayloadTypeRegistry.playS2C().register(UpdateGameruleClientboundPacket.TYPE, UpdateGameruleClientboundPacket.STREAM_CODEC); + PayloadTypeRegistry.clientboundPlay().register(SyncGamerulesClientboundPacket.TYPE, SyncGamerulesClientboundPacket.STREAM_CODEC); + PayloadTypeRegistry.clientboundPlay().register(UpdateGameruleClientboundPacket.TYPE, UpdateGameruleClientboundPacket.STREAM_CODEC); } } diff --git a/fabric/src/main/java/lgbt/greenhouse/menderman/mixin/fabric/Mixin_AnvilMenu.java b/fabric/src/main/java/lgbt/greenhouse/menderman/mixin/fabric/Mixin_AnvilMenu.java index 712c0e1..de74974 100644 --- a/fabric/src/main/java/lgbt/greenhouse/menderman/mixin/fabric/Mixin_AnvilMenu.java +++ b/fabric/src/main/java/lgbt/greenhouse/menderman/mixin/fabric/Mixin_AnvilMenu.java @@ -14,11 +14,11 @@ public class Mixin_AnvilMenu { @Shadow private int repairItemCountCost; - @ModifyVariable(method = "createResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/DataSlot;set(I)V", ordinal = 5), ordinal = 0) - private int menderman$cancelCostForChecksAfterRenaming(int original, @Local(ordinal = 1) int namingCost, @Share(namespace = "menderman", value = "renameOnly") LocalBooleanRef renameOnlyRef) { + @ModifyVariable(method = "createResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/DataSlot;set(I)V", ordinal = 5), name = "price") + private int menderman$cancelCostForChecksAfterRenaming(int price, @Local(name = "namingCost") int namingCost, @Share(namespace = "menderman", value = "renameOnly") LocalBooleanRef renameOnlyRef) { if (renameOnlyRef.get() || repairItemCountCost > 0) { return renameOnlyRef.get() ? namingCost : repairItemCountCost; } - return original; + return price; } } diff --git a/fabric/src/main/java/lgbt/greenhouse/menderman/mixin/fabric/Mixin_TagLoader.java b/fabric/src/main/java/lgbt/greenhouse/menderman/mixin/fabric/Mixin_TagLoader.java index 8d443bf..79bf57c 100644 --- a/fabric/src/main/java/lgbt/greenhouse/menderman/mixin/fabric/Mixin_TagLoader.java +++ b/fabric/src/main/java/lgbt/greenhouse/menderman/mixin/fabric/Mixin_TagLoader.java @@ -20,10 +20,10 @@ public class Mixin_TagLoader { private String directory; @ModifyVariable(method = "build", at = @At("HEAD"), argsOnly = true) - private Map> enchiridion$buildEnchantmentTags(Map> original) { + private Map> enchiridion$buildEnchantmentTags(Map> builders) { if (this.directory.equals("tags/item")) { - var netheriteToolMaterials = original.get(ItemTags.NETHERITE_TOOL_MATERIALS.location()); - var repairsNetheriteArmor = original.get(ItemTags.REPAIRS_NETHERITE_ARMOR.location()); + var netheriteToolMaterials = builders.get(ItemTags.NETHERITE_TOOL_MATERIALS.location()); + var repairsNetheriteArmor = builders.get(ItemTags.REPAIRS_NETHERITE_ARMOR.location()); netheriteToolMaterials.add(new TagLoader.EntryWithSource(TagEntry.element(Identifier.withDefaultNamespace("netherite_scrap")), "enchiridion")); repairsNetheriteArmor.add(new TagLoader.EntryWithSource(TagEntry.element(Identifier.withDefaultNamespace("netherite_scrap")), "enchiridion")); @@ -31,6 +31,6 @@ public class Mixin_TagLoader { netheriteToolMaterials.removeIf(entry -> entry.source().equals("vanilla") && ((Accessor_TagEntry) entry.entry()).menderman$getId().equals(Identifier.withDefaultNamespace("netherite_ingot"))); repairsNetheriteArmor.removeIf(entry -> entry.source().equals("vanilla") && ((Accessor_TagEntry) entry.entry()).menderman$getId().equals(Identifier.withDefaultNamespace("netherite_ingot"))); } - return original; + return builders; } } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 604dd9e..0e545f3 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -24,10 +24,14 @@ ], "client": [ "lgbt.greenhouse.menderman.client.MendermanClientFabric" + ], + "rei_client": [ + "lgbt.greenhouse.menderman.integration.rei.MendermanReiClientPlugin" ] }, "mixins": [ - "${mod_id}.mixins.json" + "${mod_id}.mixins.json", + "${mod_id}.fabric.mixins.json" ], "depends": { "fabricloader": "${fabric_loader_range}", diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1e0074e..3770a6c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,52 +1,44 @@ [versions] -minecraft = "1.21.11" -minecraft-unobf = "1.21.11_unobfuscated" -minecraft-parchment = "1.21.10" -parchment = "2025.10.12" +minecraft = "26.1.1" # Xplat -neoform = "1.21.11-20251209.172050" -mixin = "0.16.5+mixin.0.8.7" -mixin-extras = "0.5.0" +neoform = "26.1-1" +mixin = "0.17.1+mixin.0.8.7" +mixin-extras = "0.5.3" # Fabric -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" +fabric-loader = "0.19.0" +fabric-api = "0.145.3+26.1.1" +mod-menu = "18.0.0-alpha.8" # NeoForge -neoforge = "21.11.37-beta" +neoforge = "26.1.1.15-beta" # Integrations -jei = "27.4.0.15" +jei = "29.4.0.23" rei = "21.11.814" emi = "1.1.22+1.21.1" # Gradle -loom = "1.14+" -loom-unobf = "1.14+" +loom = "1.16.+" moddev = "2.0.140" mod-publish = "1.1.0" [libraries] minecraft = { module = "com.mojang.minecraft:minecraft", version.ref = "minecraft" } -minecraft-unobf = { module = "com.mojang.minecraft:minecraft", version.ref = "minecraft-unobf" } -parchment = { module = "org.parchmentmc.data:parchment-1.21.10", version.ref = "parchment" } mixin = { module = "net.fabricmc:sponge-mixin", version.ref = "mixin" } mixin-extras = { module = "io.github.llamalad7:mixinextras-common", version.ref = "mixin-extras" } fabric-loader = { module = "net.fabricmc:fabric-loader", version.ref = "fabric-loader" } fabric-api = { module = "net.fabricmc.fabric-api:fabric-api", version.ref = "fabric-api" } -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.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" } +jei-common-api = { module = "mezz.jei:jei-26.1.1-common-api", version.ref = "jei" } +jei-common = { module = "mezz.jei:jei-26.1.1-common", version.ref = "jei" } +jei-lib = { module = "mezz.jei:jei-26.1.1-lib", version.ref = "jei" } +jei-fabric = { module = "mezz.jei:jei-26.1.1-fabric", version.ref = "jei" } +jei-neoforge = { module = "mezz.jei:jei-26.1.1-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 +48,6 @@ emi-fabric = { module = "dev.emi:emi-fabric", version.ref = "emi" } emi-neoforge = { module = "dev.emi:emi-neoforge", version.ref = "emi" } [plugins] -loom = { id = "net.fabricmc.fabric-loom-remap", version.ref = "loom" } -loom-unobf = { id = "net.fabricmc.fabric-loom", version.ref = "loom-unobf" } +loom = { id = "net.fabricmc.fabric-loom", version.ref = "loom" } 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 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/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index e54c12b..61d0f12 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -18,10 +18,6 @@ dependencies { neoForge { version = libs.versions.neoforge.get() -// parchment { -// minecraftVersion = libs.versions.minecraft.parchment.get() -// mappingsVersion = libs.versions.parchment.get() -// } addModdingDependenciesTo(sourceSets["test"]) val at = project(":xplat").file("src/main/resources/${Properties.MOD_ID}.cfg") @@ -58,18 +54,6 @@ neoForge { sourceSet = sourceSets["test"] jvmArguments.set(setOf("-Dmixin.debug.export=true")) } - create("gameTest") { - type = "gameTestServer" - ideName = "NeoForge Game Tests (:${project.name})" - gameDirectory.set(file("build/gametest")) - programArgument("--nogui") - sourceSet = sourceSets["test"] - loadedMods = setOf( - mods.getByName(Properties.MOD_ID), - mods.getByName("${Properties.MOD_ID}_test") - ) - systemProperty("neoforge.enabledGameTestNamespaces", "${Properties.MOD_ID}_test") - } } } @@ -77,8 +61,8 @@ publishMods { file.set(tasks.named("jar").get().archiveFile) modLoaders.add("neoforge") changelog = rootProject.file("CHANGELOG.md").readText() - displayName = "v${Properties.MOD_VERSION} (NeoForge ${Properties.MINECRAFT_VERSION})" - version = "${Properties.MOD_VERSION}+${Properties.MINECRAFT_VERSION}-neoforge" + displayName = "v${Properties.MOD_VERSION} (NeoForge ${Properties.FRIENDLY_MINECRAFT_VERSION})" + version = "${Properties.MOD_VERSION}+${Properties.FRIENDLY_MINECRAFT_VERSION}-neoforge" type = BETA curseforge { diff --git a/neoforge/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponentsNeoForge.java b/neoforge/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponentsNeoForge.java index 5a18d0f..6b7e53e 100644 --- a/neoforge/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponentsNeoForge.java +++ b/neoforge/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponentsNeoForge.java @@ -2,6 +2,7 @@ package lgbt.greenhouse.menderman.item; import lgbt.greenhouse.menderman.api.component.MendermanDataComponents; import lgbt.greenhouse.menderman.api.component.RepairRequirements; +import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponentPatch; import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.Item; @@ -12,14 +13,14 @@ import java.util.function.BiConsumer; import java.util.function.Consumer; public class MendermanDefaultComponentsNeoForge { - public static void modifyItemRepairMaterials(BiConsumer> consumer) { + public static void modifyItemRepairMaterials(BiConsumer> consumer) { for (Map.Entry entry : MendermanDefaultComponents.getDefaultRepairables().entrySet()) { consumer.accept(entry.getKey(), builder -> builder.set(DataComponents.REPAIRABLE, entry.getValue())); } } - public static void modifyRepairRequirements(BiConsumer> consumer) { + public static void modifyRepairRequirements(BiConsumer> consumer) { for (Map.Entry entry : MendermanDefaultComponents.getDefaultRepairRequirements().entrySet()) { consumer.accept(entry.getKey(), builder -> builder.set(MendermanDataComponents.REPAIR_REQUIREMENTS.get(), entry.getValue())); diff --git a/neoforge/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DefaultAnvilCategory.java b/neoforge/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DefaultAnvilCategory.java index 3a483ca..4c40a3b 100644 --- a/neoforge/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DefaultAnvilCategory.java +++ b/neoforge/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DefaultAnvilCategory.java @@ -19,15 +19,15 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; @Mixin(value = DefaultAnvilCategory.class, remap = false) public class Mixin_DefaultAnvilCategory { @ModifyExpressionValue(method = "setupDisplay(Lme/shedaniel/rei/plugin/common/displays/anvil/DefaultAnvilDisplay;Lme/shedaniel/math/Rectangle;)Ljava/util/List;", at = @At(value = "INVOKE", target = "Ljava/util/OptionalInt;isPresent()Z")) - private boolean menderman$dontDisplayRepairCostWhenZero(boolean original, @Local(argsOnly = true) DefaultAnvilDisplay anvilDisplay) { + private boolean menderman$dontDisplayRepairCostWhenZero(boolean original, @Local(argsOnly = true) DefaultAnvilDisplay display) { assert Minecraft.getInstance().level != null; - return original && (MendermanGamerules.doesRepairingCostExperience(Minecraft.getInstance().level) || anvilDisplay.getOutputEntries().isEmpty() || anvilDisplay.getOutputEntries().getFirst().isEmpty() || - !(anvilDisplay.getOutputEntries().getFirst().getFirst().getValue() instanceof ItemStack stack) || !stack.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY).isEmpty()); + return original && (MendermanGamerules.doesRepairingCostExperience(Minecraft.getInstance().level) || display.getOutputEntries().isEmpty() || display.getOutputEntries().getFirst().isEmpty() || + !(display.getOutputEntries().getFirst().getFirst().getValue() instanceof ItemStack stack) || !stack.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY).isEmpty()); } @ModifyArg(method = "lambda$setupDisplay$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/chat/Component;translatable(Ljava/lang/String;[Ljava/lang/Object;)Lnet/minecraft/network/chat/MutableComponent;"), index = 0) - private static String menderman$modifyReiRepairCostMessage(String key, @Local(argsOnly = true) DefaultAnvilDisplay anvilDisplay) { - if (!((anvilDisplay.getInputEntries().getLast().getFirst().getValue() instanceof ItemStack stack) && stack.is(Items.ENCHANTED_BOOK)) && MendermanLangHelper.hasLangEntry("container.menderman.repair.cost", key)) { + private static String menderman$modifyReiRepairCostMessage(String key, @Local(argsOnly = true) DefaultAnvilDisplay display) { + if (!((display.getInputEntries().getLast().getFirst().getValue() instanceof ItemStack stack) && stack.is(Items.ENCHANTED_BOOK)) && MendermanLangHelper.hasLangEntry("container.menderman.repair.cost", key)) { return "container.menderman.repair.cost"; } return key; diff --git a/xplat/build.gradle.kts b/xplat/build.gradle.kts index 2364b35..71948b0 100644 --- a/xplat/build.gradle.kts +++ b/xplat/build.gradle.kts @@ -28,10 +28,6 @@ sourceSets { neoForge { neoFormVersion = libs.versions.neoform.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") @@ -69,15 +65,15 @@ artifacts { publishMods { changelog = rootProject.file("CHANGELOG.md").readText() - displayName = "v${Properties.MOD_VERSION} (Minecraft ${Properties.MINECRAFT_VERSION}" - version = "${Properties.MOD_VERSION}+${Properties.MINECRAFT_VERSION}" + displayName = "v${Properties.MOD_VERSION} (Minecraft ${Properties.FRIENDLY_MINECRAFT_VERSION}" + version = "${Properties.MOD_VERSION}+${Properties.FRIENDLY_MINECRAFT_VERSION}" type = STABLE forgejo { accessToken = providers.environmentVariable("FORGEJO_TOKEN") host(uri(Properties.FORGEJO_URL)) repository = Properties.FORGEJO_REPO - tagName = "${Properties.MOD_VERSION}+${Properties.MINECRAFT_VERSION}" + tagName = "${Properties.MOD_VERSION}+${Properties.FRIENDLY_MINECRAFT_VERSION}" commitish = Properties.FORGEJO_COMMITISH file(project(":fabric")) diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/Menderman.java b/xplat/src/main/java/lgbt/greenhouse/menderman/Menderman.java index 58bf8f0..3d54545 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/Menderman.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/Menderman.java @@ -2,21 +2,26 @@ package lgbt.greenhouse.menderman; import lgbt.greenhouse.menderman.platform.MendermanPlatformHelper; import net.minecraft.resources.Identifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class Menderman { public static final String MOD_ID = "menderman"; - private static MendermanPlatformHelper helper; + public static final String MOD_NAME = "Menderman"; + public static final Logger LOG = LoggerFactory.getLogger(MOD_NAME); - public static boolean shouldDamageAnvil = false; + private static MendermanPlatformHelper platformHelper; + + public static boolean shouldNotDamageAnvil = false; public static Identifier id(String path) { return Identifier.fromNamespaceAndPath(MOD_ID, path); } - public static MendermanPlatformHelper getHelper() { - if (helper == null) { - helper = MendermanPlatformHelper.load(); + public static MendermanPlatformHelper getPlatformHelper() { + if (platformHelper == null) { + platformHelper = MendermanPlatformHelper.load(); } - return helper; + return platformHelper; } } diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/api/MendermanRepairHelper.java b/xplat/src/main/java/lgbt/greenhouse/menderman/api/MendermanRepairHelper.java index 60f35c6..1abb00f 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/api/MendermanRepairHelper.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/api/MendermanRepairHelper.java @@ -34,7 +34,7 @@ public class MendermanRepairHelper { RepairRequirements requirements = stack.get(MendermanDataComponents.REPAIR_REQUIREMENTS.get()); assert requirements != null; return requirements.items().entrySet().stream().map(entry -> { - if (entry.getKey().contains(repairStack.getItemHolder())) { + if (entry.getKey().contains(repairStack.typeHolder())) { return entry.getValue(); } return null; diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/integration/MendermanRecipeViewerHelper.java b/xplat/src/main/java/lgbt/greenhouse/menderman/integration/MendermanRecipeViewerHelper.java index 749d397..4931f9b 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/integration/MendermanRecipeViewerHelper.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/integration/MendermanRecipeViewerHelper.java @@ -1,6 +1,5 @@ package lgbt.greenhouse.menderman.integration; -import lgbt.greenhouse.menderman.api.component.MendermanDataComponents; import lgbt.greenhouse.menderman.platform.MendermanPlatformHelper; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; @@ -14,6 +13,7 @@ import java.util.*; public class MendermanRecipeViewerHelper { private static final Set RECIPE_VIEWERS_WITH_REPAIR_RECIPES = Set.of("emi", "jei", "roughlyenoughitems"); + public static final Set MENDERMAN_REPAIRABLE_ITEMS = new HashSet<>(); public static final Map> EXPECTED_REPAIRABLE_VALUES = new LinkedHashMap<>(); public static boolean hasRecipeViewer() { @@ -21,6 +21,21 @@ public class MendermanRecipeViewerHelper { MendermanPlatformHelper.getInstance().isModLoaded(string)); } + public static void populateExpectedRepairableValues() { + for (Item item : MENDERMAN_REPAIRABLE_ITEMS) { + if (!item.components().has(DataComponents.REPAIRABLE)) + continue; + + EXPECTED_REPAIRABLE_VALUES.put(item, item.components().get(DataComponents.REPAIRABLE).items()); + } + } + + public static void specifyAsMendermanRepairableItem(Item item) { + if (MendermanRecipeViewerHelper.hasRecipeViewer()) { + MendermanRecipeViewerHelper.MENDERMAN_REPAIRABLE_ITEMS.add(item); + } + } + public static List getRepairStacks() { List repairEntries = new ArrayList<>(); for (Item item : BuiltInRegistries.ITEM) { diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponents.java b/xplat/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponents.java index e9b86e3..b655529 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponents.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponents.java @@ -1,11 +1,11 @@ package lgbt.greenhouse.menderman.item; +import lgbt.greenhouse.menderman.Menderman; import lgbt.greenhouse.menderman.MendermanCompatibilityKeys; import lgbt.greenhouse.menderman.MendermanTags; import lgbt.greenhouse.menderman.api.component.RepairRequirements; import lgbt.greenhouse.menderman.api.component.MendermanDataComponents; import lgbt.greenhouse.menderman.integration.MendermanRecipeViewerHelper; -import lgbt.greenhouse.menderman.mixin.Accessor_Item; import lgbt.greenhouse.menderman.mixin.Invoker_MappedRegistry; import net.minecraft.core.HolderSet; import net.minecraft.core.component.DataComponentMap; @@ -19,14 +19,15 @@ import net.minecraft.util.context.ContextMap; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.item.crafting.*; import net.minecraft.world.item.crafting.display.RecipeDisplay; import net.minecraft.world.item.crafting.display.ShapelessCraftingRecipeDisplay; import net.minecraft.world.item.crafting.display.SlotDisplayContext; import net.minecraft.world.item.crafting.display.SmithingRecipeDisplay; import net.minecraft.world.item.enchantment.Repairable; +import org.apache.commons.lang3.mutable.MutableBoolean; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; public class MendermanDefaultComponents { @@ -64,9 +65,7 @@ public class MendermanDefaultComponents { private static void modifyRepairable(Map map, Item item, HolderSet repairItems) { map.put(item, new Repairable(repairItems)); - if (MendermanRecipeViewerHelper.hasRecipeViewer()) { - MendermanRecipeViewerHelper.EXPECTED_REPAIRABLE_VALUES.put(item, repairItems); - } + MendermanRecipeViewerHelper.specifyAsMendermanRepairableItem(item); } public static Map getDefaultRepairRequirements() { Map map = new LinkedHashMap<>(); @@ -139,8 +138,8 @@ public class MendermanDefaultComponents { map.put(Items.SHIELD, new RepairRequirements( Map.of(getItemTag(ItemTags.IRON_TOOL_MATERIALS), 1), - Optional.of(2)) - ); + Optional.of(2) + )); constantRepairRequirement(map, Items.BOW, 2); constantRepairRequirement(map, Items.CROSSBOW, 2); @@ -155,8 +154,8 @@ public class MendermanDefaultComponents { map.put(Items.ELYTRA, new RepairRequirements( Map.of(HolderSet.direct(Items.PHANTOM_MEMBRANE.builtInRegistryHolder()), 1), - Optional.of(3)) - ); + Optional.of(3) + )); constantRepairRequirement(map, Items.TURTLE_HELMET, 1); constantRepairRequirement(map, Items.WOLF_ARMOR, 2); @@ -180,34 +179,33 @@ public class MendermanDefaultComponents { private static void constantRepairRequirement(Map map, Item item, int count) { map.put(item, new RepairRequirements(count)); - if (MendermanRecipeViewerHelper.hasRecipeViewer()) { - MendermanRecipeViewerHelper.EXPECTED_REPAIRABLE_VALUES.put(item, item.getDefaultInstance() - .getComponents() - .getOrDefault(DataComponents.REPAIRABLE, new Repairable(HolderSet.empty())) - .items() - ); - } + MendermanRecipeViewerHelper.specifyAsMendermanRepairableItem(item); } public static void createFallbackRepairRequirements(ServerLevel serverLevel) { - for (Item item : BuiltInRegistries.ITEM) { + MutableBoolean fixedItems = new MutableBoolean(false); + + long startMs = System.currentTimeMillis(); + BuiltInRegistries.ITEM.stream().parallel().forEach(item -> { + ItemStack defaultInstance = item.getDefaultInstance(); if (!item.components().has(DataComponents.REPAIRABLE) || item.components().has(MendermanDataComponents.REPAIR_REQUIREMENTS.get())) - continue; + return; if ( defaultInstance.is(ItemTags.SWORDS) || - defaultInstance.is(ItemTags.PICKAXES) || - defaultInstance.is(ItemTags.AXES) || - defaultInstance.is(ItemTags.SHOVELS) || - defaultInstance.is(ItemTags.HOES) || - defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.BRUSH_TOOLS) || - defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.IGNITER_TOOLS) || - defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.SHEAR_TOOLS) || - defaultInstance.is(MendermanCompatibilityKeys.FarmersDelight.KNIVES_TOOLS) + defaultInstance.is(ItemTags.PICKAXES) || + defaultInstance.is(ItemTags.AXES) || + defaultInstance.is(ItemTags.SHOVELS) || + defaultInstance.is(ItemTags.HOES) || + defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.BRUSH_TOOLS) || + defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.IGNITER_TOOLS) || + defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.SHEAR_TOOLS) || + defaultInstance.is(MendermanCompatibilityKeys.FarmersDelight.KNIVES_TOOLS) ) { fallbackRepairRequirement(item, 1); + fixedItems.setTrue(); } else if ( defaultInstance.is(ItemTags.HEAD_ARMOR) || defaultInstance.is(ItemTags.FOOT_ARMOR) || @@ -219,11 +217,13 @@ public class MendermanDefaultComponents { defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.MACE_TOOLS) ) { fallbackRepairRequirement(item, 2); + fixedItems.setTrue(); } else if ( defaultInstance.is(ItemTags.CHEST_ARMOR) || - defaultInstance.is(ItemTags.LEG_ARMOR) + defaultInstance.is(ItemTags.LEG_ARMOR) ) { fallbackRepairRequirement(item, 3); + fixedItems.setTrue(); } else { ContextMap contextMap = SlotDisplayContext.fromLevel(serverLevel); OptionalInt value = serverLevel.recipeAccess().getRecipes().stream().mapToInt(recipeHolder -> { @@ -253,7 +253,14 @@ public class MendermanDefaultComponents { return -1; }).filter(value1 -> value1 > 0).max(); value.ifPresent(fullRepairRequirements -> fallbackRepairRequirement(item, fullRepairRequirements)); + if (value.isPresent()) { + fixedItems.setTrue(); + } } + }); + long endMs = System.currentTimeMillis(); + if (fixedItems.get()) { + Menderman.LOG.info("[Menderman] Fixing item components took {}ms", endMs - startMs); } } @@ -273,6 +280,7 @@ public class MendermanDefaultComponents { DataComponentMap.Builder components = DataComponentMap.builder(); components.addAll(item.components()); consumer.accept(components); - ((Accessor_Item)item).menderman$setComponents(components.build()); + //noinspection deprecation + item.builtInRegistryHolder().bindComponents(components.build()); } } diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Accessor_Item.java b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Accessor_Item.java deleted file mode 100644 index 14930b7..0000000 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Accessor_Item.java +++ /dev/null @@ -1,12 +0,0 @@ -package lgbt.greenhouse.menderman.mixin; - -import net.minecraft.core.component.DataComponentMap; -import net.minecraft.world.item.Item; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(Item.class) -public interface Accessor_Item { - @Accessor("components") - void menderman$setComponents(DataComponentMap components); -} diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_AnvilMenu.java b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_AnvilMenu.java index d65ca78..199323a 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_AnvilMenu.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_AnvilMenu.java @@ -45,32 +45,32 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { return original; } - @ModifyVariable(method = { "createResult", "createResultInternal" }, at = @At(value = "INVOKE", target = "Ljava/lang/Math;min(II)I"), ordinal = 0) - private int menderman$modifyRepairExperienceCost(int original, @Local(ordinal = 0) ItemStack stack, @Local(ordinal = 2) ItemStack repairStack) { + @ModifyVariable(method = {"createResult", "createResultInternal"}, at = @At(value = "INVOKE", target = "Ljava/lang/Math;min(II)I"), name = "price") + private int menderman$modifyRepairExperienceCost(int price, @Local(ordinal = 0) ItemStack input, @Local(ordinal = 2) ItemStack addition) { if (!MendermanGamerules.doesRepairingCostExperience(player.level())) { return 0; } - return MendermanRepairHelper.getRepairItemCount(stack, repairStack); + return MendermanRepairHelper.getRepairItemCount(input, addition); } @Inject(method = { "createResult", "createResultInternal" }, at = @At(value = "FIELD", target = "Lnet/minecraft/world/inventory/AnvilMenu;repairItemCountCost:I", ordinal = 1, shift = At.Shift.AFTER, opcode = Opcodes.PUTFIELD)) - private void menderman$modifyRepairMaterialCost(CallbackInfo ci, @Local(ordinal = 0) ItemStack stack, @Local(ordinal = 1) ItemStack repairedStack, @Local(ordinal = 2) ItemStack repairStack) { - OptionalInt repairRequirementAmount = MendermanRepairHelper.getRepairRequirementsRepairAmount(stack, repairStack); + private void menderman$modifyRepairMaterialCost(CallbackInfo ci, @Local(name = "input") ItemStack input, @Local(name = "result") ItemStack result, @Local(name = "addition") ItemStack addition) { + OptionalInt repairRequirementAmount = MendermanRepairHelper.getRepairRequirementsRepairAmount(input, addition); if (repairRequirementAmount.isPresent()) { - repairedStack.setDamageValue(stack.getDamageValue() - repairRequirementAmount.getAsInt()); + result.setDamageValue(input.getDamageValue() - repairRequirementAmount.getAsInt()); } - repairItemCountCost = Math.min(repairItemCountCost, MendermanRepairHelper.getRepairItemCount(stack, repairStack)); + repairItemCountCost = Math.min(repairItemCountCost, MendermanRepairHelper.getRepairItemCount(input, addition)); } - @ModifyVariable(method = { "createResult", "createResultInternal" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;getDamageValue()I", ordinal = 5), ordinal = 6) - private int menderman$modifyItemCombiningRepairValue(int original, @Local(ordinal = 0) ItemStack input, @Local(ordinal = 2) ItemStack otherInput) { + @ModifyVariable(method = { "createResult", "createResultInternal" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;getDamageValue()I", ordinal = 5), name = "resultDamage") + private int menderman$modifyItemCombiningRepairValue(int resultDamage, @Local(name = "input") ItemStack input, @Local(name = "addition") ItemStack otherInput) { if (input.has(MendermanDataComponents.REPAIR_REQUIREMENTS.get())) { return MendermanRepairHelper.getRepairRequirementsCombineAmount( input, otherInput ); } - return original; + return resultDamage; } @ModifyExpressionValue(method = { "createResult", "createResultInternal" }, at = @At(value = "INVOKE", target = "Ljava/lang/Integer;intValue()I")) @@ -81,66 +81,67 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { return original; } - @ModifyVariable(method = { "createResult", "createResultInternal" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;set(Lnet/minecraft/core/component/DataComponentType;Ljava/lang/Object;)Ljava/lang/Object;", ordinal = 1), ordinal = 2) - private int menderman$cancelIncreasedRepairCostBeforeRepairCost(int original) { + @ModifyVariable(method = { "createResult", "createResultInternal" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;set(Lnet/minecraft/core/component/DataComponentType;Ljava/lang/Object;)Ljava/lang/Object;", ordinal = 1), name = "finalPrice") + private int menderman$cancelIncreasedRepairCostBeforeRepairCost(int finalPrice) { if (!MendermanGamerules.compoundingRepairCost(player.level())) { return 0; } - return original; + return finalPrice; } + @SuppressWarnings("WrapWithConditionTargetsNonVoid") @WrapWithCondition(method = { "createResult", "createResultInternal" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;set(Lnet/minecraft/core/component/DataComponentType;Ljava/lang/Object;)Ljava/lang/Object;", ordinal = 1)) - private boolean menderman$cancelSettingItemRepairCost(ItemStack instance, DataComponentType componentType, Object value) { + private boolean menderman$cancelSettingItemRepairCost(ItemStack instance, DataComponentType type, Object value) { return MendermanGamerules.compoundingRepairCost(player.level()); } - @ModifyVariable(method = { "createResult", "createResultInternal" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;setDamageValue(I)V"), ordinal = 0) - private int menderman$decreaseCombiningCost(int original, @Local(ordinal = 0) ItemStack stack) { + @ModifyVariable(method = {"createResult", "createResultInternal"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;setDamageValue(I)V"), name = "price") + private int menderman$decreaseCombiningCost(int price, @Local(name = "input") ItemStack input) { if (!MendermanGamerules.doesRepairingCostExperience(player.level())) { - return original - 2; + return price - 2; } - if (stack.has(MendermanDataComponents.REPAIR_REQUIREMENTS.get())) { - return original - 1; + if (input.has(MendermanDataComponents.REPAIR_REQUIREMENTS.get())) { + return price - 1; } - return original; + return price; } - @ModifyVariable(method = { "createResult", "createResultInternal" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;set(Lnet/minecraft/core/component/DataComponentType;Ljava/lang/Object;)Ljava/lang/Object;", ordinal = 0), ordinal = 0) - private int menderman$cancelRenamingCost(int original, @Local(ordinal = 1) int namingCost, @Share(namespace = "menderman", value = "renameOnly") LocalBooleanRef renameOnlyRef) { + @ModifyVariable(method = {"createResult", "createResultInternal"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;set(Lnet/minecraft/core/component/DataComponentType;Ljava/lang/Object;)Ljava/lang/Object;", ordinal = 0), name = "price") + private int menderman$cancelRenamingCost(int price, @Local(name = "namingCost") int namingCost, @Share(namespace = "menderman", value = "renameOnly") LocalBooleanRef renameOnlyRef) { if (!MendermanGamerules.doesRenameCostExperience(player.level())) { - renameOnlyRef.set(original == namingCost); - return original - 1; + renameOnlyRef.set(price == namingCost); + return price - 1; } - return original; + return price; } - @ModifyVariable(method = { "createResult", "createResultInternal" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;remove(Lnet/minecraft/core/component/DataComponentType;)Ljava/lang/Object;"), ordinal = 0) - private int menderman$cancelNameRemovalCost(int original, @Local(ordinal = 1) int namingCost, @Share(namespace = "menderman", value = "renameOnly") LocalBooleanRef renameOnlyRef) { + @ModifyVariable(method = {"createResult", "createResultInternal"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;remove(Lnet/minecraft/core/component/DataComponentType;)Ljava/lang/Object;"), name = "price") + private int menderman$cancelNameRemovalCost(int price, @Local(name = "namingCost") int namingCost, @Share(namespace = "menderman", value = "renameOnly") LocalBooleanRef renameOnlyRef) { if (!MendermanGamerules.doesRenameCostExperience(player.level())) { - renameOnlyRef.set(original == namingCost); - return original - 1; + renameOnlyRef.set(price == namingCost); + return price - 1; } - return original; + return price; } @ModifyExpressionValue(method = { "createResult", "createResultInternal" }, at = @At(value = "FIELD", target = "Lnet/minecraft/world/item/ItemStack;EMPTY:Lnet/minecraft/world/item/ItemStack;", ordinal = 4, opcode = Opcodes.GETSTATIC)) - private ItemStack menderman$dontSetAnvilResultToEmpty(ItemStack original, @Local(ordinal = 0) ItemStack stack, @Local(ordinal = 1) ItemStack otherStack, @Local(ordinal = 0) int cost) { - if (cost == 0 && !ItemStack.isSameItemSameComponents(stack, otherStack)) { - return otherStack; + private ItemStack menderman$dontSetAnvilResultToEmpty(ItemStack original, @Local(name = "input") ItemStack input, @Local(name = "result") ItemStack result, @Local(name = "price") int price) { + if (price == 0 && !ItemStack.isSameItemSameComponents(input, result)) { + return result; } return original; } @Inject(method = "onTake", at = @At("HEAD")) private void menderman$captureRenamingState(Player player, ItemStack stack, CallbackInfo ci) { - Menderman.shouldDamageAnvil = MendermanGamerules.canRenamingDamageAnvil(player.level()) && + Menderman.shouldNotDamageAnvil = !MendermanGamerules.canRenamingDamageAnvil(player.level()) && onlyRenaming && repairItemCountCost == 0; } - @ModifyExpressionValue(method = { "method_24922", "lambda$onTake$2" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;hasInfiniteMaterials()Z")) + @ModifyExpressionValue(method = {"lambda$onTake$0"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;hasInfiniteMaterials()Z")) private static boolean menderman$dontDamageAnvil(boolean original) { - if (Menderman.shouldDamageAnvil) { - Menderman.shouldDamageAnvil = false; + if (Menderman.shouldNotDamageAnvil) { + Menderman.shouldNotDamageAnvil = false; return true; } return original; 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 index e57530d..fe7d699 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_GameRuleRegistryFix.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_GameRuleRegistryFix.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(GameRuleRegistryFix.class) public class Mixin_GameRuleRegistryFix { - @ModifyReturnValue(method = { "lambda$makeRule$9", "method_76071" }, at = @At("RETURN")) + @ModifyReturnValue(method = "lambda$makeRule$9", at = @At("RETURN")) private static Dynamic menderman$modifyMendermanGamerules(Dynamic original) { return original .renameAndFixField( diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_GrindstoneMenu.java b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_GrindstoneMenu.java index 0da0161..97bb140 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_GrindstoneMenu.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_GrindstoneMenu.java @@ -30,7 +30,7 @@ public abstract class Mixin_GrindstoneMenu extends AbstractContainerMenu { } @WrapWithCondition(method = "removeNonCursesFrom", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;set(Lnet/minecraft/core/component/DataComponentType;Ljava/lang/Object;)Ljava/lang/Object;")) - private boolean menderman$disableIncreasedGrindstoneCost(ItemStack instance, DataComponentType component, T value) { + private boolean menderman$disableIncreasedGrindstoneCost(ItemStack instance, DataComponentType type, T value) { return !access.evaluate((level, pos) -> MendermanGamerules.compoundingRepairCost(level) ).orElse(true); @@ -39,13 +39,12 @@ public abstract class Mixin_GrindstoneMenu extends AbstractContainerMenu { @ModifyArg(method = "mergeItems", at = @At(value = "INVOKE", target = "Ljava/lang/Math;max(II)I", ordinal = 1), index = 0) private int menderman$cancelIncreasedRepairCostStarting(int original, - @Local(argsOnly = true, ordinal = 0) ItemStack input, - @Local(argsOnly = true, ordinal = 1) ItemStack otherInput, - @Local(ordinal = 0) int maxDamage) { - ItemStack referenceItem = input.has(MendermanDataComponents.REPAIR_REQUIREMENTS.get()) ? input : otherInput; + @Local(name = "input") ItemStack input, + @Local(name = "additional") ItemStack additional) { + ItemStack referenceItem = input.has(MendermanDataComponents.REPAIR_REQUIREMENTS.get()) ? input : additional; RepairRequirements requirements = referenceItem.get(MendermanDataComponents.REPAIR_REQUIREMENTS.get()); if (requirements != null) { - return MendermanRepairHelper.getRepairRequirementsCombineAmount(referenceItem, input == referenceItem ? otherInput : input); + return MendermanRepairHelper.getRepairRequirementsCombineAmount(referenceItem, input == referenceItem ? additional : input); } return original; } 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 index 8fd8186..8b6029e 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_MinecraftServer.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Mixin_MinecraftServer.java @@ -13,9 +13,9 @@ 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)); + private void menderman$onGameRuleChanged(GameRule rule, T value, CallbackInfo ci) { + if (MendermanGamerulesInternal.isMendermanGameRule(rule) && value instanceof Boolean bool) { + Menderman.getPlatformHelper().sendPacketsToAllServerPlayers((MinecraftServer)(Object)this, new UpdateGameruleClientboundPacket(rule.getIdentifier(), bool)); ci.cancel(); } } diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/client/Mixin_AnvilScreen.java b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/client/Mixin_AnvilScreen.java index 76e1ce9..27def1c 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/client/Mixin_AnvilScreen.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/client/Mixin_AnvilScreen.java @@ -18,7 +18,7 @@ public abstract class Mixin_AnvilScreen extends ItemCombinerScreen { super(menu, playerInventory, title, menuResource); } - @ModifyArg(method = "renderLabels", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/chat/Component;translatable(Ljava/lang/String;[Ljava/lang/Object;)Lnet/minecraft/network/chat/MutableComponent;"), index = 0) + @ModifyArg(method = "extractLabels", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/chat/Component;translatable(Ljava/lang/String;[Ljava/lang/Object;)Lnet/minecraft/network/chat/MutableComponent;"), index = 0) private String menderman$modifyLabelText(String original) { if (menu.getSlot(1).hasItem()) { if (EnchantmentHelper.getEnchantmentsForCrafting(menu.getSlot(1).getItem()).isEmpty() && MendermanLangHelper.hasLangEntry("container.menderman.repair.cost", original)) { diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/jei/Mixin_AnvilRecipeCategory.java b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/jei/Mixin_AnvilRecipeCategory.java index 3a40979..4a2dee0 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/jei/Mixin_AnvilRecipeCategory.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/jei/Mixin_AnvilRecipeCategory.java @@ -1,5 +1,7 @@ package lgbt.greenhouse.menderman.mixin.integration.jei; +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; import com.llamalad7.mixinextras.sugar.Local; import lgbt.greenhouse.menderman.api.gamerule.MendermanGamerules; import lgbt.greenhouse.menderman.client.MendermanLangHelper; @@ -37,17 +39,19 @@ public class Mixin_AnvilRecipeCategory { return original; } - @ModifyVariable(method = "createRecipeExtras(Lmezz/jei/api/gui/widgets/IRecipeExtrasBuilder;Lmezz/jei/api/recipe/vanilla/IJeiAnvilRecipe;Lmezz/jei/api/recipe/IFocusGroup;)V", at = @At(value = "INVOKE_ASSIGN", target = "Lmezz/jei/library/plugins/vanilla/anvil/AnvilRecipeCategory;getCost(Lmezz/jei/api/gui/ingredient/IRecipeSlotDrawablesView;)Ljava/lang/Integer;")) - private Integer menderman$disableMessageWithZeroLevels(Integer original) { + @Definition(id = "getCost", method = "Lmezz/jei/library/plugins/vanilla/anvil/AnvilRecipeCategory;getCost(Lmezz/jei/api/gui/ingredient/IRecipeSlotDrawablesView;)Ljava/lang/Integer;") + @Expression("? = ?.getCost(?)") + @ModifyVariable(method = "createRecipeExtras(Lmezz/jei/api/gui/widgets/IRecipeExtrasBuilder;Lmezz/jei/api/recipe/vanilla/IJeiAnvilRecipe;Lmezz/jei/api/recipe/IFocusGroup;)V", at = @At(value = "MIXINEXTRAS:EXPRESSION", shift = At.Shift.AFTER), name = "cost") + private Integer menderman$disableMessageWithZeroLevels(Integer cost) { if (Minecraft.getInstance().level != null && !MendermanGamerules.doesRepairingCostExperience(Minecraft.getInstance().level)) { return null; } - return original; + return cost; } @ModifyArg(method = "createRecipeExtras(Lmezz/jei/api/gui/widgets/IRecipeExtrasBuilder;Lmezz/jei/api/recipe/vanilla/IJeiAnvilRecipe;Lmezz/jei/api/recipe/IFocusGroup;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/chat/Component;translatable(Ljava/lang/String;[Ljava/lang/Object;)Lnet/minecraft/network/chat/MutableComponent;"), index = 0) - private String menderman$modifyJeiRepairMessage(String original, @Local(argsOnly = true) IJeiAnvilRecipe anvilRecipe) { - if (anvilRecipe.getUid() != null && anvilRecipe.getUid().getPath().contains("repair") && MendermanLangHelper.hasLangEntry("container.menderman.repair.cost", original)) { + private String menderman$modifyJeiRepairMessage(String original, @Local(argsOnly = true) IJeiAnvilRecipe recipe) { + if (recipe.getUid() != null && recipe.getUid().getPath().contains("repair") && MendermanLangHelper.hasLangEntry("container.menderman.repair.cost", original)) { return "container.menderman.repair.cost"; } return original; diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/platform/MendermanPlatformHelper.java b/xplat/src/main/java/lgbt/greenhouse/menderman/platform/MendermanPlatformHelper.java index 682bdf7..e2e449d 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/platform/MendermanPlatformHelper.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/platform/MendermanPlatformHelper.java @@ -10,7 +10,7 @@ import java.util.ServiceLoader; public interface MendermanPlatformHelper extends ServiceLoader.Provider { static MendermanPlatformHelper getInstance() { - return Menderman.getHelper(); + return Menderman.getPlatformHelper(); } boolean isModLoaded(String modId); diff --git a/xplat/src/main/resources/menderman.mixins.json b/xplat/src/main/resources/menderman.mixins.json index 15ba1ac..6d93e83 100644 --- a/xplat/src/main/resources/menderman.mixins.json +++ b/xplat/src/main/resources/menderman.mixins.json @@ -5,7 +5,6 @@ "plugin": "lgbt.greenhouse.menderman.MendermanMixinConfigPlugin", "compatibilityLevel": "JAVA_21", "mixins": [ - "Accessor_Item", "Invoker_MappedRegistry", "Mixin_AnvilMenu", "Mixin_GameRuleRegistryFix", @@ -13,9 +12,7 @@ "Mixin_MinecraftServer", "integration.jei.Mixin_AnvilRecipeCategory", "integration.jei.Mixin_AnvilRecipeMaker", - "integration.jei.Mixin_IRecipeCategory", - "integration.roughlyenoughitems.Mixin_DefaultAnvilCategory", - "integration.roughlyenoughitems.Mixin_DisplaysHolderImpl" + "integration.jei.Mixin_IRecipeCategory" ], "client": [ "client.Mixin_AnvilScreen",