9
0
mirror of https://github.com/Auxilor/EcoSkills.git synced 2026-01-01 21:36:34 +00:00

Fixed stat modifiers

This commit is contained in:
Auxilor
2023-05-20 16:24:58 +01:00
parent e298bfc21b
commit 243fafe7c7
5 changed files with 49 additions and 35 deletions

View File

@@ -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
)
}

View File

@@ -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<Effect>

View File

@@ -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

View File

@@ -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<Stat>

View File

@@ -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<UUID, UUID, StatModifier>()
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<UUID, StatModifier>()))
}
val modifiers = player.getMetadata(KEY_MODIFIERS).first().value() as MutableMap<UUID, StatModifier>
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<UUID, StatModifier>
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<StatModifier> {
if (!player.hasMetadata(KEY_MODIFIERS)) {
return emptyList()
}
val modifiers = player.getMetadata(KEY_MODIFIERS).first().value() as MutableMap<UUID, StatModifier>
return modifiers.values.toList()
return trackedStatModifiers[player.uniqueId].values.toList()
}
fun getModifiers(stat: Stat): List<StatModifier> {
@@ -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)
}
}