From dbee6da9ae7c29490ecbac58c3601bba9f2b2b59 Mon Sep 17 00:00:00 2001 From: Auxilor Date: Sun, 3 Jan 2021 14:30:22 +0000 Subject: [PATCH] Fixed talisman crafting --- .../willfp/talismans/talismans/Talisman.java | 4 +- .../talismans/util/TalismanChecks.java | 6 +- .../talismans/util/TalismanCraftListener.java | 71 +++++++++++++++---- 3 files changed, 64 insertions(+), 17 deletions(-) diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/Talisman.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/Talisman.java index 59dfab2..de4e880 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/Talisman.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/Talisman.java @@ -21,7 +21,6 @@ import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.event.Listener; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.RecipeChoice; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.permissions.Permission; @@ -216,8 +215,7 @@ public abstract class Talisman implements Listener, Watcher { Talisman talisman = Talismans.getByKey(talismanNamespacedKey); Validate.notNull(talisman, "Talisman specified in " + this.getConfigName() + ".yml's recipe is invalid!"); recipeTalismanOverlay[i] = Talismans.getByKey(talismanNamespacedKey); - RecipeChoice.ExactChoice recipeChoice = new RecipeChoice.ExactChoice(talisman.getItemStack()); - recipe.setIngredient(ingredientChar, recipeChoice); + recipe.setIngredient(ingredientChar, Material.PLAYER_HEAD); } else { recipe.setIngredient(ingredientChar, Material.valueOf(recipeStrings.get(i).toUpperCase())); } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanChecks.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanChecks.java index b031aef..d3deecd 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanChecks.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanChecks.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -31,7 +32,7 @@ import java.util.UUID; @UtilityClass public class TalismanChecks { - private static final Map> CACHED_TALISMANS = new HashMap<>(); + private static final Map> CACHED_TALISMANS = Collections.synchronizedMap(new HashMap<>()); private static boolean readEnderChest = true; private static boolean readShulkerBoxes = true; private static final AbstractEcoPlugin PLUGIN = AbstractEcoPlugin.getInstance(); @@ -114,6 +115,9 @@ public class TalismanChecks { } for (ItemStack rawContent : rawContents) { + if (rawContent == null) { + continue; + } if (readShulkerBoxes) { ItemMeta meta = rawContent.getItemMeta(); if (meta instanceof BlockStateMeta) { diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanCraftListener.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanCraftListener.java index e71b03e..837a277 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanCraftListener.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanCraftListener.java @@ -12,7 +12,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ShapedRecipe; import org.jetbrains.annotations.NotNull; -import java.util.Objects; +import java.util.Arrays; public class TalismanCraftListener implements Listener { @EventHandler @@ -74,9 +74,7 @@ public class TalismanCraftListener implements Listener { ShapedRecipe recipe = (ShapedRecipe) event.getRecipe(); - Talisman talisman = Talismans.getByKey(recipe.getKey()); - - if (talisman == null) { + if (!recipe.getKey().getNamespace().equals("talismans")) { return; } @@ -84,9 +82,12 @@ public class TalismanCraftListener implements Listener { return; } + Talisman[] overlay = new Talisman[9]; + for (int i = 0; i < 9; i++) { ItemStack itemStack = event.getInventory().getMatrix()[i]; + if (itemStack == null) { continue; } @@ -97,23 +98,43 @@ public class TalismanCraftListener implements Listener { Talisman matchedTalisman = TalismanChecks.getTalismanOnItem(itemStack); - if (matchedTalisman == null || !Objects.equals(matchedTalisman, talisman.getRecipeTalismanOverlay()[i])) { - event.getInventory().setResult(new ItemStack(Material.AIR)); + if (matchedTalisman == null) { + continue; } + + overlay[i] = matchedTalisman; + } + + boolean empty = true; + for (Talisman overlayTalisman : overlay) { + if (overlayTalisman != null) { + empty = false; + break; + } + } + + if (empty) { + return; + } + + Talisman talisman = Talismans.values().stream().filter(talisman1 -> Arrays.equals(overlay, talisman1.getRecipeTalismanOverlay())).findFirst().orElse(null); + + if (talisman == null) { + event.getInventory().setResult(new ItemStack(Material.AIR)); + } else { + event.getInventory().setResult(talisman.getItemStack()); } } @EventHandler - public void craftTalismanListener(@NotNull final CraftItemEvent event) { + public void prepareCraftTalismanListener(@NotNull final CraftItemEvent event) { if (!(event.getRecipe() instanceof ShapedRecipe)) { return; } ShapedRecipe recipe = (ShapedRecipe) event.getRecipe(); - Talisman talisman = Talismans.getByKey(recipe.getKey()); - - if (talisman == null) { + if (!recipe.getKey().getNamespace().equals("talismans")) { return; } @@ -121,6 +142,8 @@ public class TalismanCraftListener implements Listener { return; } + Talisman[] overlay = new Talisman[9]; + for (int i = 0; i < 9; i++) { ItemStack itemStack = event.getInventory().getMatrix()[i]; @@ -134,10 +157,32 @@ public class TalismanCraftListener implements Listener { Talisman matchedTalisman = TalismanChecks.getTalismanOnItem(itemStack); - if (matchedTalisman == null || !Objects.equals(matchedTalisman, talisman.getRecipeTalismanOverlay()[i])) { - event.getInventory().setResult(new ItemStack(Material.AIR)); - event.setCancelled(true); + if (matchedTalisman == null) { + continue; } + + overlay[i] = matchedTalisman; + } + + boolean empty = true; + for (Talisman overlayTalisman : overlay) { + if (overlayTalisman != null) { + empty = false; + break; + } + } + + if (empty) { + return; + } + + Talisman talisman = Talismans.values().stream().filter(talisman1 -> Arrays.equals(overlay, talisman1.getRecipeTalismanOverlay())).findFirst().orElse(null); + + if (talisman == null) { + event.getInventory().setResult(new ItemStack(Material.AIR)); + event.setCancelled(true); + } else { + event.getInventory().setResult(talisman.getItemStack()); } } }