diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/support/merging/grindstone/GrindstoneListeners.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/support/merging/grindstone/GrindstoneListeners.java index cc3ef010..3bb4278a 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/support/merging/grindstone/GrindstoneListeners.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/support/merging/grindstone/GrindstoneListeners.java @@ -15,9 +15,12 @@ import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.GrindstoneInventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.EnchantmentStorageMeta; +import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; import java.util.HashSet; +import java.util.Map; import java.util.Set; public class GrindstoneListeners extends PluginDependent implements Listener { @@ -51,11 +54,22 @@ public class GrindstoneListeners extends PluginDependent implements L ItemStack top = inventory.getItem(0); ItemStack bottom = inventory.getItem(1); ItemStack out = inventory.getItem(2); - + if (out == null) { return; } + Map merged = GrindstoneMerge.doMerge(top, bottom); + ItemMeta meta = out.getItemMeta(); + for (Enchantment enchantment : merged.keySet()) { + if (meta instanceof EnchantmentStorageMeta storageMeta) { + storageMeta.addStoredEnchant(enchantment, merged.get(enchantment), true); + } else { + meta.addEnchant(enchantment, merged.get(enchantment), true); + } + } + out.setItemMeta(meta); + this.getPlugin().getScheduler().runLater(() -> { if (inventory.getItem(2) != null || event.isCancelled()) return; Set enchants = new HashSet<>(); @@ -65,7 +79,7 @@ public class GrindstoneListeners extends PluginDependent implements L if (bottom != null) { enchants.addAll(bottom.getEnchantments().keySet()); } - enchants.removeIf(enchantment -> !(enchantment instanceof EcoEnchant)); + enchants.removeIf(enchantment -> !(enchantment instanceof EcoEnchant) || merged.containsKey(enchantment)); if (!enchants.isEmpty()) { Location loc = player.getLocation().clone().add( NumberUtils.randFloat(-1, 1), @@ -78,4 +92,39 @@ public class GrindstoneListeners extends PluginDependent implements L }, 1); } + /** + * An additional grindstone listener for isGrindstoneable check. + * + * @param event The event to listen to. + */ + @EventHandler + public void onGrindstoneFix(@NotNull final InventoryClickEvent event) { + Player player = (Player) event.getWhoClicked(); + if (player.getOpenInventory().getTopInventory().getType() != InventoryType.GRINDSTONE) { + return; + } + this.getPlugin().getScheduler().runLater(() -> { + GrindstoneInventory inventory = (GrindstoneInventory) player.getOpenInventory().getTopInventory(); + + ItemStack top = inventory.getItem(0); + ItemStack bottom = inventory.getItem(1); + ItemStack out = inventory.getItem(2); + + if (out == null) { + return; + } + + Map merged = GrindstoneMerge.doMerge(top, bottom); + ItemMeta meta = out.getItemMeta(); + for (Enchantment enchantment : merged.keySet()) { + if (meta instanceof EnchantmentStorageMeta storageMeta) { + storageMeta.addStoredEnchant(enchantment, merged.get(enchantment), true); + } else { + meta.addEnchant(enchantment, merged.get(enchantment), true); + } + } + out.setItemMeta(meta); + }, 1); + } + } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoenchants/data/storage/PlayerProfile.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoenchants/data/storage/PlayerProfile.kt index 6dc28943..1b76f0e5 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoenchants/data/storage/PlayerProfile.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoenchants/data/storage/PlayerProfile.kt @@ -33,7 +33,7 @@ class PlayerProfile private constructor( Type.INT -> data[key] = handler.read(uuid, key, 0) Type.DOUBLE -> data[key] = handler.read(uuid, key, 0.0) Type.STRING -> data[key] = handler.read(uuid, key, "Unknown") - Type.BOOLEAN -> data[key] = handler.read(uuid, key, false) + Type.BOOLEAN -> data[key] = handler.read(uuid, key, true) } } @@ -50,7 +50,7 @@ class PlayerProfile private constructor( Type.INT -> handler.write(uuid, key, profile.read(key, 0)) Type.DOUBLE -> handler.write(uuid, key, profile.read(key, 0.0)) Type.STRING -> handler.write(uuid, key, profile.read(key, "Unknown Value")) - Type.BOOLEAN -> handler.write(uuid, key, profile.read(key, false)) + Type.BOOLEAN -> handler.write(uuid, key, profile.read(key, true)) } } }