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 e954ee2..6ea6c66 100644 --- a/buildSrc/src/main/kotlin/lgbt/greenhouse/menderman/gradle/Properties.kt +++ b/buildSrc/src/main/kotlin/lgbt/greenhouse/menderman/gradle/Properties.kt @@ -12,13 +12,13 @@ object Properties { const val DESCRIPTION = "Minor repairing reworks for the anvil." const val LICENSE = "MPL-2.0" - val SUPPORTED_MINECRAFT_VERSIONS = listOf("1.21", "1.21.1") + val SUPPORTED_MINECRAFT_VERSIONS = listOf("1.21.9", "1.21.10") const val FABRIC_LOADER_RANGE = ">=0.16" - const val FABRIC_MINECRAFT_RANGE = ">=1.21 <=1.21.1" + const val FABRIC_MINECRAFT_RANGE = ">=1.21.9 <=1.21.10" const val NEOFORGE_LOADER_RANGE = "[4,)" - const val NEOFORGE_MINECRAFT_RANGE = "[1.21,1.21.1)" + const val NEOFORGE_MINECRAFT_RANGE = "[1.21.9,1.21.11)" 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 03509af..f8ee4c2 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -22,9 +22,7 @@ dependencies { modCompileOnly(libs.emi.fabric) // Uncomment to test. CTRL + / will comment the current line. -// modLocalRuntime(libs.jei.fabric) -// modLocalRuntime(libs.rei.fabric) -// modLocalRuntime(libs.emi.fabric) + modLocalRuntime(libs.jei.fabric) } fabricApi { diff --git a/fabric/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java b/fabric/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java index dab3a51..d66a2b0 100644 --- a/fabric/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java +++ b/fabric/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java @@ -14,6 +14,7 @@ import me.shedaniel.rei.api.common.util.EntryIngredients; import me.shedaniel.rei.plugin.client.BuiltinClientPlugin; import me.shedaniel.rei.plugin.common.BuiltinPlugin; import me.shedaniel.rei.plugin.common.displays.anvil.DefaultAnvilDisplay; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; @@ -53,7 +54,7 @@ public class MendermanReiClientPlugin implements REIClientPlugin { if ( ItemStack.isSameItemSameComponents(inputWithoutDamage, outputWithoutDamage) && MendermanRecipeViewerHelper.getRepairStacks().stream().anyMatch(entry -> entry.repairable().is(inputStack.getItem())) || - inputStack.has(MendermanDataComponents.REPAIRABLE.get()) && !(otherInputEntryStack.getValue() instanceof ItemStack stack && stack.is(Items.ENCHANTED_BOOK)) + inputStack.has(DataComponents.REPAIRABLE) && !(otherInputEntryStack.getValue() instanceof ItemStack stack && stack.is(Items.ENCHANTED_BOOK)) ) { return EventResult.interruptFalse(); } @@ -117,7 +118,7 @@ public class MendermanReiClientPlugin implements REIClientPlugin { Display display = list.get(i); if (display.getDisplayLocation().isEmpty() || !(display instanceof DefaultAnvilDisplay defaultAnvilDisplay) || - !(defaultAnvilDisplay.getInputEntries().getFirst().getFirst().getValue() instanceof ItemStack stack) || !stack.has(MendermanDataComponents.REPAIRABLE.get()) || + !(defaultAnvilDisplay.getInputEntries().getFirst().getFirst().getValue() instanceof ItemStack stack) || !stack.has(DataComponents.REPAIRABLE) || !(defaultAnvilDisplay.getInputEntries().getLast().getFirst().getValue() instanceof ItemStack otherStack) || otherStack.is(Items.ENCHANTED_BOOK)) continue; diff --git a/fabric/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponentsFabric.java b/fabric/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponentsFabric.java index 30c4863..443a934 100644 --- a/fabric/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponentsFabric.java +++ b/fabric/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponentsFabric.java @@ -2,9 +2,10 @@ package lgbt.greenhouse.menderman.item; import lgbt.greenhouse.menderman.api.component.MendermanDataComponents; import lgbt.greenhouse.menderman.api.component.RepairRequirements; -import lgbt.greenhouse.menderman.api.component.Repairable; import net.minecraft.core.component.DataComponentMap; +import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.Item; +import net.minecraft.world.item.enchantment.Repairable; import java.util.Map; import java.util.function.BiConsumer; @@ -14,7 +15,7 @@ public class MendermanDefaultComponentsFabric { public static void modifyItemRepairMaterials(BiConsumer> consumer) { for (Map.Entry entry : MendermanDefaultComponents.getDefaultRepairables().entrySet()) { consumer.accept(entry.getKey(), - builder -> builder.set(MendermanDataComponents.REPAIRABLE.get(), entry.getValue())); + builder -> builder.set(DataComponents.REPAIRABLE, entry.getValue())); } } 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 a6197a4..c574052 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,12 +14,4 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; @Mixin(AnvilMenu.class) public class Mixin_AnvilMenu { - @ModifyExpressionValue(method = "method_24922", 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; - return true; - } - return original; - } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 450f6b6..5a047f3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,23 +1,23 @@ [versions] -minecraft = "1.21.1" -minecraft-parchment = "1.21.1" -parchment = "2024.11.17" +minecraft = "1.21.10" +minecraft-parchment = "1.21.9" +parchment = "2025.10.05" # Xplat -neoform = "1.21.1-20240808.144430" +neoform = "1.21.10-20251010.172816" mixin = "0.15.5+mixin.0.8.7" -mixin-extras = "0.4.1" +mixin-extras = "0.5.0" # Fabric -fabric-loader = "0.16.14" -fabric-api = "0.116.7+1.21.1" -mod-menu = "11.0.3" +fabric-loader = "0.17.3" +fabric-api = "0.138.3+1.21.10" +mod-menu = "16.0.0-rc.1" # NeoForge -neoforge = "21.1.215" +neoforge = "21.10.51-beta" # Integrations -jei = "19.25.0.325" +jei = "26.1.0.16" rei = "16.0.799" emi = "1.1.22+1.21.1" @@ -28,7 +28,7 @@ mod-publish = "1.1.0" [libraries] minecraft = { module = "com.mojang.:minecraft", version.ref = "minecraft" } -parchment = { module = "org.parchmentmc.data:parchment-1.21.1", version.ref = "parchment" } +parchment = { module = "org.parchmentmc.data:parchment-1.21.9", version.ref = "parchment" } mixin = { module = "net.fabricmc:sponge-mixin", version.ref = "mixin" } mixin-extras = { module = "io.github.llamalad7:mixinextras-common", version.ref = "mixin-extras" } @@ -37,11 +37,11 @@ fabric-loader = { module = "net.fabricmc:fabric-loader", version.ref = "fabric-l fabric-api = { module = "net.fabricmc.fabric-api:fabric-api", version.ref = "fabric-api" } mod-menu = { module = "com.terraformersmc:modmenu", version.ref = "mod-menu" } -jei-common-api = { module = "mezz.jei:jei-1.21.1-common-api", version.ref = "jei" } -jei-common = { module = "mezz.jei:jei-1.21.1-common", version.ref = "jei" } -jei-lib = { module = "mezz.jei:jei-1.21.1-lib", version.ref = "jei" } -jei-fabric = { module = "mezz.jei:jei-1.21.1-fabric", version.ref = "jei" } -jei-neoforge = { module = "mezz.jei:jei-1.21.1-neoforge", version.ref = "jei" } +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" } rei-fabric = { module = "me.shedaniel:RoughlyEnoughItems-fabric", version.ref = "rei" } rei-neoforge = { module = "me.shedaniel:RoughlyEnoughItems-neoforge", version.ref = "rei" } diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index e8b65b0..34f231e 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -13,9 +13,7 @@ dependencies { compileOnly(libs.emi.neoforge) // Uncomment to test. CTRL + / will comment the current line. -// runtimeOnly(libs.jei.neoforge) -// runtimeOnly(libs.rei.neoforge) -// runtimeOnly(libs.emi.neoforge) + runtimeOnly(libs.jei.neoforge) } neoForge { diff --git a/neoforge/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java b/neoforge/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java index 9fa1775..9f031ea 100644 --- a/neoforge/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java +++ b/neoforge/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java @@ -15,6 +15,7 @@ import me.shedaniel.rei.forge.REIPluginClient; import me.shedaniel.rei.plugin.client.BuiltinClientPlugin; import me.shedaniel.rei.plugin.common.BuiltinPlugin; import me.shedaniel.rei.plugin.common.displays.anvil.DefaultAnvilDisplay; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; @@ -55,7 +56,7 @@ public class MendermanReiClientPlugin implements REIClientPlugin { if ( ItemStack.isSameItemSameComponents(inputWithoutDamage, outputWithoutDamage) && MendermanRecipeViewerHelper.getRepairStacks().stream().anyMatch(entry -> entry.repairable().is(inputStack.getItem())) || - inputStack.has(MendermanDataComponents.REPAIRABLE.get()) && !(otherInputEntryStack.getValue() instanceof ItemStack stack && stack.is(Items.ENCHANTED_BOOK)) + inputStack.has(DataComponents.REPAIRABLE) && !(otherInputEntryStack.getValue() instanceof ItemStack stack && stack.is(Items.ENCHANTED_BOOK)) ) { return EventResult.interruptFalse(); } @@ -119,7 +120,7 @@ public class MendermanReiClientPlugin implements REIClientPlugin { Display display = list.get(i); if (display.getDisplayLocation().isEmpty() || !(display instanceof DefaultAnvilDisplay defaultAnvilDisplay) || - !(defaultAnvilDisplay.getInputEntries().getFirst().getFirst().getValue() instanceof ItemStack stack) || !stack.has(MendermanDataComponents.REPAIRABLE.get()) || + !(defaultAnvilDisplay.getInputEntries().getFirst().getFirst().getValue() instanceof ItemStack stack) || !stack.has(DataComponents.REPAIRABLE) || !(defaultAnvilDisplay.getInputEntries().getLast().getFirst().getValue() instanceof ItemStack otherStack) || otherStack.is(Items.ENCHANTED_BOOK)) continue; 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 4051bbc..5a18d0f 100644 --- a/neoforge/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponentsNeoForge.java +++ b/neoforge/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponentsNeoForge.java @@ -2,9 +2,10 @@ package lgbt.greenhouse.menderman.item; import lgbt.greenhouse.menderman.api.component.MendermanDataComponents; import lgbt.greenhouse.menderman.api.component.RepairRequirements; -import lgbt.greenhouse.menderman.api.component.Repairable; import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.Item; +import net.minecraft.world.item.enchantment.Repairable; import java.util.Map; import java.util.function.BiConsumer; @@ -14,7 +15,7 @@ public class MendermanDefaultComponentsNeoForge { public static void modifyItemRepairMaterials(BiConsumer> consumer) { for (Map.Entry entry : MendermanDefaultComponents.getDefaultRepairables().entrySet()) { consumer.accept(entry.getKey(), - builder -> builder.set(MendermanDataComponents.REPAIRABLE.get(), entry.getValue())); + builder -> builder.set(DataComponents.REPAIRABLE, entry.getValue())); } } diff --git a/neoforge/src/main/java/lgbt/greenhouse/menderman/mixin/neoforge/Mixin_AnvilMenu.java b/neoforge/src/main/java/lgbt/greenhouse/menderman/mixin/neoforge/Mixin_AnvilMenu.java index 0224457..507c4b1 100644 --- a/neoforge/src/main/java/lgbt/greenhouse/menderman/mixin/neoforge/Mixin_AnvilMenu.java +++ b/neoforge/src/main/java/lgbt/greenhouse/menderman/mixin/neoforge/Mixin_AnvilMenu.java @@ -9,12 +9,4 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(AnvilMenu.class) public class Mixin_AnvilMenu { - @ModifyExpressionValue(method = "lambda$onTake$2", at = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/player/Abilities;instabuild:Z", opcode = Opcodes.GETFIELD)) - private static boolean menderman$dontDamageAnvil(boolean original) { - if (Menderman.shouldDamageAnvil) { - Menderman.shouldDamageAnvil = false; - return true; - } - return original; - } } diff --git a/neoforge/src/main/java/lgbt/greenhouse/menderman/platform/MendermanPlatformHelperNeoForge.java b/neoforge/src/main/java/lgbt/greenhouse/menderman/platform/MendermanPlatformHelperNeoForge.java index 472b981..8b6844a 100644 --- a/neoforge/src/main/java/lgbt/greenhouse/menderman/platform/MendermanPlatformHelperNeoForge.java +++ b/neoforge/src/main/java/lgbt/greenhouse/menderman/platform/MendermanPlatformHelperNeoForge.java @@ -13,7 +13,8 @@ public class MendermanPlatformHelperNeoForge implements MendermanPlatformHelper if (ModList.get() != null) { return ModList.get().isLoaded(modId); } - return FMLLoader.getLoadingModList() + return FMLLoader.getCurrent() + .getLoadingModList() .getMods() .stream() .anyMatch(modInfo -> modInfo.getModId().equals(modId)); diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/MendermanCompatibilityKeys.java b/xplat/src/main/java/lgbt/greenhouse/menderman/MendermanCompatibilityKeys.java index c89a0a3..50e209e 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/MendermanCompatibilityKeys.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/MendermanCompatibilityKeys.java @@ -21,7 +21,7 @@ public class MendermanCompatibilityKeys { public static class FarmersDelight { public static final TagKey KNIVES_TOOLS = itemTag("farmersdelight", "tools/knives"); - public static final TagKey FLINT_TOOL_MATERIALS = itemTag("menderman", "flint_tool_materials"); + public static final TagKey FLINT_TOOL_MATERIALS = itemTag("farmersdelight", "flint_tool_materials"); } private static TagKey itemTag(String namespace, String path) { diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/MendermanTags.java b/xplat/src/main/java/lgbt/greenhouse/menderman/MendermanTags.java index 0d53adf..9d9b0ed 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/MendermanTags.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/MendermanTags.java @@ -8,19 +8,6 @@ import static lgbt.greenhouse.menderman.Menderman.id; public class MendermanTags { public static class ItemTags { - public static final TagKey WOODEN_TOOL_MATERIALS = TagKey.create(Registries.ITEM, id("wooden_tool_materials")); - public static final TagKey GOLD_TOOL_MATERIALS = TagKey.create(Registries.ITEM, id("gold_tool_materials")); - public static final TagKey IRON_TOOL_MATERIALS = TagKey.create(Registries.ITEM, id("iron_tool_materials")); - public static final TagKey DIAMOND_TOOL_MATERIALS = TagKey.create(Registries.ITEM, id("diamond_tool_materials")); - public static final TagKey NETHERITE_TOOL_MATERIALS = TagKey.create(Registries.ITEM, id("netherite_tool_materials")); - - public static final TagKey REPAIRS_LEATHER_ARMOR = TagKey.create(Registries.ITEM, id("repairs_leather_armor")); - public static final TagKey REPAIRS_GOLD_ARMOR = TagKey.create(Registries.ITEM, id("repairs_gold_armor")); - public static final TagKey REPAIRS_CHAIN_ARMOR = TagKey.create(Registries.ITEM, id("repairs_chain_armor")); - public static final TagKey REPAIRS_IRON_ARMOR = TagKey.create(Registries.ITEM, id("repairs_iron_armor")); - public static final TagKey REPAIRS_DIAMOND_ARMOR = TagKey.create(Registries.ITEM, id("repairs_diamond_armor")); - public static final TagKey REPAIRS_NETHERITE_ARMOR = TagKey.create(Registries.ITEM, id("repairs_netherite_armor")); - public static final TagKey BOW_MATERIALS = TagKey.create(Registries.ITEM, id("bow_materials")); public static final TagKey BRUSH_MATERIALS = TagKey.create(Registries.ITEM, id("brush_materials")); public static final TagKey CARROT_ON_A_STICK_MATERIALS = TagKey.create(Registries.ITEM, id("carrot_on_a_stick_materials")); diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/api/component/MendermanDataComponents.java b/xplat/src/main/java/lgbt/greenhouse/menderman/api/component/MendermanDataComponents.java index 1d0b161..9d888a1 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/api/component/MendermanDataComponents.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/api/component/MendermanDataComponents.java @@ -8,12 +8,6 @@ import net.minecraft.core.registries.BuiltInRegistries; public class MendermanDataComponents { public static final MendermanDeferredRegistry> DEFERRED = MendermanDeferredRegistry.create(BuiltInRegistries.DATA_COMPONENT_TYPE); - public static final MendermanDeferredValue, DataComponentType> REPAIRABLE = DEFERRED.register("repairable", - () -> DataComponentType.builder() - .persistent(Repairable.CODEC) - .networkSynchronized(Repairable.STREAM_CODEC) - .cacheEncoding() - .build()); public static final MendermanDeferredValue, DataComponentType> REPAIR_REQUIREMENTS = DEFERRED.register("repair_requirements", () -> DataComponentType.builder() .persistent(RepairRequirements.CODEC) diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/api/component/Repairable.java b/xplat/src/main/java/lgbt/greenhouse/menderman/api/component/Repairable.java deleted file mode 100644 index 9ecedb6..0000000 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/api/component/Repairable.java +++ /dev/null @@ -1,30 +0,0 @@ -package lgbt.greenhouse.menderman.api.component; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.core.HolderSet; -import net.minecraft.core.RegistryCodecs; -import net.minecraft.core.registries.Registries; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.ByteBufCodecs; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; - -/** - * Backport of the Repairable component from later Minecraft versions. - * @param items The items that the item that has this component can be repaired by. - */ -public record Repairable(HolderSet items) { - public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( - RegistryCodecs.homogeneousList(Registries.ITEM).fieldOf("items").forGetter(Repairable::items) - ).apply(inst, Repairable::new)); - public static final StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.holderSet(Registries.ITEM), Repairable::items, - Repairable::new - ); - - public boolean isValidRepairItem(ItemStack stack) { - return stack.is(this.items); - } -} 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 41783e3..749d397 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/integration/MendermanRecipeViewerHelper.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/integration/MendermanRecipeViewerHelper.java @@ -1,12 +1,14 @@ package lgbt.greenhouse.menderman.integration; import lgbt.greenhouse.menderman.api.component.MendermanDataComponents; -import lgbt.greenhouse.menderman.api.component.Repairable; import lgbt.greenhouse.menderman.platform.MendermanPlatformHelper; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Repairable; import java.util.*; @@ -21,16 +23,16 @@ public class MendermanRecipeViewerHelper { public static List getRepairStacks() { List repairEntries = new ArrayList<>(); - for (Item item : MendermanRecipeViewerHelper.EXPECTED_REPAIRABLE_VALUES.keySet()) { - if (!item.components().has(MendermanDataComponents.REPAIRABLE.get())) { + for (Item item : BuiltInRegistries.ITEM) { + if (!item.components().has(DataComponents.REPAIRABLE)) { continue; } ItemStack stack = item.getDefaultInstance(); - Repairable repairable = item.components().get(MendermanDataComponents.REPAIRABLE.get()); + Repairable repairable = item.components().get(DataComponents.REPAIRABLE); assert repairable != null; - if (!repairable.items().equals(MendermanRecipeViewerHelper.EXPECTED_REPAIRABLE_VALUES.get(item))) { + if (EXPECTED_REPAIRABLE_VALUES.containsKey(item) && !repairable.items().equals(MendermanRecipeViewerHelper.EXPECTED_REPAIRABLE_VALUES.get(item))) { continue; } diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/integration/emi/MendermanEmiPlugin.java b/xplat/src/main/java/lgbt/greenhouse/menderman/integration/emi/MendermanEmiPlugin.java index f5ea039..d377682 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/integration/emi/MendermanEmiPlugin.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/integration/emi/MendermanEmiPlugin.java @@ -23,16 +23,17 @@ import java.util.function.Consumer; public class MendermanEmiPlugin implements EmiPlugin { @Override public void register(EmiRegistry registry) { - registry.removeRecipes(emiRecipe -> { - if (emiRecipe.getId() != null && emiRecipe.getId().getNamespace().equals("emi") && - (emiRecipe.getId().getPath().startsWith("/anvil/repairing/material/") || emiRecipe.getId().getPath().startsWith("/anvil/repairing/tool/") || emiRecipe.getId().getPath().startsWith("/anvil/repairing/grindstone/"))) { - ItemStack stack = emiRecipe.getInputs().getFirst().getEmiStacks().getFirst().getItemStack(); - return MendermanRecipeViewerHelper.getRepairStacks().stream().anyMatch(entry -> entry.repairable().is(stack.getItem())) || stack.has(MendermanDataComponents.REPAIRABLE.get()); - } - return false; - }); - - createMaterialRepairRecipes(registry); + // Stub. +// registry.removeRecipes(emiRecipe -> { +// if (emiRecipe.getId() != null && emiRecipe.getId().getNamespace().equals("emi") && +// (emiRecipe.getId().getPath().startsWith("/anvil/repairing/material/") || emiRecipe.getId().getPath().startsWith("/anvil/repairing/tool/") || emiRecipe.getId().getPath().startsWith("/anvil/repairing/grindstone/"))) { +// ItemStack stack = emiRecipe.getInputs().getFirst().getEmiStacks().getFirst().getItemStack(); +// return MendermanRecipeViewerHelper.getRepairStacks().stream().anyMatch(entry -> entry.repairable().is(stack.getItem())) || stack.has(MendermanDataComponents.REPAIRABLE.get()); +// } +// return false; +// }); +// +// createMaterialRepairRecipes(registry); } private static void createMaterialRepairRecipes(EmiRegistry emiRegistry) { diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/integration/jei/MendermanJeiHelper.java b/xplat/src/main/java/lgbt/greenhouse/menderman/integration/jei/MendermanJeiHelper.java index 3ca7de7..f198378 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/integration/jei/MendermanJeiHelper.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/integration/jei/MendermanJeiHelper.java @@ -25,16 +25,16 @@ package lgbt.greenhouse.menderman.integration.jei; import lgbt.greenhouse.menderman.api.MendermanRepairHelper; import lgbt.greenhouse.menderman.api.component.MendermanDataComponents; -import lgbt.greenhouse.menderman.api.component.Repairable; import lgbt.greenhouse.menderman.integration.MendermanRecipeViewerHelper; import mezz.jei.api.recipe.vanilla.IJeiAnvilRecipe; import mezz.jei.api.recipe.vanilla.IVanillaRecipeFactory; import mezz.jei.library.plugins.vanilla.ingredients.subtypes.EnchantedBookSubtypeInterpreter; import mezz.jei.library.util.ResourceLocationUtil; import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponents; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Repairable; import java.util.*; import java.util.stream.Stream; @@ -42,21 +42,21 @@ import java.util.stream.Stream; public class MendermanJeiHelper { public static Stream getMendermanRepairRecipes(IVanillaRecipeFactory vanillaRecipeFactory) { - return MendermanRecipeViewerHelper.EXPECTED_REPAIRABLE_VALUES.keySet().stream() + return MendermanRecipeViewerHelper.getRepairStacks().stream() .flatMap(item -> getRepairRecipes(vanillaRecipeFactory, item)); } - public static Stream getRepairRecipes(IVanillaRecipeFactory vanillaRecipeFactory, Item item) { + public static Stream getRepairRecipes(IVanillaRecipeFactory vanillaRecipeFactory, MendermanRecipeViewerHelper.RepairEntry entry) { List recipes = new ArrayList<>(); - if (!item.components().has(MendermanDataComponents.REPAIRABLE.get())) { + if (!entry.repairable().has(DataComponents.REPAIRABLE)) { return Stream.empty(); } - ItemStack stack = item.getDefaultInstance(); + ItemStack stack = entry.repairable(); - Repairable repairable = item.components().get(MendermanDataComponents.REPAIRABLE.get()); + Repairable repairable = entry.repairable().get(DataComponents.REPAIRABLE); assert repairable != null; - if (!repairable.items().equals(MendermanRecipeViewerHelper.EXPECTED_REPAIRABLE_VALUES.get(item))) { + if (!repairable.items().equals(MendermanRecipeViewerHelper.EXPECTED_REPAIRABLE_VALUES.get(entry))) { return Stream.empty(); } 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 4df92bc..8503878 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponents.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/item/MendermanDefaultComponents.java @@ -4,59 +4,36 @@ 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.api.component.Repairable; 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; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.util.Mth; +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.CraftingRecipe; -import net.minecraft.world.item.crafting.ShapedRecipe; -import net.minecraft.world.item.crafting.ShapelessRecipe; -import net.minecraft.world.item.crafting.SmithingRecipe; +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 java.util.*; import java.util.function.Consumer; public class MendermanDefaultComponents { - private static final List FALLBACK_REPAIRABLES = new ArrayList<>(); private static final List FALLBACK_REPAIR_REQUIREMENTS = new ArrayList<>(); public static Map getDefaultRepairables() { Map map = new LinkedHashMap<>(); - modifyRepairables(map, MendermanTags.ItemTags.WOODEN_TOOL_MATERIALS, - Items.WOODEN_SWORD, Items.WOODEN_PICKAXE, Items.WOODEN_AXE, Items.WOODEN_SHOVEL, Items.WOODEN_HOE); - modifyRepairables(map, ItemTags.STONE_TOOL_MATERIALS, - Items.STONE_SWORD, Items.STONE_PICKAXE, Items.STONE_AXE, Items.STONE_SHOVEL, Items.STONE_HOE); - modifyRepairables(map, MendermanTags.ItemTags.GOLD_TOOL_MATERIALS, - Items.GOLDEN_SWORD, Items.GOLDEN_PICKAXE, Items.GOLDEN_AXE, Items.GOLDEN_SHOVEL, Items.GOLDEN_HOE); - modifyRepairables(map, MendermanTags.ItemTags.IRON_TOOL_MATERIALS, - Items.IRON_SWORD, Items.IRON_PICKAXE, Items.IRON_AXE, Items.IRON_SHOVEL, Items.IRON_HOE); - modifyRepairables(map, MendermanTags.ItemTags.DIAMOND_TOOL_MATERIALS, - Items.DIAMOND_SWORD, Items.DIAMOND_PICKAXE, Items.DIAMOND_AXE, Items.DIAMOND_SHOVEL, Items.DIAMOND_HOE); - modifyRepairables(map, MendermanTags.ItemTags.NETHERITE_TOOL_MATERIALS, - Items.NETHERITE_SWORD, Items.NETHERITE_PICKAXE, Items.NETHERITE_AXE, Items.NETHERITE_SHOVEL, Items.NETHERITE_HOE); - - modifyRepairables(map, MendermanTags.ItemTags.REPAIRS_LEATHER_ARMOR, - Items.LEATHER_HELMET, Items.LEATHER_CHESTPLATE, Items.LEATHER_LEGGINGS, Items.LEATHER_BOOTS); - modifyRepairables(map, MendermanTags.ItemTags.REPAIRS_GOLD_ARMOR, - Items.GOLDEN_HELMET, Items.GOLDEN_CHESTPLATE, Items.GOLDEN_LEGGINGS, Items.GOLDEN_BOOTS); - modifyRepairables(map, MendermanTags.ItemTags.REPAIRS_CHAIN_ARMOR, - Items.CHAINMAIL_HELMET, Items.CHAINMAIL_CHESTPLATE, Items.CHAINMAIL_LEGGINGS, Items.CHAINMAIL_BOOTS); - modifyRepairables(map, MendermanTags.ItemTags.REPAIRS_IRON_ARMOR, - Items.IRON_HELMET, Items.IRON_CHESTPLATE, Items.IRON_LEGGINGS, Items.IRON_BOOTS); - modifyRepairables(map, MendermanTags.ItemTags.REPAIRS_DIAMOND_ARMOR, - Items.DIAMOND_HELMET, Items.DIAMOND_CHESTPLATE, Items.DIAMOND_LEGGINGS, Items.DIAMOND_BOOTS); - modifyRepairables(map, MendermanTags.ItemTags.REPAIRS_NETHERITE_ARMOR, - Items.NETHERITE_HELMET, Items.NETHERITE_CHESTPLATE, Items.NETHERITE_LEGGINGS, Items.NETHERITE_BOOTS); - modifyRepairable(map, Items.SHIELD, getItemTag(MendermanTags.ItemTags.SHIELD_MATERIALS)); modifyRepairable(map, Items.BOW, getItemTag(MendermanTags.ItemTags.BOW_MATERIALS)); @@ -80,15 +57,9 @@ public class MendermanDefaultComponents { return map; } - private static void modifyRepairables(Map map, TagKey repairItemTag, Item... items) { - for (Item item : items) { - modifyRepairable(map, item, getItemTag(repairItemTag)); - } - } - - + @SuppressWarnings("unchecked") private static HolderSet getItemTag(TagKey tagKey) { - return BuiltInRegistries.ITEM.getOrCreateTag(tagKey); + return ((Invoker_MappedRegistry)BuiltInRegistries.ITEM).menderman$invokeGetOrCreateTagForRegistration(tagKey); } private static void modifyRepairable(Map map, Item item, HolderSet repairItems) { @@ -188,109 +159,77 @@ public class MendermanDefaultComponents { for (Item item : BuiltInRegistries.ITEM) { ItemStack defaultInstance = item.getDefaultInstance(); - List existingRepairItems = item.components().has(MendermanDataComponents.REPAIRABLE.get()) ? Collections.emptyList() : getRepairItems(item); - - if (!item.components().has(MendermanDataComponents.REPAIRABLE.get()) && existingRepairItems.isEmpty() || defaultInstance.has(MendermanDataComponents.REPAIR_REQUIREMENTS.get())) + if (item.components().has(DataComponents.REPAIRABLE) || defaultInstance.has(MendermanDataComponents.REPAIR_REQUIREMENTS.get())) continue; - if (!existingRepairItems.isEmpty()) { - if (defaultInstance.is(MendermanCompatibilityKeys.FarmersDelight.KNIVES_TOOLS)) { - if (existingRepairItems.contains(Items.FLINT)) { - fallbackRepairable(item, MendermanCompatibilityKeys.FarmersDelight.FLINT_TOOL_MATERIALS); - } else if (existingRepairItems.contains(Items.GOLD_INGOT)) { - fallbackRepairable(item, MendermanTags.ItemTags.GOLD_TOOL_MATERIALS); - } else if (existingRepairItems.contains(Items.IRON_INGOT)) { - fallbackRepairable(item, MendermanTags.ItemTags.IRON_TOOL_MATERIALS); - } else if (existingRepairItems.contains(Items.DIAMOND)) { - fallbackRepairable(item, MendermanTags.ItemTags.DIAMOND_TOOL_MATERIALS); - } else if (existingRepairItems.contains(Items.NETHERITE_INGOT)) { - fallbackRepairable(item, MendermanTags.ItemTags.NETHERITE_TOOL_MATERIALS); - } - } - } - 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); } else if ( defaultInstance.is(ItemTags.HEAD_ARMOR) || - defaultInstance.is(ItemTags.FOOT_ARMOR) || - defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.BOW_TOOLS) || - defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.CROSSBOW_TOOLS) || - defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.FISHING_ROD_TOOLS) || - defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.SPEAR_TOOLS) || - defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.SHIELD_TOOLS) || - defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.MACE_TOOLS) + defaultInstance.is(ItemTags.FOOT_ARMOR) || + defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.BOW_TOOLS) || + defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.CROSSBOW_TOOLS) || + defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.FISHING_ROD_TOOLS) || + defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.SPEAR_TOOLS) || + defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.SHIELD_TOOLS) || + defaultInstance.is(MendermanCompatibilityKeys.ConventionalTags.MACE_TOOLS) ) { fallbackRepairRequirement(item, 2); } else if ( defaultInstance.is(ItemTags.CHEST_ARMOR) || - defaultInstance.is(ItemTags.LEG_ARMOR) + defaultInstance.is(ItemTags.LEG_ARMOR) ) { fallbackRepairRequirement(item, 3); } else { - Optional value = serverLevel.getRecipeManager().getRecipes().stream().map(recipeHolder -> { - if (recipeHolder.value() instanceof CraftingRecipe craftingRecipe) { - if (craftingRecipe.getResultItem(serverLevel.registryAccess()).is(item)) { - if (craftingRecipe instanceof ShapedRecipe shapedRecipe) { - return Math.max(1, Mth.ceil(shapedRecipe.getIngredients().stream().filter(ingredient -> - Arrays.stream(ingredient.getItems()) - .anyMatch(stack -> stack.is(item)) - ).toList().size() * 0.33)); - } - if (craftingRecipe instanceof ShapelessRecipe shapeless) { - return Math.max(1, Mth.ceil(shapeless.getIngredients().stream().filter(ingredient -> - Arrays.stream(ingredient.getItems()) - .anyMatch(stack -> stack.is(item)) - ).toList().size() * 0.33)); - } - } + ContextMap contextMap = SlotDisplayContext.fromLevel(serverLevel); + OptionalInt value = serverLevel.recipeAccess().getRecipes().stream().mapToInt(recipeHolder -> { + if (recipeHolder.value().display().isEmpty()) { + return -1; } - if (recipeHolder.value() instanceof SmithingRecipe smithingRecipe) { - if (smithingRecipe.getResultItem(serverLevel.registryAccess()).is(item)) { + RecipeDisplay display = recipeHolder.value().display().getFirst(); + if (display.result().resolveForFirstStack(contextMap).is(item)) { + if (display instanceof ShapelessCraftingRecipeDisplay shaped) { + return Math.max(1, Mth.ceil(shaped.ingredients().stream().filter(ingredient -> + ingredient.resolveForStacks(contextMap) + .stream() + .anyMatch(stack -> stack.is(item)) + ).toList().size() * 0.33)); + } + if (display instanceof ShapelessCraftingRecipeDisplay shapeless) { + return Math.max(1, Mth.ceil(shapeless.ingredients().stream().filter(ingredient -> + ingredient.resolveForStacks(contextMap) + .stream() + .anyMatch(stack -> stack.is(item)) + ).toList().size() * 0.33)); + } + if (display instanceof SmithingRecipeDisplay) { return 1; } } - return null; - }).filter(Objects::nonNull).min(Comparator.comparingInt(intValue -> intValue)); - + return -1; + }).filter(value1 -> value1 > 0).max(); value.ifPresent(fullRepairRequirements -> fallbackRepairRequirement(item, fullRepairRequirements)); - } } } - private static List getRepairItems(Item item) { - return BuiltInRegistries.ITEM.stream() - .filter(potential -> item.isValidRepairItem(item.getDefaultInstance(), potential.getDefaultInstance())) - .toList(); - } - - private static void fallbackRepairable(Item item, TagKey repairItems) { - modifyComponents(item, builder -> builder.set(MendermanDataComponents.REPAIRABLE.get(), new Repairable(BuiltInRegistries.ITEM.getOrCreateTag(repairItems)))); - FALLBACK_REPAIRABLES.add(item); - } - private static void fallbackRepairRequirement(Item item, int count) { modifyComponents(item, builder -> builder.set(MendermanDataComponents.REPAIR_REQUIREMENTS.get(), new RepairRequirements(count))); FALLBACK_REPAIR_REQUIREMENTS.add(item); } public static void resetFallbackRepairRequirements() { - for (Item item : FALLBACK_REPAIRABLES) { - modifyComponents(item, builder -> builder.set(MendermanDataComponents.REPAIRABLE.get(), null)); - } - FALLBACK_REPAIRABLES.clear(); for (Item item : FALLBACK_REPAIR_REQUIREMENTS) { modifyComponents(item, builder -> builder.set(MendermanDataComponents.REPAIR_REQUIREMENTS.get(), null)); } diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Invoker_MappedRegistry.java b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Invoker_MappedRegistry.java new file mode 100644 index 0000000..091be4b --- /dev/null +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/Invoker_MappedRegistry.java @@ -0,0 +1,14 @@ +package lgbt.greenhouse.menderman.mixin; + +import net.minecraft.core.HolderSet; +import net.minecraft.core.MappedRegistry; +import net.minecraft.tags.TagKey; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +// NeoForge doesn't like us calling this from registration lookup. +@Mixin(MappedRegistry.class) +public interface Invoker_MappedRegistry { + @Invoker("getOrCreateTagForRegistration") + HolderSet.Named menderman$invokeGetOrCreateTagForRegistration(TagKey key); +} 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 754bc40..173e11a 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 @@ -8,7 +8,6 @@ import com.llamalad7.mixinextras.sugar.Local; import lgbt.greenhouse.menderman.Menderman; import lgbt.greenhouse.menderman.api.MendermanRepairHelper; import lgbt.greenhouse.menderman.api.component.MendermanDataComponents; -import lgbt.greenhouse.menderman.api.component.Repairable; import lgbt.greenhouse.menderman.api.gamerule.MendermanGamerules; import net.minecraft.core.component.DataComponentType; import net.minecraft.world.Container; @@ -33,8 +32,8 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { @Shadow private int repairItemCountCost; - public Mixin_AnvilMenu(@Nullable MenuType menuType, int containerId, Inventory inventory, ContainerLevelAccess access) { - super(menuType, containerId, inventory, access); + public Mixin_AnvilMenu(@Nullable MenuType menuType, int containerId, Inventory inventory, ContainerLevelAccess access, ItemCombinerMenuSlotDefinition slotDefinition) { + super(menuType, containerId, inventory, access, slotDefinition); } @ModifyExpressionValue(method = "mayPickup", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/DataSlot;get()I", ordinal = 1)) @@ -45,17 +44,7 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { return original; } - @ModifyExpressionValue(method = "createResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/Item;isValidRepairItem(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemStack;)Z")) - private boolean menderman$modifyRepairableResult(boolean original, @Local(ordinal = 0) ItemStack stack, @Local(ordinal = 2) ItemStack otherStack) { - if (stack.has(MendermanDataComponents.REPAIRABLE.get())) { - Repairable repairable = stack.get(MendermanDataComponents.REPAIRABLE.get()); - assert repairable != null; - return repairable.isValidRepairItem(otherStack); - } - return original; - } - - @WrapOperation(method = "createResult", at = @At(value = "INVOKE", target = "Ljava/lang/Math;min(II)I")) + @WrapOperation(method = { "createResult", "createResultInternal" }, at = @At(value = "INVOKE", target = "Ljava/lang/Math;min(II)I")) private int menderman$modifyRepairAmount(int a, int b, Operation original, @Local(ordinal = 0) ItemStack stack, @Local(ordinal = 2) ItemStack repairStack) { OptionalInt repairRequirementAmount = MendermanRepairHelper.getRepairRequirementsRepairAmount(stack, repairStack); if (repairRequirementAmount.isPresent()) { @@ -64,7 +53,7 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { return original.call(a, b); } - @ModifyVariable(method = "createResult", at = @At(value = "INVOKE", target = "Ljava/lang/Math;min(II)I"), ordinal = 0) + @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) { if (!MendermanGamerules.doesRepairingCostExperience(player.level())) { return 0; @@ -72,12 +61,12 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { return Math.min(original, MendermanRepairHelper.clampRepairCount(stack, repairStack)); } - @Inject(method = "createResult", at = @At(value = "FIELD", target = "Lnet/minecraft/world/inventory/AnvilMenu;repairItemCountCost:I", ordinal = 1, shift = At.Shift.AFTER, opcode = Opcodes.PUTFIELD)) + @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 = 2) ItemStack repairStack) { repairItemCountCost = Math.min(repairItemCountCost, MendermanRepairHelper.clampRepairCount(stack, repairStack)); } - @ModifyVariable(method = "createResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;getDamageValue()I", ordinal = 5), ordinal = 6) + @ModifyVariable(method = { "createResult", "createResultInternal" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;getDamageValue()I", ordinal = 5), ordinal = 6) private int menderman$modifytemCombiningRepairValue(int original, @Local(ordinal = 0) ItemStack input, @Local(ordinal = 2) ItemStack otherInput) { if (input.has(MendermanDataComponents.REPAIR_REQUIREMENTS.get())) { return MendermanRepairHelper.getRepairRequirementsCombineAmount( @@ -88,7 +77,7 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { return original; } - @ModifyExpressionValue(method = "createResult", at = @At(value = "INVOKE", target = "Ljava/lang/Integer;intValue()I")) + @ModifyExpressionValue(method = { "createResult", "createResultInternal" }, at = @At(value = "INVOKE", target = "Ljava/lang/Integer;intValue()I")) private int menderman$cancelIncreasedRepairCostStarting(int original) { if (!MendermanGamerules.compoundingRepairCost(player.level())) { return 0; @@ -96,7 +85,7 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { return original; } - @ModifyVariable(method = "createResult", 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) + @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) { if (!MendermanGamerules.compoundingRepairCost(player.level())) { return 0; @@ -104,7 +93,7 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { return original; } - @WrapWithCondition(method = "createResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;set(Lnet/minecraft/core/component/DataComponentType;Ljava/lang/Object;)Ljava/lang/Object;", ordinal = 1)) + @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) { return MendermanGamerules.compoundingRepairCost(player.level()); } @@ -112,7 +101,7 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { @Unique private boolean menderman$onlyRenaming = false; - @ModifyVariable(method = "createResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;setDamageValue(I)V"), ordinal = 0) + @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) { if (stack.has(MendermanDataComponents.REPAIR_REQUIREMENTS.get())) { return original - 1; @@ -120,7 +109,7 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { return original; } - @ModifyVariable(method = "createResult", 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) + @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) { if (!MendermanGamerules.doesRenameCostExperience(player.level())) { menderman$onlyRenaming = original == namingCost; @@ -129,7 +118,7 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { return original; } - @ModifyVariable(method = "createResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;remove(Lnet/minecraft/core/component/DataComponentType;)Ljava/lang/Object;"), ordinal = 0) + @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) { if (!MendermanGamerules.doesRenameCostExperience(player.level())) { menderman$onlyRenaming = original == namingCost; @@ -138,7 +127,7 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { return original; } - @ModifyVariable(method = "createResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/DataSlot;set(I)V", ordinal = 5), ordinal = 0) + @ModifyVariable(method = { "createResult", "createResultInternal" }, 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) { if (menderman$onlyRenaming || repairItemCountCost > 0) { return menderman$onlyRenaming ? namingCost : repairItemCountCost; @@ -146,7 +135,7 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { return original; } - @ModifyExpressionValue(method = "createResult", at = @At(value = "FIELD", target = "Lnet/minecraft/world/item/ItemStack;EMPTY:Lnet/minecraft/world/item/ItemStack;", ordinal = 4, opcode = Opcodes.GETSTATIC)) + @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; @@ -164,4 +153,13 @@ public abstract class Mixin_AnvilMenu extends ItemCombinerMenu { private boolean menderman$dontItemsWhenRenaming(Container instance, int i, ItemStack stack) { return !menderman$onlyRenaming; } + + @ModifyExpressionValue(method = { "method_24922", "lambda$onTake$2" }, 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; + return true; + } + return original; + } } diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/jei/Mixin_AnvilRecipeMaker.java b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/jei/Mixin_AnvilRecipeMaker.java index 0cfdc1a..6e49723 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/jei/Mixin_AnvilRecipeMaker.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/jei/Mixin_AnvilRecipeMaker.java @@ -1,37 +1,31 @@ package lgbt.greenhouse.menderman.mixin.integration.jei; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import lgbt.greenhouse.menderman.api.component.MendermanDataComponents; -import lgbt.greenhouse.menderman.api.component.Repairable; -import lgbt.greenhouse.menderman.integration.MendermanRecipeViewerHelper; import lgbt.greenhouse.menderman.integration.jei.MendermanJeiHelper; import mezz.jei.api.recipe.vanilla.IJeiAnvilRecipe; import mezz.jei.api.recipe.vanilla.IVanillaRecipeFactory; import mezz.jei.api.runtime.IIngredientManager; import mezz.jei.library.plugins.vanilla.anvil.AnvilRecipeMaker; -import net.minecraft.core.HolderSet; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import java.util.List; import java.util.stream.Stream; @Mixin(value = AnvilRecipeMaker.class, remap = false) public abstract class Mixin_AnvilRecipeMaker { @ModifyExpressionValue(method = "getAnvilRecipes", at = @At(value = "INVOKE", target = "Lmezz/jei/library/plugins/vanilla/anvil/AnvilRecipeMaker;getRepairRecipes(Lmezz/jei/api/recipe/vanilla/IVanillaRecipeFactory;Lmezz/jei/api/ingredients/IIngredientHelper;)Ljava/util/stream/Stream;")) private static Stream menderman$replaceAnvilRecipes(Stream original, IVanillaRecipeFactory vanillaRecipeFactory, IIngredientManager ingredientManager) { + List recipes = MendermanJeiHelper.getMendermanRepairRecipes(vanillaRecipeFactory).toList(); + //noinspection unchecked return (Stream)Stream.concat( - MendermanJeiHelper.getMendermanRepairRecipes(vanillaRecipeFactory), + recipes.stream(), original.filter(anvilRecipe -> ((IJeiAnvilRecipe)anvilRecipe).getLeftInputs() .stream() - .noneMatch(stack -> MendermanRecipeViewerHelper.EXPECTED_REPAIRABLE_VALUES.containsKey(stack.getItem()) || - ((IJeiAnvilRecipe)anvilRecipe).getRightInputs() - .stream() - .anyMatch(materialInput -> stack - .getOrDefault(MendermanDataComponents.REPAIRABLE.get(), new Repairable(HolderSet.empty())) - .isValidRepairItem(materialInput) - )) - ) + .noneMatch(stack -> recipes.stream().anyMatch(anvilRecipe1 -> + anvilRecipe1.getLeftInputs().contains(stack)) + )) ); } } diff --git a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/jei/Mixin_IRecipeCategory.java b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/jei/Mixin_IRecipeCategory.java index 1ffc3bc..ab40811 100644 --- a/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/jei/Mixin_IRecipeCategory.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/jei/Mixin_IRecipeCategory.java @@ -30,7 +30,7 @@ public interface Mixin_IRecipeCategory { copied.setDamageValue(resultStack.get().getMaxDamage() - repairRequirementsAmount.getAsInt()); recipeSlots.get(2) .createDisplayOverrides() - .addItemStack(copied); + .add(copied); } } } diff --git a/xplat/src/main/resources/menderman.mixins.json b/xplat/src/main/resources/menderman.mixins.json index 058f921..cd4ecd6 100644 --- a/xplat/src/main/resources/menderman.mixins.json +++ b/xplat/src/main/resources/menderman.mixins.json @@ -8,6 +8,7 @@ "Accessor_Item", "Invoker_GameRules", "Invoker_GameRulesBooleanValue", + "Invoker_MappedRegistry", "Mixin_AnvilMenu", "Mixin_GrindstoneMenu", "integration.emi.Mixin_EmiRecipes",