Optimised Decay Curse and Repairing

This commit is contained in:
Auxilor
2020-10-15 19:45:37 +01:00
parent e37c188e03
commit afe5a44e76
2 changed files with 127 additions and 40 deletions

View File

@@ -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<Player> 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);
}
);
}));
}

View File

@@ -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<Player> 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);
}
);
}));
}