From a9c345317c5afbb8ad35090a2f52d0bc9fce1c0a Mon Sep 17 00:00:00 2001 From: Akiranya Date: Thu, 9 Sep 2021 16:36:57 +0800 Subject: [PATCH 1/3] Fixed Necrotic --- .../ecoenchants/enchantments/ecoenchants/normal/Necrotic.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Necrotic.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Necrotic.java index 8be84217..53e3c73a 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Necrotic.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Necrotic.java @@ -55,6 +55,10 @@ public class Necrotic extends EcoEnchant { return; } + if (!event.getEntity().getMetadata("eco-target").isEmpty()) { + return; + } + ItemStack item = new ItemStack(Material.WITHER_SKELETON_SKULL, 1); new DropQueue(player) From b9cd266d0eaa892391925216831b60b555602dde Mon Sep 17 00:00:00 2001 From: Akiranya Date: Thu, 9 Sep 2021 17:05:49 +0800 Subject: [PATCH 2/3] Fixed Soulbound bug There are some cases where the player's inventory is not empty right after respawning. For example, ItemsAdder gives a death map right after the player respawns. In this case, EcoEnchants won't give back soulbound items to the player, causing the items just disappeared. I fix this by checking if there is any soulbound items right after respawning, instead of simply checking whether the player's inventory is empty or not. More robust logic to handle such case is expected. My solution is just a workaround. --- .../enchantments/ecoenchants/special/Soulbound.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Soulbound.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Soulbound.java index 26ec8e35..6bd59dcb 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Soulbound.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Soulbound.java @@ -5,7 +5,7 @@ import com.willfp.ecoenchants.enchantments.EcoEnchants; import com.willfp.ecoenchants.enchantments.meta.EnchantmentType; import com.willfp.ecoenchants.enchantments.util.EnchantChecks; import com.willfp.ecoenchants.enchantments.util.EnchantmentUtils; -import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -97,9 +97,10 @@ public class Soulbound extends EcoEnchant { player.setMetadata("soulbound-items", this.getPlugin().getMetadataValueFactory().create(soulboundItems)); } - public boolean hasEmptyInventory(@NotNull final Player player) { + public boolean hasSoulboundItems(@NotNull final Player player) { + final NamespacedKey soulbound = this.getPlugin().getNamespacedKeyFactory().create("soulbound"); for (ItemStack itemStack : player.getInventory().getContents()) { - if (itemStack != null && itemStack.getType() != Material.AIR) { + if (itemStack != null && itemStack.getItemMeta().getPersistentDataContainer().has(soulbound, PersistentDataType.INTEGER)) { return false; } } @@ -111,7 +112,7 @@ public class Soulbound extends EcoEnchant { Player player = event.getPlayer(); this.getPlugin().getScheduler().runLater(() -> { - if (!hasEmptyInventory(player)) { + if (!hasSoulboundItems(player)) { return; } @@ -142,6 +143,7 @@ public class Soulbound extends EcoEnchant { @EventHandler(priority = EventPriority.HIGHEST) public void onDeath(@NotNull final PlayerDeathEvent event) { - event.getDrops().removeIf(itemStack -> itemStack.getItemMeta().getPersistentDataContainer().has(this.getPlugin().getNamespacedKeyFactory().create("soulbound"), PersistentDataType.INTEGER)); + final NamespacedKey soulbound = this.getPlugin().getNamespacedKeyFactory().create("soulbound"); + event.getDrops().removeIf(itemStack -> itemStack.getItemMeta().getPersistentDataContainer().has(soulbound, PersistentDataType.INTEGER)); } } From 1f0c9d8a87cbbc347eb81aaebc52b42a021f4b7b Mon Sep 17 00:00:00 2001 From: Akiranya Date: Thu, 9 Sep 2021 17:16:32 +0800 Subject: [PATCH 3/3] BukkitScheduler#runTask() already runs the task on next tick --- .../enchantments/ecoenchants/special/Soulbound.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Soulbound.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Soulbound.java index 6bd59dcb..e816686a 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Soulbound.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Soulbound.java @@ -111,7 +111,7 @@ public class Soulbound extends EcoEnchant { public void onSoulboundRespawn(@NotNull final PlayerRespawnEvent event) { Player player = event.getPlayer(); - this.getPlugin().getScheduler().runLater(() -> { + this.getPlugin().getScheduler().run(() -> { if (!hasSoulboundItems(player)) { return; } @@ -138,7 +138,7 @@ public class Soulbound extends EcoEnchant { } player.removeMetadata("soulbound-items", this.getPlugin()); - }, 1); + }); } @EventHandler(priority = EventPriority.HIGHEST)