diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/curse/DecayCurse.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/curse/DecayCurse.java index cd34eeed..14f7f132 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/curse/DecayCurse.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/curse/DecayCurse.java @@ -7,10 +7,19 @@ import com.willfp.ecoenchants.enchantments.EcoEnchants; import com.willfp.ecoenchants.enchantments.util.EnchantChecks; import com.willfp.ecoenchants.util.DurabilityUtils; import com.willfp.ecoenchants.util.interfaces.EcoRunnable; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDropItemEvent; +import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Repairable; import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + public final class DecayCurse extends EcoEnchant implements EcoRunnable { public DecayCurse() { super( @@ -18,26 +27,61 @@ public final class DecayCurse extends EcoEnchant implements EcoRunnable { ); } + + private final Set players = new HashSet<>(); + private int amount; + + @EventHandler + public void onItemPickup(EntityPickupItemEvent event) { + if(!(event.getEntity() instanceof Player)) + return; + refresh(); + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + refresh(); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) { + refresh(); + } + + @EventHandler + public void onInventoryDrop(EntityDropItemEvent event) { + if(!(event.getEntity() instanceof Player)) + return; + refresh(); + } + + @EventHandler + public void onInventoryClick(InventoryClickEvent event) { + refresh(); + } + + private void refresh() { + players.clear(); + EcoEnchantsPlugin.getInstance().getServer().getOnlinePlayers().forEach(player -> { + if(Arrays.stream(player.getInventory().getContents()).parallel().anyMatch(item -> EnchantChecks.item(item, EcoEnchants.DECAY_CURSE))) + players.add(player); + }); + amount = EcoEnchants.DECAY_CURSE.getConfig().getInt(EcoEnchants.CONFIG_LOCATION + "damage"); + } + @Override public void run() { - EcoEnchantsPlugin.getInstance().getServer().getOnlinePlayers().forEach((player -> { - if(Arrays.stream(player.getInventory().getContents()).parallel().noneMatch(item2 -> EnchantChecks.item(item2, EcoEnchants.DECAY_CURSE))) - return; - - for(ItemStack item : player.getInventory().getContents()) { - if(!EnchantChecks.item(item, EcoEnchants.DECAY_CURSE)) continue; - - if(!(item.getItemMeta() instanceof Repairable)) continue; - - if(player.getInventory().getItemInMainHand().equals(item)) continue; - if(player.getInventory().getItemInOffHand().equals(item)) continue; - if(player.getItemOnCursor().equals(item)) continue; - - - int damage = EcoEnchants.DECAY_CURSE.getConfig().getInt(EcoEnchants.CONFIG_LOCATION + "damage"); - - DurabilityUtils.damageItemNoBreak(item, damage, player); - } + players.forEach((player -> { + Arrays.stream(player.getInventory().getContents()) + .filter(ItemStack::hasItemMeta) + .filter(item -> item.getItemMeta().hasEnchant(EcoEnchants.DECAY_CURSE)) + .filter(item -> player.getInventory().getItemInOffHand().equals(item)) + .filter(item -> player.getInventory().getItemInMainHand().equals(item)) + .filter(item -> player.getItemOnCursor().equals(item)) + .forEach(item -> { + DurabilityUtils.repairItem(item, amount); + } + ); })); } diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Repairing.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Repairing.java index 8941ad34..570480ce 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Repairing.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Repairing.java @@ -7,10 +7,19 @@ import com.willfp.ecoenchants.enchantments.EcoEnchants; import com.willfp.ecoenchants.enchantments.util.EnchantChecks; import com.willfp.ecoenchants.util.DurabilityUtils; import com.willfp.ecoenchants.util.interfaces.EcoRunnable; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDropItemEvent; +import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Repairable; import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + public final class Repairing extends EcoEnchant implements EcoRunnable { public Repairing() { super( @@ -18,28 +27,62 @@ public final class Repairing extends EcoEnchant implements EcoRunnable { ); } + private final Set players = new HashSet<>(); + private int multiplier; + + @EventHandler + public void onItemPickup(EntityPickupItemEvent event) { + if(!(event.getEntity() instanceof Player)) + return; + refresh(); + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + refresh(); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) { + refresh(); + } + + @EventHandler + public void onInventoryDrop(EntityDropItemEvent event) { + if(!(event.getEntity() instanceof Player)) + return; + refresh(); + } + + @EventHandler + public void onInventoryClick(InventoryClickEvent event) { + refresh(); + } + + private void refresh() { + players.clear(); + EcoEnchantsPlugin.getInstance().getServer().getOnlinePlayers().forEach(player -> { + if(Arrays.stream(player.getInventory().getContents()).parallel().anyMatch(item -> EnchantChecks.item(item, EcoEnchants.REPAIRING))) + players.add(player); + }); + multiplier = EcoEnchants.REPAIRING.getConfig().getInt(EcoEnchants.CONFIG_LOCATION + "multiplier"); + } + @Override public void run() { - EcoEnchantsPlugin.getInstance().getServer().getOnlinePlayers().parallelStream().forEach((player -> { - if(Arrays.stream(player.getInventory().getContents()).parallel().noneMatch(item2 -> EnchantChecks.item(item2, EcoEnchants.REPAIRING))) - return; - - for(ItemStack item : player.getInventory().getContents()) { - if(!EnchantChecks.item(item, EcoEnchants.REPAIRING)) continue; - - if(!(item.getItemMeta() instanceof Repairable)) continue; - - if(player.getInventory().getItemInMainHand().equals(item)) continue; - if(player.getInventory().getItemInOffHand().equals(item)) continue; - if(player.getItemOnCursor().equals(item)) continue; - - - int level = EnchantChecks.getItemLevel(item, EcoEnchants.REPAIRING); - int multiplier = EcoEnchants.REPAIRING.getConfig().getInt(EcoEnchants.CONFIG_LOCATION + "multiplier"); - int repairAmount = level * multiplier; - - DurabilityUtils.repairItem(item, repairAmount); - } + players.forEach((player -> { + Arrays.stream(player.getInventory().getContents()) + .filter(ItemStack::hasItemMeta) + .filter(item -> item.getItemMeta().hasEnchant(EcoEnchants.REPAIRING)) + .filter(item -> player.getInventory().getItemInOffHand().equals(item)) + .filter(item -> player.getInventory().getItemInMainHand().equals(item)) + .filter(item -> player.getItemOnCursor().equals(item)) + .forEach(item -> { + int level = EnchantChecks.getItemLevel(item, EcoEnchants.REPAIRING); + int repairAmount = level * multiplier; + DurabilityUtils.repairItem(item, repairAmount); + } + ); })); }