From 1ffccf6944cf8300acd2b1132b75edcba2813274 Mon Sep 17 00:00:00 2001 From: Auxilor Date: Thu, 28 Oct 2021 13:22:08 +0100 Subject: [PATCH] Reworked stat modifiers to not use persistent meta --- .../willfp/ecoskills/StatModifierMethods.kt | 63 ++++++++++++------- 1 file changed, 40 insertions(+), 23 deletions(-) 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 3713ffe..7beb497 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 @@ -1,5 +1,7 @@ package com.willfp.ecoskills +import com.willfp.eco.core.config.interfaces.JSONConfig +import com.willfp.eco.core.config.json.JSONTransientConfig import com.willfp.eco.util.NamespacedKeyUtils import com.willfp.ecoskills.api.modifier.ItemStatModifier import com.willfp.ecoskills.api.modifier.PlayerStatModifier @@ -13,6 +15,10 @@ import org.bukkit.inventory.meta.ItemMeta import org.bukkit.persistence.PersistentDataContainer import org.bukkit.persistence.PersistentDataType +/* +Item Modifiers + */ + private val modifierKey: NamespacedKey = NamespacedKeyUtils.create("ecoskills", "modifiers") private val statKey: NamespacedKey = NamespacedKeyUtils.create("ecoskills", "stat") private val amountKey: NamespacedKey = NamespacedKeyUtils.create("ecoskills", "amount") @@ -28,12 +34,6 @@ private fun getModifiersTag(meta: ItemMeta): PersistentDataContainer { return container.getOrDefault(modifierKey, PersistentDataType.TAG_CONTAINER, context.newPersistentDataContainer()) } -private fun getModifiersTag(player: Player): PersistentDataContainer { - val container = player.persistentDataContainer - val context = container.adapterContext - return container.getOrDefault(modifierKey, PersistentDataType.TAG_CONTAINER, context.newPersistentDataContainer()) -} - fun ItemStack.addStatModifier(modifier: ItemStatModifier) { val meta = this.itemMeta ?: return val modifiers = getModifiersTag(meta) @@ -44,7 +44,10 @@ fun ItemStack.addStatModifier(modifier: ItemStatModifier) { modifierTag.set(statKey, PersistentDataType.STRING, modifier.stat.id) modifierTag.set(amountKey, PersistentDataType.INTEGER, modifier.amount) - modifierTag.set(slotsKey, PersistentDataType.STRING, modifier.slots.map { slot -> slot.name }.toTypedArray().joinToString { "," }) + modifierTag.set( + slotsKey, + PersistentDataType.STRING, + modifier.slots.map { slot -> slot.name }.toTypedArray().joinToString { "," }) modifiers.set(modifier.key, PersistentDataType.TAG_CONTAINER, modifierTag) @@ -104,19 +107,32 @@ fun ItemStack.getStatModifier(key: NamespacedKey): ItemStatModifier? { Player Modifiers */ +private const val META_MODIFIERS = "ecoskills_modifiers" +private const val META_STAT_KEY = "stat" +private const val META_AMOUNT_KEY = "amount" + +private fun Player.applyModifiers(meta: JSONConfig) { + this.setMetadata(META_MODIFIERS, plugin.metadataValueFactory.create(meta)) +} + +@Suppress("UNCHECKED_CAST") +private fun getModifiersTag(player: Player): JSONConfig { + return player.getMetadata(META_MODIFIERS).getOrNull(0)?.value() as JSONConfig? ?: JSONTransientConfig(emptyMap()) +} + fun Player.addStatModifier(modifier: StatModifier) { val modifiers = getModifiersTag(this) - modifiers.remove(modifier.key) + modifiers.set( + modifier.key.toString(), JSONTransientConfig( + mapOf( + Pair(META_STAT_KEY, modifier.stat.id), + Pair(META_AMOUNT_KEY, modifier.amount) + ) + ) + ) - val modifierTag = modifiers.adapterContext.newPersistentDataContainer() - - modifierTag.set(statKey, PersistentDataType.STRING, modifier.stat.id) - modifierTag.set(amountKey, PersistentDataType.INTEGER, modifier.amount) - - modifiers.set(modifier.key, PersistentDataType.TAG_CONTAINER, modifierTag) - - this.persistentDataContainer.applyModifiers(modifiers) + this.applyModifiers(modifiers) for (stat in Stats.values()) { stat.updateStatLevel(this) @@ -125,9 +141,10 @@ fun Player.addStatModifier(modifier: StatModifier) { fun Player.removeStatModifier(modifier: StatModifier) { val modifiers = getModifiersTag(this) - modifiers.remove(modifier.key) - this.persistentDataContainer.applyModifiers(modifiers) + modifiers.set(modifier.key.toString(), null) + + this.applyModifiers(modifiers) for (stat in Stats.values()) { stat.updateStatLevel(this) @@ -136,7 +153,7 @@ fun Player.removeStatModifier(modifier: StatModifier) { fun Player.getStatModifierKeys(): MutableSet { val modifiers = getModifiersTag(this) - return modifiers.keys + return modifiers.getKeys(false).mapNotNull { NamespacedKey.fromString(it) }.toMutableSet() } fun Player.getStatModifiers(): MutableSet { @@ -152,11 +169,11 @@ fun Player.getStatModifiers(): MutableSet { fun Player.getStatModifier(key: NamespacedKey): PlayerStatModifier? { val modifiers = getModifiersTag(this) - return if (modifiers.has(key, PersistentDataType.TAG_CONTAINER)) { - val modifierTag = modifiers.get(key, PersistentDataType.TAG_CONTAINER)!! + return if (modifiers.has(key.toString())) { + val modifier = modifiers.getSubsection(key.toString()) - val stat = Stats.getByID(modifierTag.get(statKey, PersistentDataType.STRING)!!)!! - val amount = modifierTag.get(amountKey, PersistentDataType.INTEGER)!! + val stat = Stats.getByID(modifier.getString(META_STAT_KEY))!! + val amount = modifier.getInt(META_AMOUNT_KEY) PlayerStatModifier(key, stat, amount) } else {