diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/EcoArmorPlugin.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/EcoArmorPlugin.java index fb6f3f7..c716692 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/EcoArmorPlugin.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/EcoArmorPlugin.java @@ -14,6 +14,7 @@ import com.willfp.ecoarmor.display.packets.PacketSetSlot; import com.willfp.ecoarmor.display.packets.PacketWindowItems; import com.willfp.ecoarmor.effects.Effects; import com.willfp.ecoarmor.sets.ArmorSets; +import com.willfp.ecoarmor.sets.util.EffectiveDurabilityListener; import com.willfp.ecoarmor.upgrades.advanced.AdvancementShardListener; import com.willfp.ecoarmor.upgrades.crystal.CrystalListener; import com.willfp.ecoarmor.upgrades.crystal.UpgradeCrystal; @@ -128,7 +129,8 @@ public class EcoArmorPlugin extends AbstractEcoPlugin { public List getListeners() { return Arrays.asList( new CrystalListener(this), - new AdvancementShardListener(this) + new AdvancementShardListener(this), + new EffectiveDurabilityListener(this) ); } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/ArmorSet.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/ArmorSet.java index 5b3466f..5ff4ca1 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/ArmorSet.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/ArmorSet.java @@ -207,6 +207,7 @@ public class ArmorSet { PersistentDataContainer container = meta.getPersistentDataContainer(); container.set(PLUGIN.getNamespacedKeyFactory().create("set"), PersistentDataType.STRING, name); container.set(PLUGIN.getNamespacedKeyFactory().create("tier"), PersistentDataType.STRING, "default"); + container.set(PLUGIN.getNamespacedKeyFactory().create("effective-durability"), PersistentDataType.INTEGER, EcoArmorConfigs.SETS.getInt(name + "." + pieceName + ".effective-durability")); if (advanced) { container.set(PLUGIN.getNamespacedKeyFactory().create("advanced"), PersistentDataType.INTEGER, 1); } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/util/EffectiveDurabilityListener.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/util/EffectiveDurabilityListener.java new file mode 100644 index 0000000..f67002a --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/util/EffectiveDurabilityListener.java @@ -0,0 +1,57 @@ +package com.willfp.ecoarmor.sets.util; + +import com.willfp.eco.util.NumberUtils; +import com.willfp.eco.util.internal.PluginDependent; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerItemDamageEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; + +public class EffectiveDurabilityListener extends PluginDependent implements Listener { + /** + * Create new effective durability listeners. + * + * @param plugin The plugin. + */ + public EffectiveDurabilityListener(@NotNull final AbstractEcoPlugin plugin) { + super(plugin); + } + + /** + * Make durability act as effective. + * + * @param event The event to listen for. + */ + @EventHandler + public void onDamage(@NotNull final PlayerItemDamageEvent event) { + ItemStack itemStack = event.getItem(); + ItemMeta meta = itemStack.getItemMeta(); + + if (meta == null) { + return; + } + + PersistentDataContainer container = meta.getPersistentDataContainer(); + + Integer effectiveDurability = container.get(this.getPlugin().getNamespacedKeyFactory().create("effective-durability"), PersistentDataType.INTEGER); + + if (effectiveDurability == null) { + return; + } + + int maxDurability = itemStack.getType().getMaxDurability(); + + double ratio = (double) effectiveDurability / maxDurability; + + double chance = 1 / ratio; + + if (NumberUtils.randFloat(0, 1) > chance) { + event.setCancelled(true); + } + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/upgrades/crystal/CrystalListener.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/upgrades/crystal/CrystalListener.java index e38a519..17e827f 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/upgrades/crystal/CrystalListener.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/upgrades/crystal/CrystalListener.java @@ -7,6 +7,7 @@ import com.willfp.ecoarmor.sets.util.ArmorUtils; import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -69,4 +70,21 @@ public class CrystalListener extends PluginDependent implements Listener { event.setCancelled(true); } + + /** + * Prevents placing upgrade crystals. + * + * @param event The event to listen for. + */ + @EventHandler + public void onPlaceCrystal(@NotNull final BlockPlaceEvent event) { + ItemStack item = event.getItemInHand(); + if (item.getType() != Material.END_CRYSTAL) { + return; + } + + if (ArmorUtils.getCrystalTier(item) != null) { + event.setCancelled(true); + } + } } diff --git a/eco-core/core-plugin/src/main/resources/sets.yml b/eco-core/core-plugin/src/main/resources/sets.yml index 62a1a4e..4b237c2 100644 --- a/eco-core/core-plugin/src/main/resources/sets.yml +++ b/eco-core/core-plugin/src/main/resources/sets.yml @@ -33,6 +33,7 @@ Reaper: leather-color: "#303030" name: "&cReaper Helmet" advanced-name: "<\$#f12711>Advanced<\$#f5af19>&c Reaper Helmet" + effective-durability: 2048 lore: - "&c&lREAPER SET BONUS" - "&8» &cDeal 25% more damage" @@ -60,6 +61,7 @@ Reaper: leather-color: "#303030" name: "&cReaper Chestplate" advanced-name: "<\$#f12711>Advanced<\$#f5af19>&c Reaper Chestplate" + effective-durability: 2048 lore: - "&c&lREAPER SET BONUS" - "&8» &cDeal 25% more damage" @@ -86,6 +88,7 @@ Reaper: material: elytra name: "&cReaper Elytra" advanced-name: "<\$#f12711>Advanced<\$#f5af19>&c Reaper Elytra" + effective-durability: 2048 lore: - "&c&lREAPER SET BONUS" - "&8» &cDeal 25% more damage" @@ -113,6 +116,7 @@ Reaper: leather-color: "#303030" name: "&cReaper Leggings" advanced-name: "<\$#f12711>Advanced<\$#f5af19>&c Reaper Leggings" + effective-durability: 2048 lore: - "&c&lREAPER SET BONUS" - "&8» &cDeal 25% more damage" @@ -140,6 +144,7 @@ Reaper: leather-color: "#303030" name: "&cReaper Boots" advanced-name: "<\$#f12711>Advanced<\$#f5af19>&c Reaper Boots" + effective-durability: 2048 lore: - "&c&lREAPER SET BONUS" - "&8» &cDeal 25% more damage" diff --git a/eco-core/core-plugin/src/main/resources/tiers.yml b/eco-core/core-plugin/src/main/resources/tiers.yml index dac9c3a..f3a8ebd 100644 --- a/eco-core/core-plugin/src/main/resources/tiers.yml +++ b/eco-core/core-plugin/src/main/resources/tiers.yml @@ -100,15 +100,15 @@ netherite: crystal-name: "&cNetherite Upgrade Crystal" crystal-recipe: - air - - netherite_block + - netherite_ingot - air - - netherite_block + - netherite_ingot - ecoarmor:upgrade_crystal_diamond - - netherite_block + - netherite_ingot - air - - netherite_block + - netherite_ingot - air crystal-lore: - "&8Drop this onto an armor piece"