From fe4ef5fb36067f3f65ed98cc66d30da3e6f2e412 Mon Sep 17 00:00:00 2001 From: Anastasia Chrysanthemum Date: Fri, 15 May 2026 07:00:57 +1000 Subject: [PATCH] refactor: Move REI compat out of loader specific packages. --- CHANGELOG.md | 1 + .../Mixin_DisplaysHolderImpl.java | 21 --- gradle/libs.versions.toml | 1 + neoforge/build.gradle.kts | 5 +- .../rei/MendermanReiClientPlugin.java | 150 ------------------ .../rei/MendermanReiClientPluginNeoForge.java | 7 + .../Mixin_DefaultAnvilCategory.java | 35 ---- xplat/build.gradle.kts | 2 + .../rei/MendermanReiClientPlugin.java | 0 .../jei/Mixin_IRecipeCategory.java | 2 +- .../Mixin_DefaultAnvilCategory.java | 1 - .../Mixin_DisplaysHolderImpl.java | 0 12 files changed, 14 insertions(+), 211 deletions(-) delete mode 100644 fabric/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DisplaysHolderImpl.java delete mode 100644 neoforge/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java create mode 100644 neoforge/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPluginNeoForge.java delete mode 100644 neoforge/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DefaultAnvilCategory.java rename {fabric => xplat}/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java (100%) rename {fabric => xplat}/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DefaultAnvilCategory.java (96%) rename {neoforge => xplat}/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DisplaysHolderImpl.java (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 522b87e..4db6aab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,3 +8,4 @@ - 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 item combining not being modified within JEI. diff --git a/fabric/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DisplaysHolderImpl.java b/fabric/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DisplaysHolderImpl.java deleted file mode 100644 index 8064f57..0000000 --- a/fabric/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DisplaysHolderImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package lgbt.greenhouse.menderman.mixin.integration.roughlyenoughitems; - -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import lgbt.greenhouse.menderman.integration.rei.MendermanReiClientPlugin; -import me.shedaniel.rei.api.common.category.CategoryIdentifier; -import me.shedaniel.rei.api.common.display.Display; -import me.shedaniel.rei.impl.client.registry.display.DisplaysHolderImpl; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -@Mixin(value = DisplaysHolderImpl.class, remap = false) -public class Mixin_DisplaysHolderImpl { - @ModifyReturnValue(method = "getUnmodifiable", at = @At("RETURN")) - private Map, List> menderman$sortEntryToAppendExistingRepairRecipes(Map, List> original) { - return MendermanReiClientPlugin.sortDisplayList(original); - } -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 450f6b6..0ac1baa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -43,6 +43,7 @@ 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" } +# No xplat bc Architectury Loom moment 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..de0c839 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -1,5 +1,4 @@ -import lgbt.greenhouse.menderman.gradle.Properties -import org.apache.tools.ant.filters.LineContains +import lgbt.greenhouse.menderman.gradle.Properties plugins { id("conventions.loader") @@ -14,7 +13,7 @@ dependencies { // Uncomment to test. CTRL + / will comment the current line. // runtimeOnly(libs.jei.neoforge) -// runtimeOnly(libs.rei.neoforge) + runtimeOnly(libs.rei.neoforge) // runtimeOnly(libs.emi.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 deleted file mode 100644 index 9fa1775..0000000 --- a/neoforge/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java +++ /dev/null @@ -1,150 +0,0 @@ -package lgbt.greenhouse.menderman.integration.rei; - -import dev.architectury.event.EventResult; -import lgbt.greenhouse.menderman.api.MendermanRepairHelper; -import lgbt.greenhouse.menderman.api.component.MendermanDataComponents; -import lgbt.greenhouse.menderman.integration.MendermanRecipeViewerHelper; -import me.shedaniel.rei.api.client.plugins.REIClientPlugin; -import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; -import me.shedaniel.rei.api.common.category.CategoryIdentifier; -import me.shedaniel.rei.api.common.display.Display; -import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; -import me.shedaniel.rei.api.common.util.EntryIngredients; -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.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; - -import java.util.*; -import java.util.function.Consumer; - -@REIPluginClient -public class MendermanReiClientPlugin implements REIClientPlugin { - private static List cachedAnvilDisplays = null; - - @Override - public void registerDisplays(DisplayRegistry registry) { - MendermanReiClientPlugin.cachedAnvilDisplays = null; - registry.registerVisibilityPredicate((category, display) -> { - if (category.getCategoryIdentifier().equals(BuiltinPlugin.ANVIL) && display instanceof DefaultAnvilDisplay anvilDisplay) { - if (anvilDisplay.getDisplayLocation().isPresent()) { - return EventResult.pass(); - } - - EntryStack inputEntryStack = anvilDisplay.getInputEntries().getFirst().getFirst(); - EntryStack otherInputEntryStack = anvilDisplay.getInputEntries().getLast().getFirst(); - EntryStack outputEntryStack = anvilDisplay.getOutputEntries().getFirst().getFirst(); - if (inputEntryStack.getType() != VanillaEntryTypes.ITEM || outputEntryStack.getType() != VanillaEntryTypes.ITEM) { - return EventResult.pass(); - } - - ItemStack inputStack = inputEntryStack.castValue(); - ItemStack outputStack = outputEntryStack.castValue(); - - ItemStack inputWithoutDamage = inputStack.copy(); - ItemStack outputWithoutDamage = outputStack.copy(); - - inputWithoutDamage.setDamageValue(0); - outputWithoutDamage.setDamageValue(0); - - 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)) - ) { - return EventResult.interruptFalse(); - } - } - return EventResult.pass(); - }); - createMaterialRepairRecipes(registry); - } - - private static void createMaterialRepairRecipes(DisplayRegistry registry) { - List repairEntryMap = MendermanRecipeViewerHelper.getRepairStacks(); - - Consumer consumer = registry::add; - - for (MendermanRecipeViewerHelper.RepairEntry entry : repairEntryMap) { - addRepairEntryAnvilRecipes(consumer, entry); - } - } - - private static void addRepairEntryAnvilRecipes(Consumer addRecipeConsumer, MendermanRecipeViewerHelper.RepairEntry entry) { - ResourceLocation itemId = BuiltInRegistries.ITEM.getKey(entry.repairable().getItem()); - if (!entry.materials().isEmpty()) { - for (ItemStack material : entry.materials()) { - ResourceLocation materialId = BuiltInRegistries.ITEM.getKey(material.getItem()); - int maxRepairCount = MendermanRepairHelper.getMaximumItemRepairMaterialCount(entry.repairable(), material); - for (int i = 1; i <= maxRepairCount; ++i) { - ItemStack repairable = entry.repairable().copy(); - repairable.setDamageValue(i == 1 ? repairable.getMaxDamage() : - repairable.getMaxDamage() - MendermanRepairHelper.getRepairRequirementsRepairAmount(repairable, material.copyWithCount(i - 1)).orElse(0)); - - ItemStack countedMaterial = material.copyWithCount(i); - - ItemStack repaired = entry.repairable().copy(); - repaired.setDamageValue(repairable.getMaxDamage() - MendermanRepairHelper.getRepairRequirementsRepairAmount(repairable, countedMaterial) - .orElse(repairable.getMaxDamage())); - - addRecipeConsumer.accept(new DefaultAnvilDisplay( - List.of(EntryIngredients.of(repairable), EntryIngredients.of(countedMaterial)), - List.of(EntryIngredients.of(repaired)), - Optional.of(ResourceLocation.fromNamespaceAndPath("menderman", "anvil/repair/" + itemId.getNamespace() + "/" + itemId.getPath() + - "/material/" + materialId.getNamespace() + "/" + materialId.getPath() + "/cost/" + i)), - OptionalInt.of(i) - )); - } - } - } - } - - public static Map, List> sortDisplayList(Map, List> unmodified) { - var displays = new HashMap<>(unmodified); - if (MendermanReiClientPlugin.cachedAnvilDisplays == null) { - MendermanReiClientPlugin.cachedAnvilDisplays = remapAnvilDisplays(unmodified.getOrDefault(BuiltinClientPlugin.ANVIL, Collections.emptyList())); - } - displays.put(BuiltinClientPlugin.ANVIL, MendermanReiClientPlugin.cachedAnvilDisplays); - return displays; - } - - private static List remapAnvilDisplays(List list) { - List newList = new ArrayList<>(list); - for (int i = 0; i < list.size(); ++i) { - 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().getLast().getFirst().getValue() instanceof ItemStack otherStack) || - otherStack.is(Items.ENCHANTED_BOOK)) - continue; - - OptionalInt indexOfPrecursor = list.stream() - .filter(existingDisplay -> existingDisplay.getDisplayLocation().isEmpty() && - existingDisplay.getInputEntries().getFirst().getFirst().getValue() instanceof ItemStack firstStack && ItemStack.isSameItem(stack, firstStack) && - existingDisplay.getInputEntries().getLast().getFirst().getValue() instanceof ItemStack secondStack && !secondStack.is(Items.ENCHANTED_BOOK)) - .mapToInt(newList::indexOf) - .max(); - indexOfPrecursor.ifPresentOrElse(value -> { - newList.remove(display); - newList.add(value, display); - }, () -> { - OptionalInt indexBeforeEnchantments = list.stream() - .filter(existingDisplay -> existingDisplay.getDisplayLocation().isEmpty() && - existingDisplay.getInputEntries().getLast().getFirst().getValue() instanceof ItemStack secondStack && secondStack.is(Items.ENCHANTED_BOOK)) - .mapToInt(newList::indexOf) - .min(); - indexBeforeEnchantments.ifPresent(value -> { - newList.remove(display); - newList.add(value, display); - }); - }); - } - return Collections.unmodifiableList(newList); - } -} diff --git a/neoforge/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPluginNeoForge.java b/neoforge/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPluginNeoForge.java new file mode 100644 index 0000000..39cf3a0 --- /dev/null +++ b/neoforge/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPluginNeoForge.java @@ -0,0 +1,7 @@ +package lgbt.greenhouse.menderman.integration.rei; + +import me.shedaniel.rei.forge.REIPluginClient; + +@REIPluginClient +public class MendermanReiClientPluginNeoForge extends MendermanReiClientPlugin { +} 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 deleted file mode 100644 index 3a483ca..0000000 --- a/neoforge/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DefaultAnvilCategory.java +++ /dev/null @@ -1,35 +0,0 @@ -package lgbt.greenhouse.menderman.mixin.integration.roughlyenoughitems; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.sugar.Local; -import lgbt.greenhouse.menderman.api.gamerule.MendermanGamerules; -import lgbt.greenhouse.menderman.client.MendermanLangHelper; -import me.shedaniel.rei.plugin.client.categories.anvil.DefaultAnvilCategory; -import me.shedaniel.rei.plugin.common.displays.anvil.DefaultAnvilDisplay; -import net.minecraft.client.Minecraft; -import net.minecraft.core.component.DataComponents; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.enchantment.ItemEnchantments; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; - -@SuppressWarnings({"unused", "UnusedMixin"}) // Exists in xplat mixins.json. -@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) { - 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()); - } - - @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)) { - return "container.menderman.repair.cost"; - } - return key; - } -} diff --git a/xplat/build.gradle.kts b/xplat/build.gradle.kts index 70b5450..6546f19 100644 --- a/xplat/build.gradle.kts +++ b/xplat/build.gradle.kts @@ -15,6 +15,8 @@ dependencies { compileOnly(libs.jei.common) compileOnly(libs.jei.lib) + compileOnly(libs.rei.neoforge) + compileOnly(libs.emi.xplat) } diff --git a/fabric/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java b/xplat/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java similarity index 100% rename from fabric/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java rename to xplat/src/main/java/lgbt/greenhouse/menderman/integration/rei/MendermanReiClientPlugin.java 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 4490faa..cff2d6a 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 @@ -29,7 +29,7 @@ public interface Mixin_IRecipeCategory { copied.setDamageValue(repairCombineAmount); recipeSlots.get(2) .createDisplayOverrides() - .add(copied); + .addItemStack(copied); } else if (anvilRecipe.getUid().getPath().startsWith("anvil.materials_repair.")) { OptionalInt repairRequirementsAmount = MendermanRepairHelper.getRepairRequirementsRepairAmount(stack.get(), repairStack.get()); if (repairRequirementsAmount.isPresent()) { diff --git a/fabric/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DefaultAnvilCategory.java b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DefaultAnvilCategory.java similarity index 96% rename from fabric/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DefaultAnvilCategory.java rename to xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DefaultAnvilCategory.java index 8ccf476..cb13986 100644 --- a/fabric/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DefaultAnvilCategory.java +++ b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DefaultAnvilCategory.java @@ -13,7 +13,6 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; -@SuppressWarnings({"unused", "UnusedMixin"}) // Exists in xplat mixins.json. @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")) diff --git a/neoforge/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DisplaysHolderImpl.java b/xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DisplaysHolderImpl.java similarity index 100% rename from neoforge/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DisplaysHolderImpl.java rename to xplat/src/main/java/lgbt/greenhouse/menderman/mixin/integration/roughlyenoughitems/Mixin_DisplaysHolderImpl.java -- 2.51.2