From 243fafe7c72fd4c30168091ac8a319d2fdc9febc Mon Sep 17 00:00:00 2001 From: Auxilor Date: Sat, 20 May 2023 16:24:58 +0100 Subject: [PATCH] Fixed stat modifiers --- .../com/willfp/ecoskills/EcoSkillsPlugin.kt | 4 +- .../com/willfp/ecoskills/effects/Effect.kt | 10 +++- .../com/willfp/ecoskills/skills/Skill.kt | 8 +++ .../kotlin/com/willfp/ecoskills/stats/Stat.kt | 8 +++ .../willfp/ecoskills/stats/StatModifiers.kt | 54 ++++++++----------- 5 files changed, 49 insertions(+), 35 deletions(-) diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/EcoSkillsPlugin.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/EcoSkillsPlugin.kt index 2737c8d..4819896 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/EcoSkillsPlugin.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/EcoSkillsPlugin.kt @@ -37,6 +37,7 @@ import com.willfp.ecoskills.skills.display.DamageIndicatorListener import com.willfp.ecoskills.skills.display.GainXPDisplay import com.willfp.ecoskills.skills.display.LevelUpDisplay import com.willfp.ecoskills.skills.display.TemporaryBossBarHandler +import com.willfp.ecoskills.stats.StatModifierListener import com.willfp.ecoskills.stats.Stats import com.willfp.libreforge.SimpleProvidedHolder import com.willfp.libreforge.conditions.Conditions @@ -117,7 +118,8 @@ class EcoSkillsPlugin : LibreforgePlugin() { DamageIndicatorListener(this), MagicListener(this), ActionBarGamemodeListener, - SkillCritListener + SkillCritListener, + StatModifierListener ) } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/effects/Effect.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/effects/Effect.kt index bd14968..3d43d39 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/effects/Effect.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/effects/Effect.kt @@ -10,7 +10,15 @@ class Effect( id: String, config: Config, plugin: EcoSkillsPlugin -) : LevellableWithHolder(id, config, plugin) +) : LevellableWithHolder(id, config, plugin) { + override fun equals(other: Any?): Boolean { + return other is Effect && other.id == id + } + + override fun hashCode(): Int { + return id.hashCode() + } +} internal val OfflinePlayer.effects: LevelMap diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/skills/Skill.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/skills/Skill.kt index c999987..25d755d 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/skills/Skill.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/skills/Skill.kt @@ -270,6 +270,14 @@ class Skill( internal fun getSavedXP(player: OfflinePlayer): Double = player.profile.read(xpKey) internal fun setSavedXP(player: OfflinePlayer, xp: Double) = player.profile.write(xpKey, xp) + + override fun equals(other: Any?): Boolean { + return other is Skill && other.id == id + } + + override fun hashCode(): Int { + return id.hashCode() + } } internal val OfflinePlayer.skills: SkillLevelMap diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/stats/Stat.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/stats/Stat.kt index 23adec5..989ca47 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/stats/Stat.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/stats/Stat.kt @@ -57,6 +57,14 @@ class Stat( override fun getActualLevel(player: OfflinePlayer): Int { return player.getStatLevel(this) } + + override fun equals(other: Any?): Boolean { + return other is Stat && other.id == id + } + + override fun hashCode(): Int { + return id.hashCode() + } } internal val OfflinePlayer.stats: LevelMap diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/stats/StatModifiers.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/stats/StatModifiers.kt index da8d468..583e495 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/stats/StatModifiers.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecoskills/stats/StatModifiers.kt @@ -2,14 +2,18 @@ package com.willfp.ecoskills.stats +import com.willfp.eco.core.map.nestedMap import com.willfp.ecoskills.api.getBaseStatLevel import com.willfp.ecoskills.api.modifiers.ModifierOperation import com.willfp.ecoskills.api.modifiers.StatModifier -import com.willfp.ecoskills.plugin import org.bukkit.entity.Player +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerQuitEvent import java.util.UUID -private const val KEY_MODIFIERS = "ecoskills:stat_modifiers" +// Player UUID -> Stat Modifier UUID -> Stat Modifier +private val trackedStatModifiers = nestedMap() internal val Player.statModifiers: StatModifiers get() = StatModifiers(this) @@ -18,31 +22,13 @@ class StatModifiers( private val player: Player ) { fun add(modifier: StatModifier) { - if (!player.hasMetadata(KEY_MODIFIERS)) { - player.setMetadata(KEY_MODIFIERS, plugin.createMetadataValue(mutableMapOf())) - } - - val modifiers = player.getMetadata(KEY_MODIFIERS).first().value() as MutableMap - - modifiers[modifier.uuid] = modifier - - player.setMetadata(KEY_MODIFIERS, plugin.createMetadataValue(modifiers)) + trackedStatModifiers[player.uniqueId][modifier.uuid] = modifier } operator fun plusAssign(modifier: StatModifier) = add(modifier) fun remove(uuid: UUID): StatModifier? { - if (!player.hasMetadata(KEY_MODIFIERS)) { - return null - } - - val modifiers = player.getMetadata(KEY_MODIFIERS).first().value() as MutableMap - - val modifier = modifiers.remove(uuid) - - player.setMetadata(KEY_MODIFIERS, plugin.createMetadataValue(modifiers)) - - return modifier + return trackedStatModifiers[player.uniqueId].remove(uuid) } operator fun minusAssign(uuid: UUID) { @@ -54,13 +40,7 @@ class StatModifiers( } fun getModifiers(): List { - if (!player.hasMetadata(KEY_MODIFIERS)) { - return emptyList() - } - - val modifiers = player.getMetadata(KEY_MODIFIERS).first().value() as MutableMap - - return modifiers.values.toList() + return trackedStatModifiers[player.uniqueId].values.toList() } fun getModifiers(stat: Stat): List { @@ -84,16 +64,24 @@ class StatModifiers( fun getModifiedValue(stat: Stat): Int { val modifiers = getModifiers(stat) - var base = player.getBaseStatLevel(stat).toDouble() + var level = player.getBaseStatLevel(stat).toDouble() modifiers.filter { it.operation == ModifierOperation.ADD }.forEach { - base += it.modifier + level += it.modifier } modifiers.filter { it.operation == ModifierOperation.MULTIPLY }.forEach { - base *= it.modifier + level *= it.modifier } - return base.toInt() + return level.toInt() + } +} + +// Little fixer-upper +object StatModifierListener : Listener { + @EventHandler + fun onLeave(event: PlayerQuitEvent) { + trackedStatModifiers.remove(event.player.uniqueId) } }