From 561e1ef42813aa96fd7e0f348548af377939ea8b Mon Sep 17 00:00:00 2001 From: Auxilor Date: Mon, 4 Oct 2021 10:22:46 +0100 Subject: [PATCH] Reworked most of the internals to stop using AttributeModifiers --- .../com/willfp/reforges/ReforgesPlugin.java | 14 +- .../com/willfp/reforges/config/TargetYml.java | 13 +- .../com/willfp/reforges/effects/Effect.java | 14 +- .../reforges/reforges/ReforgeLookup.java | 71 +++++++--- .../reforges/reforges/meta/ReforgeTarget.java | 26 +++- .../reforges/reforges/util/ReforgeUtils.java | 8 -- .../util/equip/ReforgeEnableListeners.java | 123 +++++++++++++++++ .../util/equip/SyncReforgeEnableTask.java | 29 ++++ .../effects/EffectAttackSpeedMultiplier.kt | 21 ++- .../effects/EffectKnockbackMultiplier.kt | 21 ++- .../effects/EffectMovementSpeedMultiplier.kt | 21 ++- .../com/willfp/reforges/reforges/Reforge.kt | 23 +--- .../core-plugin/src/main/resources/target.yml | 125 ++++++++++-------- 13 files changed, 364 insertions(+), 145 deletions(-) create mode 100644 eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/equip/ReforgeEnableListeners.java create mode 100644 eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/equip/SyncReforgeEnableTask.java diff --git a/eco-core/core-plugin/src/main/java/com/willfp/reforges/ReforgesPlugin.java b/eco-core/core-plugin/src/main/java/com/willfp/reforges/ReforgesPlugin.java index 2082f57..6494f5c 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/reforges/ReforgesPlugin.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/reforges/ReforgesPlugin.java @@ -15,10 +15,14 @@ import com.willfp.reforges.effects.Effects; import com.willfp.reforges.reforges.Reforges; import com.willfp.reforges.reforges.util.ReforgeArgParser; import com.willfp.reforges.reforges.util.WatcherTriggers; +import com.willfp.reforges.reforges.util.equip.ReforgeEnableListeners; +import com.willfp.reforges.reforges.util.equip.SyncReforgeEnableTask; import com.willfp.reforges.util.AntiPlaceListener; import com.willfp.reforges.util.DiscoverRecipeListener; import com.willfp.reforges.vault.EconomyHandler; import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.jetbrains.annotations.Nullable; @@ -76,6 +80,11 @@ public class ReforgesPlugin extends EcoPlugin { } this.getLogger().info(Reforges.values().size() + " Reforges Loaded"); this.getScheduler().runTimer((Runnable) Conditions.HAS_PERMISSION, 103, 100); + this.getScheduler().runTimer(() -> { + for (Player player : Bukkit.getOnlinePlayers()) { + SyncReforgeEnableTask.CHECK.accept(player); + } + }, 81, 81); } @Override @@ -83,7 +92,8 @@ public class ReforgesPlugin extends EcoPlugin { return Arrays.asList( new DiscoverRecipeListener(this), new AntiPlaceListener(), - new WatcherTriggers(this) + new WatcherTriggers(this), + new ReforgeEnableListeners(this) ); } @@ -102,7 +112,7 @@ public class ReforgesPlugin extends EcoPlugin { @Override public String getMinimumEcoVersion() { - return "6.8.0"; + return "6.9.0"; } /** diff --git a/eco-core/core-plugin/src/main/java/com/willfp/reforges/config/TargetYml.java b/eco-core/core-plugin/src/main/java/com/willfp/reforges/config/TargetYml.java index c55f5bf..00873f2 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/reforges/config/TargetYml.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/reforges/config/TargetYml.java @@ -4,6 +4,7 @@ import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.config.yaml.YamlBaseConfig; import com.willfp.eco.core.items.Items; import com.willfp.eco.core.items.TestableItem; +import com.willfp.reforges.reforges.meta.ReforgeTarget; import org.jetbrains.annotations.NotNull; import java.util.HashSet; @@ -37,7 +38,17 @@ public class TargetYml extends YamlBaseConfig { */ public Set getTargetItems(@NotNull final String target) { Set items = new HashSet<>(); - this.getStrings(target, false).forEach(s -> items.add(Items.lookup(s.toUpperCase()))); + this.getStrings(target + ".items", false).forEach(s -> items.add(Items.lookup(s.toUpperCase()))); return items; } + + /** + * Get all materials from a target name. + * + * @param target The name of the target. + * @return All materials. + */ + public ReforgeTarget.Slot getSlot(@NotNull final String target) { + return ReforgeTarget.Slot.valueOf(this.getString(target + ".slot").toUpperCase()); + } } \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/java/com/willfp/reforges/effects/Effect.java b/eco-core/core-plugin/src/main/java/com/willfp/reforges/effects/Effect.java index 8a940a3..cdcd8d8 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/reforges/effects/Effect.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/reforges/effects/Effect.java @@ -5,8 +5,8 @@ import com.willfp.reforges.ReforgesPlugin; import com.willfp.reforges.reforges.util.Watcher; import lombok.AccessLevel; import lombok.Getter; +import org.bukkit.entity.Player; import org.bukkit.event.Listener; -import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; import java.util.Arrays; @@ -59,21 +59,21 @@ public abstract class Effect implements Listener, Watcher { /** * Handle application of a reforge containing this effect. * - * @param meta The ItemMeta. + * @param player The player. * @param config The config. */ - public void handleEnabling(@NotNull final ItemMeta meta, + public void handleEnabling(@NotNull final Player player, @NotNull final JSONConfig config) { - // Override when needed + // Override when needed. } /** * Handle removal of a reforge containing this effect. * - * @param meta The ItemMeta. + * @param player The player. */ - public void handleDisabling(@NotNull final ItemMeta meta) { - // Override when needed + public void handleDisabling(@NotNull final Player player) { + // Override when needed. } @Override 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 87a7eb8..227ea55 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,32 +2,35 @@ package com.willfp.reforges.reforges; import com.willfp.eco.core.EcoPlugin; import com.willfp.reforges.ReforgesPlugin; +import com.willfp.reforges.reforges.meta.ReforgeTarget; import com.willfp.reforges.reforges.util.ReforgeUtils; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; -import java.util.Arrays; +import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.WeakHashMap; import java.util.function.Function; +import java.util.stream.Collectors; public class ReforgeLookup { /** * All registered providers. */ - private static final Set>> PROVIDERS = new HashSet<>(); + private static final Set>> PROVIDERS = new HashSet<>(); /** * Cached items. */ - private static final Map> ITEM_CACHE = new WeakHashMap<>(); + private static final Map> ITEM_CACHE = new WeakHashMap<>(); /** * Cached reforges. @@ -44,7 +47,7 @@ public class ReforgeLookup { * * @param provider The provider. */ - public static void registerProvider(@NotNull final Function> provider) { + public static void registerProvider(@NotNull final Function> provider) { PROVIDERS.add(provider); } @@ -54,16 +57,16 @@ public class ReforgeLookup { * @param player The player. * @return The ItemStacks. */ - public static Set provide(@NotNull final Player player) { + public static Map provide(@NotNull final Player player) { if (ITEM_CACHE.containsKey(player.getUniqueId())) { - return new HashSet<>(ITEM_CACHE.get(player.getUniqueId())); + return new HashMap<>(ITEM_CACHE.get(player.getUniqueId())); } - Set found = new HashSet<>(); - for (Function> provider : PROVIDERS) { - found.addAll(provider.apply(player)); + Map found = new HashMap<>(); + for (Function> provider : PROVIDERS) { + found.putAll(provider.apply(player)); } - found.removeIf(Objects::isNull); + found.keySet().removeIf(Objects::isNull); ITEM_CACHE.put(player.getUniqueId(), found); PLUGIN.getScheduler().runLater(() -> ITEM_CACHE.remove(player.getUniqueId()), 40); @@ -77,14 +80,17 @@ public class ReforgeLookup { * @param player The player. * @return The Reforges. */ - public static Set provideReforges(@NotNull final Player player) { + public static List provideReforges(@NotNull final Player player) { if (REFORGE_CACHE.containsKey(player.getUniqueId())) { - return new HashSet<>(REFORGE_CACHE.get(player.getUniqueId())); + return new ArrayList<>(REFORGE_CACHE.get(player.getUniqueId())); } - Set found = new HashSet<>(); + List found = new ArrayList<>(); + + for (Map.Entry entry : provide(player).entrySet()) { + ItemStack itemStack = entry.getKey(); + ReforgeTarget.Slot slot = entry.getValue(); - for (ItemStack itemStack : provide(player)) { if (itemStack == null) { continue; } @@ -95,6 +101,13 @@ public class ReforgeLookup { continue; } + if (!reforge.getTargets().stream() + .map(ReforgeTarget::getSlot) + .collect(Collectors.toList()) + .contains(slot)) { + continue; + } + found.add(reforge); } @@ -104,9 +117,31 @@ public class ReforgeLookup { return found; } + /** + * Clear caches. + * + * @param player The player. + */ + public static void clearCaches(@NotNull final Player player) { + REFORGE_CACHE.remove(player.getUniqueId()); + ITEM_CACHE.remove(player.getUniqueId()); + } + static { - registerProvider(player -> Collections.singletonList(player.getInventory().getItemInMainHand())); - registerProvider(player -> Collections.singletonList(player.getInventory().getItemInOffHand())); - registerProvider(player -> Arrays.asList(player.getInventory().getArmorContents())); + registerProvider(player -> Map.of( + player.getInventory().getItemInMainHand(), + ReforgeTarget.Slot.HANDS + )); + registerProvider(player -> Map.of( + player.getInventory().getItemInOffHand(), + ReforgeTarget.Slot.HANDS + )); + registerProvider(player -> { + Map items = new HashMap<>(); + for (ItemStack stack : player.getInventory().getArmorContents()) { + items.put(stack, ReforgeTarget.Slot.ARMOR); + } + return items; + }); } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/meta/ReforgeTarget.java b/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/meta/ReforgeTarget.java index 3303ba4..e363463 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/meta/ReforgeTarget.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/meta/ReforgeTarget.java @@ -21,7 +21,7 @@ public class ReforgeTarget { /** * Target containing the materials from all other targets. */ - public static final ReforgeTarget ALL = new ReforgeTarget("all", new HashSet<>()); + public static final ReforgeTarget ALL = new ReforgeTarget("all", Slot.ANY, new HashSet<>()); /** * All registered targets. @@ -38,12 +38,19 @@ public class ReforgeTarget { */ @Getter private final String name; + /** * The materials of the target. */ @Getter private final Set items; + /** + * The slot for the target. + */ + @Getter + private final Slot slot; + /** * Create new target. * @@ -51,10 +58,12 @@ public class ReforgeTarget { * @param items The items for the target. */ public ReforgeTarget(@NotNull final String name, + @NotNull final Slot slot, @NotNull final Set items) { this.name = name; items.removeIf(item -> item instanceof EmptyTestableItem); this.items = items; + this.slot = slot; } /** @@ -115,7 +124,11 @@ public class ReforgeTarget { } for (String id : plugin.getTargetYml().getTargets()) { - ReforgeTarget target = new ReforgeTarget(id, plugin.getTargetYml().getTargetItems(id)); + ReforgeTarget target = new ReforgeTarget( + id, + plugin.getTargetYml().getSlot(id), + plugin.getTargetYml().getTargetItems(id) + ); REGISTERED.put(id, target); ALL.items.addAll(target.items); } @@ -129,4 +142,13 @@ public class ReforgeTarget { public static Set values() { return ImmutableSet.copyOf(REGISTERED.values()); } + + /** + * Reforge slots. + */ + public enum Slot { + HANDS, + ARMOR, + ANY + } } 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 37f0b8d..687d1ba 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 @@ -151,12 +151,6 @@ public class ReforgeUtils { return; } - Reforge previous = getReforge(item); - - if (previous != null) { - previous.handleRemoval(item); - } - ItemMeta meta = item.getItemMeta(); setReforge(meta, reforge); @@ -175,8 +169,6 @@ public class ReforgeUtils { PersistentDataContainer container = meta.getPersistentDataContainer(); container.set(REFORGE_KEY, PersistentDataType.STRING, reforge.getId()); - - reforge.handleApplication(meta); } /** diff --git a/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/equip/ReforgeEnableListeners.java b/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/equip/ReforgeEnableListeners.java new file mode 100644 index 0000000..3343dd3 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/equip/ReforgeEnableListeners.java @@ -0,0 +1,123 @@ +package com.willfp.reforges.reforges.util.equip; + +import com.willfp.eco.core.EcoPlugin; +import com.willfp.eco.core.PluginDependent; +import com.willfp.reforges.effects.ConfiguredEffect; +import com.willfp.reforges.reforges.Reforge; +import com.willfp.reforges.reforges.Reforges; +import com.willfp.reforges.reforges.meta.ReforgeTarget; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerSwapHandItemsEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class ReforgeEnableListeners extends PluginDependent implements Listener { + /** + * Initialize new listeners and link them to a plugin. + * + * @param plugin The plugin to link to. + */ + public ReforgeEnableListeners(@NotNull final EcoPlugin plugin) { + super(plugin); + } + + /** + * Called on item pickup. + * + * @param event The event to listen for. + */ + @EventHandler + public void onItemPickup(@NotNull final EntityPickupItemEvent event) { + if (!(event.getEntity() instanceof Player player)) { + return; + } + + if (!ReforgeTarget.ALL.matches(event.getItem().getItemStack())) { + return; + } + + refreshPlayer(player); + } + + /** + * Called on player join. + * + * @param event The event to listen for. + */ + @EventHandler + public void onPlayerJoin(@NotNull final PlayerJoinEvent event) { + refresh(); + } + + /** + * Called on player leave. + * + * @param event The event to listen for. + */ + @EventHandler + public void onPlayerLeave(@NotNull final PlayerQuitEvent event) { + refresh(); + + Player player = event.getPlayer(); + + for (Reforge value : Reforges.values()) { + for (ConfiguredEffect effect : value.getEffects()) { + effect.getEffect().handleDisabling(player); + } + } + } + + /** + * Called on item drop. + * + * @param event The event to listen for. + */ + @EventHandler + public void onInventoryDrop(@NotNull final PlayerDropItemEvent event) { + if (!ReforgeTarget.ALL.matches(event.getItemDrop().getItemStack())) { + return; + } + + refreshPlayer(event.getPlayer(), event.getItemDrop().getItemStack()); + } + + @EventHandler + public void onSwitchHands(@NotNull final PlayerSwapHandItemsEvent event) { + refreshPlayer(event.getPlayer(), event.getPlayer().getInventory().getItemInOffHand()); + } + + /** + * Called on inventory click. + * + * @param event The event to listen for. + */ + @EventHandler + public void onInventoryClick(@NotNull final InventoryClickEvent event) { + if (!(event.getWhoClicked() instanceof Player)) { + return; + } + + refreshPlayer((Player) event.getWhoClicked()); + } + + /** + * Force refresh all online players. + *

+ * This is a very expensive method. + */ + public void refresh() { + this.getPlugin().getServer().getOnlinePlayers().forEach(this::refreshPlayer); + } + + private void refreshPlayer(@NotNull final Player player, + @NotNull final ItemStack... extra) { + SyncReforgeEnableTask.CHECK.accept(player); + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/equip/SyncReforgeEnableTask.java b/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/equip/SyncReforgeEnableTask.java new file mode 100644 index 0000000..bec4f9e --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/equip/SyncReforgeEnableTask.java @@ -0,0 +1,29 @@ +package com.willfp.reforges.reforges.util.equip; + +import com.willfp.reforges.reforges.Reforge; +import com.willfp.reforges.reforges.ReforgeLookup; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +public class SyncReforgeEnableTask { + public static final Consumer CHECK = (player) -> { + List before = ReforgeLookup.provideReforges(player); + ReforgeLookup.clearCaches(player); + List after = ReforgeLookup.provideReforges(player); + List added = new ArrayList<>(after); + added.removeAll(before); + + for (Reforge reforge : added) { + reforge.handleActivation(player); + } + + before.removeAll(after); + + for (Reforge reforge : before) { + reforge.handleDeactivation(player); + } + }; +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectAttackSpeedMultiplier.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectAttackSpeedMultiplier.kt index 18b3f05..d100ec1 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectAttackSpeedMultiplier.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectAttackSpeedMultiplier.kt @@ -4,16 +4,13 @@ import com.willfp.eco.core.config.interfaces.JSONConfig import com.willfp.reforges.effects.Effect import org.bukkit.attribute.Attribute import org.bukkit.attribute.AttributeModifier -import org.bukkit.inventory.ItemFlag -import org.bukkit.inventory.meta.ItemMeta +import org.bukkit.entity.Player class EffectAttackSpeedMultiplier : Effect("attack_speed_multiplier") { - override fun handleEnabling( - meta: ItemMeta, - config: JSONConfig - ) { - meta.addAttributeModifier( - Attribute.GENERIC_ATTACK_SPEED, + override fun handleEnabling(player: Player, + config: JSONConfig) { + val attribute = player.getAttribute(Attribute.GENERIC_ATTACK_SPEED) ?: return + attribute.addModifier( AttributeModifier( this.getUUID(1), this.id, @@ -21,13 +18,11 @@ class EffectAttackSpeedMultiplier : Effect("attack_speed_multiplier") { AttributeModifier.Operation.MULTIPLY_SCALAR_1 ) ) - - meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES) } - override fun handleDisabling(meta: ItemMeta) { - meta.removeAttributeModifier( - Attribute.GENERIC_ATTACK_SPEED, + override fun handleDisabling(player: Player) { + val attribute = player.getAttribute(Attribute.GENERIC_ATTACK_SPEED) ?: return + attribute.removeModifier( AttributeModifier( this.getUUID(1), this.id, diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectKnockbackMultiplier.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectKnockbackMultiplier.kt index ddbd164..07da49d 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectKnockbackMultiplier.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectKnockbackMultiplier.kt @@ -4,16 +4,13 @@ import com.willfp.eco.core.config.interfaces.JSONConfig import com.willfp.reforges.effects.Effect import org.bukkit.attribute.Attribute import org.bukkit.attribute.AttributeModifier -import org.bukkit.inventory.ItemFlag -import org.bukkit.inventory.meta.ItemMeta +import org.bukkit.entity.Player class EffectKnockbackMultiplier : Effect("knockback_multiplier") { - override fun handleEnabling( - meta: ItemMeta, - config: JSONConfig - ) { - meta.addAttributeModifier( - Attribute.GENERIC_ATTACK_KNOCKBACK, + override fun handleEnabling(player: Player, + config: JSONConfig) { + val attribute = player.getAttribute(Attribute.GENERIC_ATTACK_KNOCKBACK) ?: return + attribute.addModifier( AttributeModifier( this.getUUID(1), this.id, @@ -21,13 +18,11 @@ class EffectKnockbackMultiplier : Effect("knockback_multiplier") { AttributeModifier.Operation.MULTIPLY_SCALAR_1 ) ) - - meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES) } - override fun handleDisabling(meta: ItemMeta) { - meta.removeAttributeModifier( - Attribute.GENERIC_ATTACK_KNOCKBACK, + override fun handleDisabling(player: Player) { + val attribute = player.getAttribute(Attribute.GENERIC_ATTACK_KNOCKBACK) ?: return + attribute.removeModifier( AttributeModifier( this.getUUID(1), this.id, diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectMovementSpeedMultiplier.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectMovementSpeedMultiplier.kt index f21c172..5e6fb16 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectMovementSpeedMultiplier.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/effects/effects/EffectMovementSpeedMultiplier.kt @@ -4,16 +4,13 @@ import com.willfp.eco.core.config.interfaces.JSONConfig import com.willfp.reforges.effects.Effect import org.bukkit.attribute.Attribute import org.bukkit.attribute.AttributeModifier -import org.bukkit.inventory.ItemFlag -import org.bukkit.inventory.meta.ItemMeta +import org.bukkit.entity.Player class EffectMovementSpeedMultiplier : Effect("movement_speed_multiplier") { - override fun handleEnabling( - meta: ItemMeta, - config: JSONConfig - ) { - meta.addAttributeModifier( - Attribute.GENERIC_MOVEMENT_SPEED, + override fun handleEnabling(player: Player, + config: JSONConfig) { + val attribute = player.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED) ?: return + attribute.addModifier( AttributeModifier( this.getUUID(1), this.id, @@ -21,13 +18,11 @@ class EffectMovementSpeedMultiplier : Effect("movement_speed_multiplier") { AttributeModifier.Operation.MULTIPLY_SCALAR_1 ) ) - - meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES) } - override fun handleDisabling(meta: ItemMeta) { - meta.removeAttributeModifier( - Attribute.GENERIC_MOVEMENT_SPEED, + override fun handleDisabling(player: Player) { + val attribute = player.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED) ?: return + attribute.removeModifier( AttributeModifier( this.getUUID(1), this.id, diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/Reforge.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/Reforge.kt index c251b81..bf9a764 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/Reforge.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/Reforge.kt @@ -12,10 +12,11 @@ import com.willfp.reforges.effects.ConfiguredEffect import com.willfp.reforges.effects.Effects import com.willfp.reforges.reforges.meta.ReforgeTarget import com.willfp.reforges.reforges.util.ReforgeUtils +import org.bukkit.entity.Player import org.bukkit.inventory.ItemStack -import org.bukkit.inventory.meta.ItemMeta import java.util.* +@Suppress("DEPRECATION") class Reforge( internal val config: JSONConfig, private val plugin: ReforgesPlugin @@ -68,27 +69,17 @@ class Reforge( } } - fun handleApplication(itemStack: ItemStack) { - itemStack.itemMeta = this.handleApplication(itemStack.itemMeta ?: return) - } - - fun handleApplication(meta: ItemMeta): ItemMeta { - handleRemoval(meta) + fun handleActivation(player: Player) { + handleDeactivation(player) for ((effect, config) in this.effects) { - effect.handleEnabling(meta, config) + effect.handleEnabling(player, config) } - return meta } - fun handleRemoval(itemStack: ItemStack) { - itemStack.itemMeta = this.handleRemoval(itemStack.itemMeta ?: return) - } - - fun handleRemoval(meta: ItemMeta): ItemMeta { + fun handleDeactivation(player: Player) { for ((effect, _) in this.effects) { - effect.handleDisabling(meta) + effect.handleDisabling(player) } - return meta } override fun equals(other: Any?): Boolean { diff --git a/eco-core/core-plugin/src/main/resources/target.yml b/eco-core/core-plugin/src/main/resources/target.yml index 6fd971d..a689d09 100644 --- a/eco-core/core-plugin/src/main/resources/target.yml +++ b/eco-core/core-plugin/src/main/resources/target.yml @@ -1,61 +1,82 @@ +# +# A target consists of items and a slot. +# The slot is either hands, armor, or any. +# Hands means the reforge will activate on hands, armor +# means it will only work on armor, and any +# means it will activate whenever its on the player. +# + + pickaxe: - - wooden_pickaxe - - stone_pickaxe - - iron_pickaxe - - golden_pickaxe - - diamond_pickaxe - - netherite_pickaxe + slot: hands + items: + - wooden_pickaxe + - stone_pickaxe + - iron_pickaxe + - golden_pickaxe + - diamond_pickaxe + - netherite_pickaxe axe: - - wooden_axe - - stone_axe - - iron_axe - - golden_axe - - diamond_axe - - netherite_axe + slot: hands + items: + - wooden_axe + - stone_axe + - iron_axe + - golden_axe + - diamond_axe + - netherite_axe melee: - - wooden_axe - - stone_axe - - iron_axe - - golden_axe - - diamond_axe - - netherite_axe - - wooden_sword - - stone_sword - - iron_sword - - golden_sword - - diamond_sword - - netherite_sword + slot: hands + items: + - wooden_axe + - stone_axe + - iron_axe + - golden_axe + - diamond_axe + - netherite_axe + - wooden_sword + - stone_sword + - iron_sword + - golden_sword + - diamond_sword + - netherite_sword trident: - - trident + slot: hands + items: + - trident bow: - - bow - - crossbow + slot: hands + items: + - bow + - crossbow armor: - - turtle_helmet - - leather_helmet - - chainmail_helmet - - iron_helmet - - golden_helmet - - diamond_helmet - - netherite_helmet + slot: armor + items: + - turtle_helmet + - leather_helmet + - chainmail_helmet + - iron_helmet + - golden_helmet + - diamond_helmet + - netherite_helmet - - leather_chestplate - - chainmail_chestplate - - iron_chestplate - - golden_chestplate - - diamond_chestplate - - netherite_chestplate + - leather_chestplate + - chainmail_chestplate + - iron_chestplate + - golden_chestplate + - diamond_chestplate + - netherite_chestplate - - leather_leggings - - chainmail_leggings - - iron_leggings - - golden_leggings - - diamond_leggings - - netherite_leggings + - leather_leggings + - chainmail_leggings + - iron_leggings + - golden_leggings + - diamond_leggings + - netherite_leggings - - leather_boots - - chainmail_boots - - iron_boots - - golden_boots - - diamond_boots - - netherite_boots \ No newline at end of file + - leather_boots + - chainmail_boots + - iron_boots + - golden_boots + - diamond_boots + - netherite_boots \ No newline at end of file