mirror of
https://github.com/Auxilor/Reforges.git
synced 2025-12-23 00:49:31 +00:00
Recoded WatcherTriggers
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
@@ -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,8 +31,8 @@ class WatcherTriggers(
|
||||
if (!AntigriefManager.canBreakBlock(player, block)) {
|
||||
return
|
||||
}
|
||||
val itemStack = player.inventory.itemInMainHand
|
||||
val reforge = ReforgeUtils.getReforge(itemStack) ?: return
|
||||
|
||||
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
|
||||
@@ -39,6 +40,7 @@ class WatcherTriggers(
|
||||
key.onBlockBreak(player, block, event, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
fun onArrowDamage(event: EntityDamageByEntityEvent) {
|
||||
@@ -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,10 +73,7 @@ class WatcherTriggers(
|
||||
return
|
||||
}
|
||||
|
||||
val bow = ArrowUtils.getBow(arrow) ?: return
|
||||
|
||||
val reforge = ReforgeUtils.getReforge(bow) ?: return
|
||||
|
||||
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
|
||||
@@ -83,6 +82,7 @@ class WatcherTriggers(
|
||||
effect.onAnyDamage(shooter, victim, event, config)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
fun onTridentDamage(event: EntityDamageByEntityEvent) {
|
||||
@@ -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,8 +117,10 @@ class WatcherTriggers(
|
||||
return
|
||||
}
|
||||
|
||||
val reforge = ReforgeUtils.getReforge(item) ?: return
|
||||
val tridentReforge = ReforgeUtils.getReforge(item)
|
||||
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
|
||||
@@ -127,6 +129,7 @@ class WatcherTriggers(
|
||||
effect.onAnyDamage(shooter, victim, event, config)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
fun onJump(event: PlayerJumpEvent) {
|
||||
@@ -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,14 +174,11 @@ 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 (reforge in ReforgeLookup.provideReforges(attacker)) {
|
||||
for ((effect, config) in reforge.effects) {
|
||||
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
|
||||
continue
|
||||
@@ -187,6 +187,7 @@ class WatcherTriggers(
|
||||
effect.onAnyDamage(attacker, victim, event, config)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
fun onKill(event: EntityDeathByEntityEvent) {
|
||||
@@ -195,28 +196,29 @@ 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 reforge = ReforgeUtils.getReforge(equipment.itemInMainHand) ?: 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)
|
||||
|
||||
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
|
||||
@@ -224,6 +226,7 @@ class WatcherTriggers(
|
||||
effect.onKill(killer, victim, event, config)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
fun onProjectileLaunch(event: ProjectileLaunchEvent) {
|
||||
@@ -233,20 +236,11 @@ 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 (reforge in ReforgeLookup.provideReforges(shooter)) {
|
||||
for ((effect, config) in reforge.effects) {
|
||||
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
|
||||
continue
|
||||
@@ -254,6 +248,7 @@ class WatcherTriggers(
|
||||
effect.onProjectileLaunch(shooter, event.entity, event, config)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
fun onFallDamage(event: EntityDamageEvent) {
|
||||
@@ -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
|
||||
|
||||
@@ -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>",
|
||||
|
||||
Reference in New Issue
Block a user