diff --git a/eco-api/src/main/java/com/willfp/eco/core/recipe/Recipes.java b/eco-api/src/main/java/com/willfp/eco/core/recipe/Recipes.java index d930a23e..258bd12f 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/recipe/Recipes.java +++ b/eco-api/src/main/java/com/willfp/eco/core/recipe/Recipes.java @@ -1,5 +1,7 @@ package com.willfp.eco.core.recipe; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.willfp.eco.core.EcoPlugin; @@ -14,6 +16,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.Optional; /** * Utility class to manage and register crafting recipes. @@ -24,6 +27,13 @@ public final class Recipes { */ private static final BiMap RECIPES = HashBiMap.create(); + /** + * Cached recipes from matrix. + */ + private static final LoadingCache> RECIPES_FROM_MATRIX = Caffeine.newBuilder() + .build( + matrix -> RECIPES.values().stream().filter(recipe -> recipe.test(matrix)).findFirst() + ); /** * Register a recipe. @@ -32,6 +42,7 @@ public final class Recipes { */ public static void register(@NotNull final CraftingRecipe recipe) { RECIPES.forcePut(recipe.getKey(), recipe); + RECIPES_FROM_MATRIX.invalidateAll(); } /** @@ -42,7 +53,7 @@ public final class Recipes { */ @Nullable public static CraftingRecipe getMatch(@NotNull final ItemStack[] matrix) { - return RECIPES.values().stream().filter(recipe -> recipe.test(matrix)).findFirst().orElse(null); + return RECIPES_FROM_MATRIX.get(matrix).orElse(null); } /** diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/recipes/CraftingRecipes.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/recipes/CraftingRecipes.kt index 71bfdc38..d47c9ab4 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/recipes/CraftingRecipes.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/recipes/CraftingRecipes.kt @@ -26,14 +26,12 @@ interface GenericCraftEvent { } class WrappedPrepareItemCraftEvent( - private val event: PrepareItemCraftEvent + private val event: PrepareItemCraftEvent, + override val recipe: Keyed ) : GenericCraftEvent { override val inventory: CraftingInventory get() = event.inventory - override val recipe: Keyed - get() = event.recipe as Keyed - override fun allow(recipe: CraftingRecipe) { this.inventory.result = recipe.output } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/recipes/ShapedRecipeListener.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/recipes/ShapedRecipeListener.kt index 7c2bf477..5e295071 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/recipes/ShapedRecipeListener.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/recipes/ShapedRecipeListener.kt @@ -103,12 +103,21 @@ class ShapedRecipeListener : Listener { @EventHandler fun processListeners(event: PrepareItemCraftEvent) { - if (event.recipe !is Keyed) { + var recipe = event.recipe as? Keyed + + if (recipe == null) { + val ecoRecipe = Recipes.getMatch(event.inventory.matrix) + if (ecoRecipe != null) { + recipe = Keyed { ecoRecipe.key } + } + } + + if (recipe == null) { return } for (listener in listeners) { - listener.handle(WrappedPrepareItemCraftEvent(event)) + listener.handle(WrappedPrepareItemCraftEvent(event, recipe)) } }