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