diff --git a/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/ReforgeLookup.java b/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/ReforgeLookup.java index c60a63c..87a7eb8 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/ReforgeLookup.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/ReforgeLookup.java @@ -2,6 +2,7 @@ package com.willfp.reforges.reforges; import com.willfp.eco.core.EcoPlugin; import com.willfp.reforges.ReforgesPlugin; +import com.willfp.reforges.reforges.util.ReforgeUtils; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -11,6 +12,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.WeakHashMap; @@ -25,7 +27,12 @@ public class ReforgeLookup { /** * Cached items. */ - private static final Map> CACHE = new WeakHashMap<>(); + private static final Map> ITEM_CACHE = new WeakHashMap<>(); + + /** + * Cached reforges. + */ + private static final Map> REFORGE_CACHE = new WeakHashMap<>(); /** * Instance of Reforges. @@ -48,17 +55,51 @@ public class ReforgeLookup { * @return The ItemStacks. */ public static Set provide(@NotNull final Player player) { - if (CACHE.containsKey(player.getUniqueId())) { - return new HashSet<>(CACHE.get(player.getUniqueId())); + if (ITEM_CACHE.containsKey(player.getUniqueId())) { + return new HashSet<>(ITEM_CACHE.get(player.getUniqueId())); } Set found = new HashSet<>(); for (Function> provider : PROVIDERS) { found.addAll(provider.apply(player)); } + found.removeIf(Objects::isNull); - CACHE.put(player.getUniqueId(), found); - PLUGIN.getScheduler().runLater(() -> CACHE.remove(player.getUniqueId()), 40); + ITEM_CACHE.put(player.getUniqueId(), found); + PLUGIN.getScheduler().runLater(() -> ITEM_CACHE.remove(player.getUniqueId()), 40); + + return found; + } + + /** + * Provide Reforges. + * + * @param player The player. + * @return The Reforges. + */ + public static Set provideReforges(@NotNull final Player player) { + if (REFORGE_CACHE.containsKey(player.getUniqueId())) { + return new HashSet<>(REFORGE_CACHE.get(player.getUniqueId())); + } + + Set found = new HashSet<>(); + + for (ItemStack itemStack : provide(player)) { + if (itemStack == null) { + continue; + } + + Reforge reforge = ReforgeUtils.getReforge(itemStack); + + if (reforge == null) { + continue; + } + + found.add(reforge); + } + + REFORGE_CACHE.put(player.getUniqueId(), found); + PLUGIN.getScheduler().runLater(() -> REFORGE_CACHE.remove(player.getUniqueId()), 40); return found; } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/ReforgeUtils.java b/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/ReforgeUtils.java index 59a2016..69732d9 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/ReforgeUtils.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/ReforgeUtils.java @@ -3,13 +3,11 @@ package com.willfp.reforges.reforges.util; import com.willfp.eco.core.EcoPlugin; import com.willfp.reforges.ReforgesPlugin; import com.willfp.reforges.reforges.Reforge; -import com.willfp.reforges.reforges.ReforgeLookup; import com.willfp.reforges.reforges.Reforges; import com.willfp.reforges.reforges.meta.ReforgeTarget; import lombok.experimental.UtilityClass; import org.bukkit.Material; import org.bukkit.NamespacedKey; -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; @@ -20,9 +18,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.HashSet; import java.util.List; -import java.util.Set; @UtilityClass public class ReforgeUtils { @@ -101,32 +97,6 @@ public class ReforgeUtils { return status; } - /** - * Get reforges on a player. - * - * @param player The player. - * @return The reforges. - */ - public static Set getReforgesOnPlayer(@NotNull final Player player) { - Set found = new HashSet<>(); - - for (ItemStack itemStack : ReforgeLookup.provide(player)) { - if (itemStack == null) { - continue; - } - - Reforge reforge = getReforge(itemStack); - - if (reforge == null) { - continue; - } - - found.add(reforge); - } - - return found; - } - /** * Get reforge on an item. * diff --git a/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/Watcher.java b/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/Watcher.java index 8c4a51a..a17118e 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/Watcher.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/Watcher.java @@ -13,6 +13,7 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.player.PlayerItemDamageEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.jetbrains.annotations.NotNull; @@ -194,4 +195,15 @@ public interface Watcher { @NotNull final JSONConfig config) { // Empty default as effects only override required watchers. } + + /** + * Called when an item takes durability damage. + * + * @param event The event that called this watcher. + * @param config The effect config. + */ + default void onDurabilityDamage(@NotNull final PlayerItemDamageEvent event, + @NotNull final JSONConfig config) { + // Empty default as effects only override required watchers. + } } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectDurabilityMultiplier.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectDurabilityMultiplier.kt new file mode 100644 index 0000000..2154a87 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectDurabilityMultiplier.kt @@ -0,0 +1,14 @@ +package com.willfp.reforges.effects.effects + +import com.willfp.eco.core.config.interfaces.JSONConfig +import com.willfp.reforges.effects.Effect +import org.bukkit.event.player.PlayerItemDamageEvent + +class EffectDurabilityMultiplier : Effect("damage_multiplier") { + override fun onDurabilityDamage( + event: PlayerItemDamageEvent, + config: JSONConfig + ) { + val multiplier = config.getDouble("multiplier") + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/util/WatcherTriggers.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/util/WatcherTriggers.kt index 7fd7f86..572117c 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/util/WatcherTriggers.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/util/WatcherTriggers.kt @@ -5,8 +5,8 @@ import com.willfp.eco.core.events.EntityDeathByEntityEvent import com.willfp.eco.core.events.PlayerJumpEvent import com.willfp.eco.core.integrations.antigrief.AntigriefManager import com.willfp.eco.core.integrations.mcmmo.McmmoManager -import com.willfp.eco.util.ArrowUtils import com.willfp.eco.util.NumberUtils +import com.willfp.reforges.reforges.ReforgeLookup import org.bukkit.entity.* import org.bukkit.event.EventHandler import org.bukkit.event.Listener @@ -15,6 +15,7 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent import org.bukkit.event.entity.EntityDamageEvent import org.bukkit.event.entity.ProjectileHitEvent import org.bukkit.event.entity.ProjectileLaunchEvent +import org.bukkit.event.player.PlayerItemDamageEvent class WatcherTriggers( private val plugin: EcoPlugin @@ -30,13 +31,14 @@ class WatcherTriggers( if (!AntigriefManager.canBreakBlock(player, block)) { return } - val itemStack = player.inventory.itemInMainHand - val reforge = ReforgeUtils.getReforge(itemStack) ?: return - for ((key, value) in reforge.effects) { - if (NumberUtils.randFloat(0.0, 100.0) > value.getDoubleOrNull("chance") ?: 100.0) { - continue + + for (reforge in ReforgeLookup.provideReforges(player)) { + for ((key, value) in reforge.effects) { + if (NumberUtils.randFloat(0.0, 100.0) > value.getDoubleOrNull("chance") ?: 100.0) { + continue + } + key.onBlockBreak(player, block, event, value) } - key.onBlockBreak(player, block, event, value) } } @@ -59,11 +61,11 @@ class WatcherTriggers( val shooter = arrow.shooter - if (shooter !is LivingEntity) { + if (shooter !is Player) { return } - if (shooter is Player && !AntigriefManager.canInjure(shooter, victim)) { + if (!AntigriefManager.canInjure(shooter, victim)) { return } @@ -71,16 +73,14 @@ class WatcherTriggers( return } - val bow = ArrowUtils.getBow(arrow) ?: return - - val reforge = ReforgeUtils.getReforge(bow) ?: return - - for ((effect, config) in reforge.effects) { - if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { - continue + for (reforge in ReforgeLookup.provideReforges(shooter)) { + for ((effect, config) in reforge.effects) { + if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { + continue + } + effect.onArrowDamage(shooter, victim, arrow, event, config) + effect.onAnyDamage(shooter, victim, event, config) } - effect.onArrowDamage(shooter, victim, arrow, event, config) - effect.onAnyDamage(shooter, victim, event, config) } } @@ -103,13 +103,13 @@ class WatcherTriggers( val shooter = trident.shooter - if (shooter !is LivingEntity) { + if (shooter !is Player) { return } val item = trident.item - if (shooter is Player && !AntigriefManager.canInjure(shooter, victim)) { + if (!AntigriefManager.canInjure(shooter, victim)) { return } @@ -117,14 +117,17 @@ class WatcherTriggers( return } - val reforge = ReforgeUtils.getReforge(item) ?: return + val tridentReforge = ReforgeUtils.getReforge(item) + val add = if (tridentReforge == null) emptyList() else listOf(tridentReforge) - for ((effect, config) in reforge.effects) { - if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { - continue + for (reforge in ReforgeLookup.provideReforges(shooter) union add) { + for ((effect, config) in reforge.effects) { + if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { + continue + } + effect.onTridentDamage(shooter, victim, trident, event, config) + effect.onAnyDamage(shooter, victim, event, config) } - effect.onTridentDamage(shooter, victim, trident, event, config) - effect.onAnyDamage(shooter, victim, event, config) } } @@ -134,8 +137,8 @@ class WatcherTriggers( return } val player = event.player - for (itemStack in player.inventory.armorContents) { - val reforge = ReforgeUtils.getReforge(itemStack) ?: continue + + for (reforge in ReforgeLookup.provideReforges(player)) { for ((effect, config) in reforge.effects) { if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { continue @@ -153,7 +156,7 @@ class WatcherTriggers( val attacker = event.damager - if (attacker !is LivingEntity) { + if (attacker !is Player) { return } @@ -171,20 +174,18 @@ class WatcherTriggers( return } - if (attacker is Player && !AntigriefManager.canInjure(attacker, victim)) { + if (!AntigriefManager.canInjure(attacker, victim)) { return } - val equipment = attacker.equipment ?: return - - val reforge = ReforgeUtils.getReforge(equipment.itemInMainHand) ?: return - - for ((effect, config) in reforge.effects) { - if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { - continue + for (reforge in ReforgeLookup.provideReforges(attacker)) { + for ((effect, config) in reforge.effects) { + if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { + continue + } + effect.onMeleeAttack(attacker, victim, event, config) + effect.onAnyDamage(attacker, victim, event, config) } - effect.onMeleeAttack(attacker, victim, event, config) - effect.onAnyDamage(attacker, victim, event, config) } } @@ -195,33 +196,35 @@ class WatcherTriggers( } var killer: Any? = null - if (event.killer is LivingEntity) { + if (event.killer is Player) { killer = event.killer } else if (event.killer is Projectile) { - if ((event.killer as Projectile).shooter is LivingEntity) { + if ((event.killer as Projectile).shooter is Player) { killer = (event.killer as Projectile).shooter } } - if (killer !is LivingEntity) { + if (killer !is Player) { return } val victim = event.victim - if (killer is Player && !AntigriefManager.canInjure(killer, victim)) { + if (!AntigriefManager.canInjure(killer, victim)) { return } - val equipment = killer.equipment ?: return + val trident = if (event.killer is Trident) (event.killer as Trident).item else null + val tridentReforge = if (trident == null) null else ReforgeUtils.getReforge(trident) + val add = if (tridentReforge == null) emptyList() else listOf(tridentReforge) - val reforge = ReforgeUtils.getReforge(equipment.itemInMainHand) ?: return - - for ((effect, config) in reforge.effects) { - if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { - continue + for (reforge in ReforgeLookup.provideReforges(killer) union add) { + for ((effect, config) in reforge.effects) { + if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { + continue + } + effect.onKill(killer, victim, event, config) } - effect.onKill(killer, victim, event, config) } } @@ -233,25 +236,17 @@ class WatcherTriggers( val shooter = event.entity.shooter - if (shooter !is LivingEntity) { + if (shooter !is Player) { return } - val equipment = shooter.equipment ?: return - - var item = equipment.itemInMainHand - - if (event.entity is Trident) { - item = (event.entity as Trident).item - } - - val reforge = ReforgeUtils.getReforge(item) ?: return - - for ((effect, config) in reforge.effects) { - if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { - continue + for (reforge in ReforgeLookup.provideReforges(shooter)) { + for ((effect, config) in reforge.effects) { + if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { + continue + } + effect.onProjectileLaunch(shooter, event.entity, event, config) } - effect.onProjectileLaunch(shooter, event.entity, event, config) } } @@ -267,15 +262,11 @@ class WatcherTriggers( val victim = event.entity - if (victim !is LivingEntity) { + if (victim !is Player) { return } - val equipment = victim.equipment ?: return - - for (itemStack in equipment.armorContents) { - val reforge = ReforgeUtils.getReforge(itemStack) ?: continue - + for (reforge in ReforgeLookup.provideReforges(victim)) { for ((effect, config) in reforge.effects) { if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { continue @@ -294,23 +285,38 @@ class WatcherTriggers( val projectile = event.entity val shooter = projectile.shooter - if (shooter !is LivingEntity) { + if (shooter !is Player) { return } - val item = when (projectile) { - is Arrow -> ArrowUtils.getBow(projectile) - is Trident -> projectile.item - else -> null - } ?: return + val trident = if (projectile is Trident) projectile.item else null + val tridentReforge = if (trident == null) null else ReforgeUtils.getReforge(trident) + val add = if (tridentReforge == null) emptyList() else listOf(tridentReforge) + for (reforge in ReforgeLookup.provideReforges(shooter) union add) { + for ((effect, config) in reforge.effects) { + if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { + continue + } + effect.onProjectileHit(shooter, event, config) + } + } + } + + @EventHandler(ignoreCancelled = true) + fun onDurabilityDamage(event: PlayerItemDamageEvent) { + if (McmmoManager.isFake(event)) { + return + } + + val item = event.item val reforge = ReforgeUtils.getReforge(item) ?: return for ((effect, config) in reforge.effects) { if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { continue } - effect.onProjectileHit(shooter, event, config) + effect.onDurabilityDamage(event, config) } } @@ -322,15 +328,11 @@ class WatcherTriggers( val victim = event.entity - if (victim !is LivingEntity) { + if (victim !is Player) { return } - val equipment = victim.equipment ?: return - - for (itemStack in equipment.armorContents) { - val reforge = ReforgeUtils.getReforge(itemStack) ?: continue - + for (reforge in ReforgeLookup.provideReforges(victim)) { for ((effect, config) in reforge.effects) { if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) { continue diff --git a/eco-core/core-plugin/src/main/resources/reforges.json b/eco-core/core-plugin/src/main/resources/reforges.json index 27133b5..38e9c46 100644 --- a/eco-core/core-plugin/src/main/resources/reforges.json +++ b/eco-core/core-plugin/src/main/resources/reforges.json @@ -1,5 +1,51 @@ { "reforges": [ + { + "id": "acute", + "name": "Acute", + "description": [ + "&a+2% &fTriple Damage Chance" + ], + "targets": [ + "axe" + ], + "stone": { + "enabled": false, + "texture": "", + "craftable": false, + "recipe": [] + }, + "effects": [ + { + "id": "damage_multiplier", + "multiplier": 3, + "chance": 2 + } + ] + }, + { + "id": "acute", + "name": "Acute", + "description": [ + "&a+2% &fTriple Damage Chance" + ], + "targets": [ + "axe" + ], + "stone": { + "enabled": false, + "texture": "", + "craftable": false, + "recipe": [] + }, + "effects": [ + { + "id": "damage_multiplier", + "multiplier": 3, + "chance": 2 + } + ] + }, { "id": "dynamic", "name": "Dynamic",