diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecopets/pets/Pet.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecopets/pets/Pet.kt index 8e27cba..ed9eb07 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecopets/pets/Pet.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecopets/pets/Pet.kt @@ -151,12 +151,15 @@ class Pet( private val petXpGains = config.getSubsections("xp-gain-methods").mapNotNull { val trigger = Triggers.getById(it.getString("id")) ?: return@mapNotNull null val multiplier = it.getDouble("multiplier") + val conditions = it.getSubsections("conditions") + .mapNotNull { cfg -> Conditions.compile(cfg, "Pet $id XP Gain methods") } - PetXPGain( + trigger to PetXPGain( trigger, - multiplier + multiplier, + conditions ) - } + }.toMap() init { config.injectPlaceholders( @@ -398,12 +401,8 @@ class Pet( } } - fun canGainXPFromTrigger(trigger: Trigger): Boolean { - return petXpGains.any { it.trigger == trigger } - } - - fun getTriggerXPMultiplier(trigger: Trigger): Double { - return petXpGains.firstOrNull { it.trigger == trigger }?.multiplier ?: 1.0 + fun getPetXPGain(trigger: Trigger): PetXPGain? { + return petXpGains[trigger] } override fun equals(other: Any?): Boolean { diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecopets/pets/PetXPGain.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecopets/pets/PetXPGain.kt index 2cfcf60..e6b7b0f 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecopets/pets/PetXPGain.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecopets/pets/PetXPGain.kt @@ -1,5 +1,6 @@ package com.willfp.ecopets.pets +import com.willfp.libreforge.conditions.ConfiguredCondition import com.willfp.libreforge.events.TriggerPreProcessEvent import com.willfp.libreforge.triggers.Trigger import org.bukkit.event.EventHandler @@ -7,10 +8,11 @@ import org.bukkit.event.Listener data class PetXPGain( val trigger: Trigger, - val multiplier: Double + val multiplier: Double, + val conditions: Iterable ) -object PetTriggerXPGainListener: Listener { +object PetTriggerXPGainListener : Listener { @EventHandler(ignoreCancelled = true) fun handle(event: TriggerPreProcessEvent) { val player = event.player @@ -19,11 +21,15 @@ object PetTriggerXPGainListener: Listener { val pet = event.player.activePet ?: return - if (pet.canGainXPFromTrigger(trigger)) { - player.givePetExperience( - pet, - value * pet.getTriggerXPMultiplier(trigger) - ) + val xpGain = pet.getPetXPGain(trigger) ?: return + + if (xpGain.conditions.any { !it.isMet(player) }) { + return } + + player.givePetExperience( + pet, + value * xpGain.multiplier + ) } } diff --git a/eco-core/core-plugin/src/main/resources/pets.yml b/eco-core/core-plugin/src/main/resources/pets.yml index 87bdfda..f285706 100644 --- a/eco-core/core-plugin/src/main/resources/pets.yml +++ b/eco-core/core-plugin/src/main/resources/pets.yml @@ -65,6 +65,7 @@ pets: xp-gain-methods: - id: melee_attack multiplier: 0.5 + conditions: [ ] # You can add a list of conditions that must be met on xp gain # Custom placeholders to be used in descriptions, # Don't add % to the IDs, this is done automatically