// SPDX-FileCopyrightText: 2017 The CC: Tweaked Developers // // SPDX-License-Identifier: MPL-2.0 package dan200.computercraft.shared.integration.jei; import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.shared.ModRegistry; import dan200.computercraft.shared.integration.RecipeModHelpers; import dan200.computercraft.shared.media.items.DiskItem; import dan200.computercraft.shared.pocket.items.PocketComputerItem; import dan200.computercraft.shared.turtle.items.TurtleItem; import mezz.jei.api.IModPlugin; import mezz.jei.api.JeiPlugin; import mezz.jei.api.constants.RecipeTypes; import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.ingredients.subtypes.IIngredientSubtypeInterpreter; import mezz.jei.api.registration.IAdvancedRegistration; import mezz.jei.api.registration.ISubtypeRegistration; import mezz.jei.api.runtime.IJeiRuntime; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import java.util.List; @JeiPlugin public class JEIComputerCraft implements IModPlugin { @Override public ResourceLocation getPluginUid() { return new ResourceLocation(ComputerCraftAPI.MOD_ID, "jei"); } @Override public void registerItemSubtypes(ISubtypeRegistration subtypeRegistry) { subtypeRegistry.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, ModRegistry.Items.TURTLE_NORMAL.get(), turtleSubtype); subtypeRegistry.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, ModRegistry.Items.TURTLE_ADVANCED.get(), turtleSubtype); subtypeRegistry.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, ModRegistry.Items.POCKET_COMPUTER_NORMAL.get(), pocketSubtype); subtypeRegistry.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, ModRegistry.Items.POCKET_COMPUTER_ADVANCED.get(), pocketSubtype); subtypeRegistry.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, ModRegistry.Items.DISK.get(), diskSubtype); } @Override public void registerAdvanced(IAdvancedRegistration registry) { registry.addRecipeManagerPlugin(new RecipeResolver()); } @Override public void onRuntimeAvailable(IJeiRuntime runtime) { var registry = runtime.getRecipeManager(); // Register all turtles/pocket computers (not just vanilla upgrades) as upgrades on JEI. var upgradeItems = RecipeModHelpers.getExtraStacks(); if (!upgradeItems.isEmpty()) { runtime.getIngredientManager().addIngredientsAtRuntime(VanillaTypes.ITEM_STACK, upgradeItems); } // Hide all upgrade recipes var category = registry.createRecipeLookup(RecipeTypes.CRAFTING); category.get().forEach(wrapper -> { if (RecipeModHelpers.shouldRemoveRecipe(wrapper.id())) { registry.hideRecipes(RecipeTypes.CRAFTING, List.of(wrapper)); } }); } /** * Distinguishes turtles by upgrades and family. */ private static final IIngredientSubtypeInterpreter turtleSubtype = (stack, ctx) -> { var name = new StringBuilder("turtle:"); // Add left and right upgrades to the identifier var left = TurtleItem.getUpgrade(stack, TurtleSide.LEFT); var right = TurtleItem.getUpgrade(stack, TurtleSide.RIGHT); if (left != null) name.append(left.getUpgradeID()); if (left != null && right != null) name.append('|'); if (right != null) name.append(right.getUpgradeID()); return name.toString(); }; /** * Distinguishes pocket computers by upgrade and family. */ private static final IIngredientSubtypeInterpreter pocketSubtype = (stack, ctx) -> { var name = new StringBuilder("pocket:"); // Add the upgrade to the identifier var upgrade = PocketComputerItem.getUpgrade(stack); if (upgrade != null) name.append(upgrade.getUpgradeID()); return name.toString(); }; /** * Distinguishes disks by colour. */ private static final IIngredientSubtypeInterpreter diskSubtype = (stack, ctx) -> Integer.toString(DiskItem.getColour(stack)); }