From 7ef8db696931d87971daf60dbe13f6d8081fb1e2 Mon Sep 17 00:00:00 2001 From: Auxilor Date: Thu, 2 Dec 2021 14:11:46 +0000 Subject: [PATCH] Added ModifierOperation.MULTIPLY --- .../willfp/ecoskills/api/EcoSkillsAPI.java | 18 +++++++++++ .../api/modifier/ItemStatModifier.java | 30 +++++++++++++++++++ .../api/modifier/ModifierOperation.java | 15 ++++++++++ .../api/modifier/PlayerStatModifier.java | 28 +++++++++++++++++ .../ecoskills/api/modifier/StatModifier.java | 7 +++++ .../com/willfp/ecoskills/EcoSkillsPlayer.kt | 12 +++++++- .../willfp/ecoskills/StatModifierMethods.kt | 21 ++++++++----- .../willfp/ecoskills/api/EcoSkillsAPIImpl.kt | 12 ++++++-- .../stats/modifier/StatModifierListener.kt | 8 ++--- 9 files changed, 136 insertions(+), 15 deletions(-) create mode 100644 eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/ModifierOperation.java diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/EcoSkillsAPI.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/EcoSkillsAPI.java index 418dba5..1ed60b0 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/EcoSkillsAPI.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/EcoSkillsAPI.java @@ -153,6 +153,15 @@ public interface EcoSkillsAPI { void removeStatModifier(@NotNull ItemStack itemStack, @NotNull ItemStatModifier modifier); + /** + * Remove a stat modifier from an item. + * + * @param itemStack The item. + * @param key The key. + */ + void removeStatModifier(@NotNull ItemStack itemStack, + @NotNull NamespacedKey key); + /** * Get stat modifier keys on an item. * @@ -198,6 +207,15 @@ public interface EcoSkillsAPI { void removeStatModifier(@NotNull Player player, @NotNull PlayerStatModifier modifier); + /** + * Remove a stat modifier from a player. + * + * @param player The player. + * @param key The key. + */ + void removeStatModifier(@NotNull Player player, + @NotNull NamespacedKey key); + /** * Get stat modifier keys on a player. * diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/ItemStatModifier.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/ItemStatModifier.java index aaf25cc..2b269a3 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/ItemStatModifier.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/ItemStatModifier.java @@ -26,8 +26,15 @@ public class ItemStatModifier implements StatModifier { */ private final EquipmentSlot[] slots; + /** + * The operation. + */ + private final ModifierOperation operation; + /** * Create a stat modifier. + *

+ * Uses {@link ModifierOperation#ADD}. * * @param key The key. * @param stat The stat. @@ -38,9 +45,27 @@ public class ItemStatModifier implements StatModifier { @NotNull final Stat stat, final int amount, @NotNull final EquipmentSlot... slot) { + this(key, stat, amount, ModifierOperation.ADD, slot); + } + + /** + * Create a stat modifier. + * + * @param key The key. + * @param stat The stat. + * @param amount The amount. + * @param operation The operation. + * @param slot The slots. (Empty is the same as all). + */ + public ItemStatModifier(@NotNull final NamespacedKey key, + @NotNull final Stat stat, + final int amount, + @NotNull final ModifierOperation operation, + @NotNull final EquipmentSlot... slot) { this.key = key; this.stat = stat; this.amount = amount; + this.operation = operation; this.slots = slot.length == 0 ? EquipmentSlot.values() : slot; } @@ -67,4 +92,9 @@ public class ItemStatModifier implements StatModifier { public EquipmentSlot[] getSlots() { return slots; } + + @Override + public ModifierOperation getOperation() { + return operation; + } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/ModifierOperation.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/ModifierOperation.java new file mode 100644 index 0000000..174bda0 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/ModifierOperation.java @@ -0,0 +1,15 @@ +package com.willfp.ecoskills.api.modifier; + +public enum ModifierOperation { + /** + * Add a specific number to a stat. + */ + ADD, + + /** + * Multiply a stat by some value. + *

+ * Applies after adding. + */ + MULTIPLY +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/PlayerStatModifier.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/PlayerStatModifier.java index 8d83e96..65f4858 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/PlayerStatModifier.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/PlayerStatModifier.java @@ -20,8 +20,15 @@ public class PlayerStatModifier implements StatModifier { */ private final int amount; + /** + * The operation. + */ + private final ModifierOperation operation; + /** * Create a stat modifier. + *

+ * Uses {@link ModifierOperation#ADD}. * * @param key The key. * @param stat The stat. @@ -30,9 +37,25 @@ public class PlayerStatModifier implements StatModifier { public PlayerStatModifier(@NotNull final NamespacedKey key, @NotNull final Stat stat, final int amount) { + this(key, stat, amount, ModifierOperation.ADD); + } + + /** + * Create a stat modifier. + * + * @param key The key. + * @param stat The stat. + * @param amount The amount. + * @param operation The operation. + */ + public PlayerStatModifier(@NotNull final NamespacedKey key, + @NotNull final Stat stat, + final int amount, + @NotNull final ModifierOperation operation) { this.key = key; this.stat = stat; this.amount = amount; + this.operation = operation; } @Override @@ -49,4 +72,9 @@ public class PlayerStatModifier implements StatModifier { public int getAmount() { return amount; } + + @Override + public ModifierOperation getOperation() { + return operation; + } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/StatModifier.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/StatModifier.java index 0fb5f68..65eea61 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/StatModifier.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoskills/api/modifier/StatModifier.java @@ -24,4 +24,11 @@ public interface StatModifier { * @return The amount. */ int getAmount(); + + /** + * Get the operation. + * + * @return The operation. + */ + ModifierOperation getOperation(); } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/EcoSkillsPlayer.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/EcoSkillsPlayer.kt index 1543afe..075223e 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/EcoSkillsPlayer.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/EcoSkillsPlayer.kt @@ -3,6 +3,7 @@ package com.willfp.ecoskills import com.willfp.eco.core.data.PlayerProfile import com.willfp.ecoskills.api.PlayerSkillExpGainEvent import com.willfp.ecoskills.api.PlayerSkillLevelUpEvent +import com.willfp.ecoskills.api.modifier.ModifierOperation import com.willfp.ecoskills.effects.Effect import com.willfp.ecoskills.skills.Skill import com.willfp.ecoskills.skills.Skills @@ -144,7 +145,16 @@ fun Player.getBonusStatLevel(stat: Stat): Int { var i = 0 for (modifier in this.getStatModifiers()) { if (modifier.stat == stat) { - i += modifier.amount + if (modifier.operation == ModifierOperation.ADD) { + i += modifier.amount + } + } + } + for (modifier in this.getStatModifiers()) { + if (modifier.stat == stat) { + if (modifier.operation == ModifierOperation.MULTIPLY) { + i *= modifier.amount + } } } return i diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/StatModifierMethods.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/StatModifierMethods.kt index 2f1124f..bd1298d 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/StatModifierMethods.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/StatModifierMethods.kt @@ -2,6 +2,7 @@ package com.willfp.ecoskills import com.willfp.eco.util.NamespacedKeyUtils import com.willfp.ecoskills.api.modifier.ItemStatModifier +import com.willfp.ecoskills.api.modifier.ModifierOperation import com.willfp.ecoskills.api.modifier.PlayerStatModifier import com.willfp.ecoskills.api.modifier.StatModifier import com.willfp.ecoskills.stats.Stats @@ -23,6 +24,7 @@ private val modifierKey: NamespacedKey = NamespacedKeyUtils.create("ecoskills", private val statKey: NamespacedKey = NamespacedKeyUtils.create("ecoskills", "stat") private val amountKey: NamespacedKey = NamespacedKeyUtils.create("ecoskills", "amount") private val slotsKey: NamespacedKey = NamespacedKeyUtils.create("ecoskills", "slots") +private val operationKey: NamespacedKey = NamespacedKeyUtils.create("ecoskills", "operation") private fun PersistentDataContainer.applyModifiers(tag: PersistentDataContainer) { this.set(modifierKey, PersistentDataType.TAG_CONTAINER, tag) @@ -48,7 +50,6 @@ fun ItemStack.addStatModifier(modifier: ItemStatModifier) { slotsKey, PersistentDataType.STRING, modifier.slots.map { slot -> slot.name }.toTypedArray().joinToString { "," }) - modifiers.set(modifier.key, PersistentDataType.TAG_CONTAINER, modifierTag) meta.persistentDataContainer.applyModifiers(modifiers) @@ -56,11 +57,11 @@ fun ItemStack.addStatModifier(modifier: ItemStatModifier) { this.itemMeta = meta } -fun ItemStack.removeStatModifier(modifier: ItemStatModifier) { +fun ItemStack.removeStatModifier(key: NamespacedKey) { val meta = this.itemMeta ?: return val modifiers = getModifiersTag(meta) - modifiers.remove(modifier.key) + modifiers.remove(key) meta.persistentDataContainer.applyModifiers(modifiers) @@ -96,8 +97,9 @@ fun ItemStack.getStatModifier(key: NamespacedKey): ItemStatModifier? { val slots = modifierTag.get(slotsKey, PersistentDataType.STRING)!!.split(",") .map { s -> EquipmentSlot.valueOf(s) } .toCollection(ArrayList()) + val operation = ModifierOperation.valueOf(modifierTag.get(operationKey, PersistentDataType.STRING)!!) - ItemStatModifier(key, stat, amount, *slots.toTypedArray()) + ItemStatModifier(key, stat, amount, operation, *slots.toTypedArray()) } else { null } @@ -110,6 +112,7 @@ Player Modifiers private const val META_MODIFIERS = "ecoskills_modifiers" private const val META_STAT_KEY = "stat" private const val META_AMOUNT_KEY = "amount" +private const val META_OPERATION_KEY = "operation" private fun Player.applyModifiers(meta: MutableMap) { this.setMetadata(META_MODIFIERS, plugin.metadataValueFactory.create(meta)) @@ -125,7 +128,8 @@ fun Player.addStatModifier(modifier: StatModifier) { modifiers[modifier.key.toString()] = mapOf( Pair(META_STAT_KEY, modifier.stat.id), - Pair(META_AMOUNT_KEY, modifier.amount) + Pair(META_AMOUNT_KEY, modifier.amount), + Pair(META_OPERATION_KEY, modifier.operation.name) ) this.applyModifiers(modifiers) @@ -135,10 +139,10 @@ fun Player.addStatModifier(modifier: StatModifier) { } } -fun Player.removeStatModifier(modifier: StatModifier) { +fun Player.removeStatModifier(key: NamespacedKey) { val modifiers = getModifiersTag(this) - modifiers.remove(modifier.key.toString()) + modifiers.remove(key.toString()) this.applyModifiers(modifiers) @@ -171,8 +175,9 @@ fun Player.getStatModifier(key: NamespacedKey): PlayerStatModifier? { val stat = Stats.getByID(modifier[META_STAT_KEY] as String)!! val amount = modifier[META_AMOUNT_KEY] as Int + val operation = ModifierOperation.valueOf(modifier[META_OPERATION_KEY] as String) - PlayerStatModifier(key, stat, amount) + PlayerStatModifier(key, stat, amount, operation) } else { null } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/api/EcoSkillsAPIImpl.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/api/EcoSkillsAPIImpl.kt index fcbab7e..cd29cb5 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/api/EcoSkillsAPIImpl.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/api/EcoSkillsAPIImpl.kt @@ -72,7 +72,11 @@ object EcoSkillsAPIImpl : EcoSkillsAPI { } override fun removeStatModifier(itemStack: ItemStack, modifier: ItemStatModifier) { - itemStack.removeStatModifier(modifier) + itemStack.removeStatModifier(modifier.key) + } + + override fun removeStatModifier(itemStack: ItemStack, key: NamespacedKey) { + itemStack.removeStatModifier(key) } override fun addStatModifier(player: Player, modifier: PlayerStatModifier) { @@ -80,7 +84,11 @@ object EcoSkillsAPIImpl : EcoSkillsAPI { } override fun removeStatModifier(player: Player, modifier: PlayerStatModifier) { - player.removeStatModifier(modifier) + player.removeStatModifier(modifier.key) + } + + override fun removeStatModifier(player: Player, key: NamespacedKey) { + player.removeStatModifier(key) } override fun getStatModifierKeys(itemStack: ItemStack): MutableSet { diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/stats/modifier/StatModifierListener.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/stats/modifier/StatModifierListener.kt index afbd60c..d38f25b 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/stats/modifier/StatModifierListener.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/stats/modifier/StatModifierListener.kt @@ -23,7 +23,7 @@ class StatModifierListener : Listener { val newMods = new?.getStatModifiers() ?: HashSet() for (oldMod in oldMods) { - player.removeStatModifier(oldMod) + player.removeStatModifier(oldMod.key) } for (newMod in newMods) { if (newMod.slots.contains(EquipmentSlot.HAND)) { @@ -40,10 +40,10 @@ class StatModifierListener : Listener { val mainhandMods = event.mainHandItem?.getStatModifiers() ?: HashSet() for (offhandMod in offhandMods) { - player.removeStatModifier(offhandMod) + player.removeStatModifier(offhandMod.key) } for (mainhandMod in mainhandMods) { - player.removeStatModifier(mainhandMod) + player.removeStatModifier(mainhandMod.key) } for (mod in offhandMods) { @@ -67,7 +67,7 @@ class StatModifierListener : Listener { } val mods = itemStack.getStatModifiers() for (mod in mods) { - event.player.removeStatModifier(mod) + event.player.removeStatModifier(mod.key) } } for (itemStack in event.after) {