9
0
mirror of https://github.com/Auxilor/Reforges.git synced 2025-12-23 00:49:31 +00:00

Recoded WatcherTriggers

This commit is contained in:
Auxilor
2021-10-02 11:27:49 +01:00
parent 4e95eb57ee
commit 27fb8bf093
6 changed files with 204 additions and 119 deletions

View File

@@ -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<UUID, Collection<ItemStack>> CACHE = new WeakHashMap<>();
private static final Map<UUID, Collection<ItemStack>> ITEM_CACHE = new WeakHashMap<>();
/**
* Cached reforges.
*/
private static final Map<UUID, Collection<Reforge>> REFORGE_CACHE = new WeakHashMap<>();
/**
* Instance of Reforges.
@@ -48,17 +55,51 @@ public class ReforgeLookup {
* @return The ItemStacks.
*/
public static Set<ItemStack> 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<ItemStack> found = new HashSet<>();
for (Function<Player, Collection<ItemStack>> 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<Reforge> provideReforges(@NotNull final Player player) {
if (REFORGE_CACHE.containsKey(player.getUniqueId())) {
return new HashSet<>(REFORGE_CACHE.get(player.getUniqueId()));
}
Set<Reforge> 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;
}

View File

@@ -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<Reforge> getReforgesOnPlayer(@NotNull final Player player) {
Set<Reforge> 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.
*

View File

@@ -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.
}
}

View File

@@ -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")
}
}

View File

@@ -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

View File

@@ -1,5 +1,51 @@
{
"reforges": [
{
"id": "acute",
"name": "<gradient:#4776E6>Acute</gradient:#8E54E9>",
"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": "<gradient:#4776E6>Acute</gradient:#8E54E9>",
"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": "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>",