diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/EcoMobsPlugin.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/EcoMobsPlugin.kt index 847b275..a998a0a 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/EcoMobsPlugin.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/EcoMobsPlugin.kt @@ -4,6 +4,7 @@ import com.willfp.eco.core.command.impl.PluginCommand import com.willfp.eco.core.display.DisplayModule import com.willfp.eco.core.entities.ai.EntityGoals import com.willfp.eco.core.integrations.IntegrationLoader +import com.willfp.eco.util.toSingletonList import com.willfp.ecomobs.category.MobCategories import com.willfp.ecomobs.category.spawning.spawnpoints.SpawnPointGenerator import com.willfp.ecomobs.commands.CommandEcoMobs @@ -19,8 +20,13 @@ import com.willfp.ecomobs.integrations.libsdisguises.IntegrationLibsDisguises import com.willfp.ecomobs.integrations.modelengine.IntegrationModelEngine import com.willfp.ecomobs.mob.EcoMobs import com.willfp.ecomobs.mob.damage.TopDamagerHandler +import com.willfp.ecomobs.mob.impl.ecoMob +import com.willfp.libreforge.EmptyProvidedHolder.holder +import com.willfp.libreforge.EntityProvidedHolder import com.willfp.libreforge.loader.LibreforgePlugin import com.willfp.libreforge.loader.configs.ConfigCategory +import com.willfp.libreforge.registerSpecificHolderProvider +import org.bukkit.entity.Mob import org.bukkit.event.Listener internal lateinit var plugin: EcoMobsPlugin @@ -34,6 +40,14 @@ class EcoMobsPlugin : LibreforgePlugin() { plugin = this } + override fun handleEnable() { + registerSpecificHolderProvider { + it.ecoMob?.entityHolder.toSingletonList().map { holder -> + EntityProvidedHolder(holder, it) + } + } + } + override fun handleLoad() { EntityGoals.register(EntityGoalRandomTeleport.Deserializer) } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/EcoMob.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/EcoMob.kt index 61ec20a..25dabb9 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/EcoMob.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/EcoMob.kt @@ -7,6 +7,7 @@ import com.willfp.ecomobs.category.MobCategory import com.willfp.ecomobs.integrations.MobIntegration import com.willfp.ecomobs.mob.event.MobEvent import com.willfp.ecomobs.mob.options.SpawnEgg +import com.willfp.libreforge.Holder import com.willfp.libreforge.triggers.DispatchedTrigger import org.bukkit.Location import org.bukkit.entity.Mob @@ -50,6 +51,11 @@ interface EcoMob : KRegistrable { */ val customEntity: CustomEntity + /** + * The entity holder. + */ + val entityHolder: Holder + /** * Get a living mob from a bukkit mob. */ diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/impl/ConfigDrivenEcoMob.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/impl/ConfigDrivenEcoMob.kt index 69162cc..ba1b21a 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/impl/ConfigDrivenEcoMob.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/impl/ConfigDrivenEcoMob.kt @@ -49,14 +49,19 @@ import com.willfp.ecomobs.tick.TickHandlerBossBar import com.willfp.ecomobs.tick.TickHandlerDisplayName import com.willfp.ecomobs.tick.TickHandlerLifespan import com.willfp.libreforge.ConfigViolation +import com.willfp.libreforge.Holder import com.willfp.libreforge.ViolationContext +import com.willfp.libreforge.conditions.ConditionList import com.willfp.libreforge.conditions.Conditions +import com.willfp.libreforge.conditions.emptyConditionList +import com.willfp.libreforge.effects.EffectList import com.willfp.libreforge.effects.Effects import com.willfp.libreforge.enumValueOfOrNull import com.willfp.libreforge.triggers.DispatchedTrigger import net.kyori.adventure.bossbar.BossBar import org.bukkit.Bukkit import org.bukkit.Location +import org.bukkit.NamespacedKey import org.bukkit.entity.Mob import org.bukkit.entity.Player import org.bukkit.event.entity.CreatureSpawnEvent @@ -311,6 +316,17 @@ internal class ConfigDrivenEcoMob( this.spawn(it, SpawnReason.COMMAND)!!.entity }.apply { register() } + override val entityHolder = object : Holder { + override val id = plugin.createNamespacedKey(getID()) + + override val effects: EffectList = Effects.compile( + config.getSubsections("effects.permanent-effects"), + context.with("effects").with("permanent effects") + ) + + override val conditions = emptyConditionList() + } + /* ---------- */ diff --git a/eco-core/core-plugin/src/main/resources/mobs/_example.yml b/eco-core/core-plugin/src/main/resources/mobs/_example.yml index 788a3c0..48b28d9 100644 --- a/eco-core/core-plugin/src/main/resources/mobs/_example.yml +++ b/eco-core/core-plugin/src/main/resources/mobs/_example.yml @@ -52,43 +52,59 @@ custom-ai: # How the mob should behave. entity-goals: [ ] -# Effects are done from the player's perspective: to treat the player as the victim, -# either use self_as_victim in args, or use player_as_victim in mutators. +# Some effects are ran from the perspective of the entity, and others from the perspective +# of the player - each section is marked with which perspective it is run from. + # You can use display name placeholders in effects # You can also use top damager placeholders: # %top_damager__name%, %top_damager__damage%, %top_damager__display% effects: + # Effects that are active all the time + # Ran from the perspective of the entity + permanent-effects: [ ] + # Effects ran when the mob spawns + # Ran from the perspective of the entity spawn: [ ] # Effects ran when the mob despawns + # Ran from the perspective of the entity despawn: [ ] # Effects ran when the player interacts with the mob + # Ran from the perspective of the player interact: [ ] # Effects ran when the player melee attacks the mob + # Ran from the perspective of the player melee-attack: [ ] # Effects ran when the player does a ranged attack on the mob + # Ran from the perspective of the player ranged-attack: [ ] # Effects ran when the player attacks the mob + # Ran from the perspective of the player any-attack: [ ] # Effects ran when the mob takes damage + # Ran from the perspective of the entity take-damage: [ ] # Effects ran when the player is damaged by the mob + # Ran from the perspective of the player damage-player: [ ] # Effects ran when the player is killed by the mob + # Ran from the perspective of the player kill-player: [ ] # Effects ran when the mob dies + # Ran from the perspective of the entity death: [ ] # Effects ran when the mob is killed by the player + # Ran from the perspective of the player kill: [ ] # The lifespan of the mob, in seconds. Set to -1 to disable. diff --git a/gradle.properties b/gradle.properties index 785bbb4..7d97522 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ #libreforge-updater #Thu Jan 04 17:25:24 GMT 2024 kotlin.code.style=official -libreforge-version=4.53.1 +libreforge-version=4.54.0 version=10.0.0-b6