diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java index b3179717e..10d657bb0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java @@ -126,18 +126,11 @@ public class UniversalItemFactory extends BukkitItemFactory { @Override protected Optional maxDamage(ItemWrapper item) { -// if (!item.hasTag("CustomFishing", "max_dur")) return Optional.empty(); -// return Optional.of(item.get("CustomFishing", "max_dur")); return Optional.of((int) item.getItem().getType().getMaxDurability()); } @Override protected void maxDamage(ItemWrapper item, Integer damage) { -// if (damage == null) { -// item.remove("CustomFishing", "max_dur"); -// } else { -// item.set(damage, "CustomFishing", "max_dur"); -// } throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java index 370169d20..72918957f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java @@ -780,7 +780,7 @@ public class BukkitRecipeManager implements RecipeManager { unregisterRecipe(key); Reflections.method$CraftRecipe$addToCraftingManager.invoke(Reflections.method$CraftSmithingTransformRecipe$fromBukkitRecipe.invoke(null, transformRecipe)); } catch (Exception e) { - CraftEngine.instance().logger().warn("Failed to convert smelting recipe", e); + CraftEngine.instance().logger().warn("Failed to convert transform recipe", e); } }); this.injectedDataPackRecipes.add(key); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java index bbf3ed9dd..35b3e4060 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -11,12 +11,11 @@ import net.momirealms.craftengine.bukkit.util.ItemUtils; import net.momirealms.craftengine.bukkit.util.LegacyInventoryUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.item.*; -import net.momirealms.craftengine.core.item.recipe.CustomCampfireRecipe; -import net.momirealms.craftengine.core.item.recipe.OptimizedIDItem; import net.momirealms.craftengine.core.item.recipe.Recipe; -import net.momirealms.craftengine.core.item.recipe.RecipeTypes; +import net.momirealms.craftengine.core.item.recipe.*; import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; +import net.momirealms.craftengine.core.item.recipe.input.SmithingInput; import net.momirealms.craftengine.core.plugin.config.ConfigManager; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; @@ -38,6 +37,7 @@ import org.bukkit.event.inventory.*; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.*; import org.bukkit.inventory.view.AnvilView; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -845,6 +845,42 @@ public class RecipeEventListener implements Listener { return; } + ItemStack base = inventory.getInputEquipment(); + ItemStack template = inventory.getInputTemplate(); + ItemStack addition = inventory.getInputMineral(); + SmithingInput input = new SmithingInput<>( + getOptimizedIDItem(base), + getOptimizedIDItem(template), + getOptimizedIDItem(addition) + ); + + Recipe ceRecipe = this.recipeManager.getRecipe(RecipeTypes.SMITHING_TRANSFORM, input); + if (ceRecipe == null) { + event.setResult(null); + return; + } + + Player player; + try { + player = (Player) Reflections.method$InventoryView$getPlayer.invoke(event.getView()); + } catch (ReflectiveOperationException e) { + this.plugin.logger().warn("Failed to get inventory viewer", e); + return; + } + + CustomSmithingTransformRecipe transformRecipe = (CustomSmithingTransformRecipe) ceRecipe; + ItemStack processed = transformRecipe.assemble(new ItemBuildContext(this.plugin.adapt(player), ContextHolder.EMPTY), this.itemManager.wrap(base)); + event.setResult(processed); + } + + private OptimizedIDItem getOptimizedIDItem(@Nullable ItemStack itemStack) { + if (ItemUtils.isEmpty(itemStack)) { + return EMPTY; + } else { + Item wrappedItem = this.itemManager.wrap(itemStack); + Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); + return idHolder.map(keyReference -> new OptimizedIDItem<>(keyReference, itemStack)).orElse(EMPTY); + } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java index c31af1519..ae652add7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java @@ -143,6 +143,7 @@ public class AbstractItem, I> implements Item { this.factory.customName(this.item, displayName); return this; } + @Override public Item itemName(String itemName) { this.factory.itemName(this.item, itemName); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java index 03b619f5d..cda1f1288 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java @@ -25,9 +25,9 @@ public class CustomSmithingTransformRecipe implements Recipe { private final List processors; public CustomSmithingTransformRecipe(Key id, - @Nullable Ingredient addition, @Nullable Ingredient base, @Nullable Ingredient template, + @Nullable Ingredient addition, CustomRecipeResult result, List processors ) { @@ -50,12 +50,12 @@ public class CustomSmithingTransformRecipe implements Recipe { private boolean checkIngredient(Ingredient ingredient, OptimizedIDItem item) { if (ingredient != null) { - if (item == null) { + if (item == null || item.isEmpty()) { return false; } return ingredient.test(item); } else { - return item == null; + return item == null || item.isEmpty(); } } @@ -124,12 +124,12 @@ public class CustomSmithingTransformRecipe implements Recipe { @Override public Recipe create(Key id, Map arguments) { List base = MiscUtils.getAsStringList(arguments.get("base")); - List addition = MiscUtils.getAsStringList(arguments.get("addition")); - List template = MiscUtils.getAsStringList(arguments.get("template")); + List addition = MiscUtils.getAsStringList(arguments.get("addition-input")); + List template = MiscUtils.getAsStringList(arguments.get("template-type")); return new CustomSmithingTransformRecipe<>( id, - toIngredient(addition), toIngredient(base), toIngredient(template), parseResult(arguments), - List.of(new ItemDataProcessor[]{}) + toIngredient(base), toIngredient(template),toIngredient(addition), parseResult(arguments), + List.of(ItemDataProcessor.MERGE_ALL) ); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmithingTransformRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmithingTransformRecipe.java index 5e4713622..6ad75f38e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmithingTransformRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmithingTransformRecipe.java @@ -11,7 +11,7 @@ public class VanillaSmithingTransformRecipe implements VanillaRecipe { private final List template; private final List addition; - public VanillaSmithingTransformRecipe(List addition, List base, List template, RecipeResult result) { + public VanillaSmithingTransformRecipe(List base, List template, List addition, RecipeResult result) { this.result = result; this.base = base; this.template = template;