From 32ef8d8c5c3116fa85ff7e6eed041b59dbe25a28 Mon Sep 17 00:00:00 2001 From: Auxilor Date: Tue, 1 Mar 2022 18:04:27 +0000 Subject: [PATCH] Began entity controller system --- .../java/com/willfp/eco/core/Handler.java | 11 +++++ .../core/entities/ai/ControlledEntity.java | 48 +++++++++++++++++++ .../core/entities/ai/goals/EntityGoal.java | 8 ++++ .../EntityGoalNearestAttackableTarget.java | 11 +++++ .../proxy/v1_17_R1/ControlledEntityFactory.kt | 12 +++++ .../proxy/v1_17_R1/ai/EcoControlledEntity.kt | 32 +++++++++++++ .../spigot/proxy/v1_17_R1/ai/EntityGoals.kt | 17 +++++++ .../spigot/proxy/v1_17_R1/ai/GoalFactory.kt | 14 ++++++ .../willfp/eco/internal/spigot/EcoHandler.kt | 7 +++ .../proxy/ControlledEntityFactoryProxy.kt | 10 ++++ 10 files changed, 170 insertions(+) create mode 100644 eco-api/src/main/java/com/willfp/eco/core/entities/ai/ControlledEntity.java create mode 100644 eco-api/src/main/java/com/willfp/eco/core/entities/ai/goals/EntityGoal.java create mode 100644 eco-api/src/main/java/com/willfp/eco/core/entities/ai/goals/EntityGoalNearestAttackableTarget.java create mode 100644 eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ControlledEntityFactory.kt create mode 100644 eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ai/EcoControlledEntity.kt create mode 100644 eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ai/EntityGoals.kt create mode 100644 eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ai/GoalFactory.kt create mode 100644 eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/ControlledEntityFactoryProxy.kt diff --git a/eco-api/src/main/java/com/willfp/eco/core/Handler.java b/eco-api/src/main/java/com/willfp/eco/core/Handler.java index e605f6a2..126a048c 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/Handler.java +++ b/eco-api/src/main/java/com/willfp/eco/core/Handler.java @@ -5,6 +5,7 @@ import com.willfp.eco.core.config.wrapper.ConfigFactory; import com.willfp.eco.core.data.ProfileHandler; import com.willfp.eco.core.data.keys.KeyRegistry; import com.willfp.eco.core.drops.DropQueueFactory; +import com.willfp.eco.core.entities.ai.ControlledEntity; import com.willfp.eco.core.events.EventManager; import com.willfp.eco.core.extensions.ExtensionLoader; import com.willfp.eco.core.factory.MetadataValueFactory; @@ -20,6 +21,7 @@ import net.kyori.adventure.platform.bukkit.BukkitAudiences; import org.bukkit.Location; import org.bukkit.NamespacedKey; import org.bukkit.entity.Entity; +import org.bukkit.entity.Mob; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -262,4 +264,13 @@ public interface Handler { @NotNull PluginProps getProps(@Nullable PluginProps existing, @NotNull Class plugin); + + /** + * Create controlled entity from a mob. + * + * @param mob The mob. + * @return The controlled entity. + */ + @NotNull + ControlledEntity createControlledEntity(@NotNull Mob mob); } diff --git a/eco-api/src/main/java/com/willfp/eco/core/entities/ai/ControlledEntity.java b/eco-api/src/main/java/com/willfp/eco/core/entities/ai/ControlledEntity.java new file mode 100644 index 00000000..7cae6f6d --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/entities/ai/ControlledEntity.java @@ -0,0 +1,48 @@ +package com.willfp.eco.core.entities.ai; + +import com.willfp.eco.core.Eco; +import com.willfp.eco.core.entities.ai.goals.EntityGoal; +import org.bukkit.entity.Mob; +import org.jetbrains.annotations.NotNull; + +/** + * A controlled entity allows for adding targets and goals to entities. + */ +public interface ControlledEntity { + /** + * Add a target to the entity. + * + * @param priority The priority. + * @param goal The goal. + * @return The entity. + */ + ControlledEntity addTarget(int priority, + @NotNull EntityGoal goal); + + /** + * Add a goal to the entity. + * + * @param priority The priority. + * @param goal The goal. + * @return The entity. + */ + ControlledEntity addGoal(int priority, + @NotNull EntityGoal goal); + + /** + * Get the mob back from the controlled entity. + * + * @return The mob. + */ + Mob getEntity(); + + /** + * Wrap an entity into a controlled entity in order to modify targets and goals. + * + * @param entity The entity. + * @return The controlled entity. + */ + static ControlledEntity from(@NotNull final Mob entity) { + return Eco.getHandler().createControlledEntity(entity); + } +} diff --git a/eco-api/src/main/java/com/willfp/eco/core/entities/ai/goals/EntityGoal.java b/eco-api/src/main/java/com/willfp/eco/core/entities/ai/goals/EntityGoal.java new file mode 100644 index 00000000..95d538f0 --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/entities/ai/goals/EntityGoal.java @@ -0,0 +1,8 @@ +package com.willfp.eco.core.entities.ai.goals; + +/** + * A goal for entity AI. + */ +public interface EntityGoal { + +} diff --git a/eco-api/src/main/java/com/willfp/eco/core/entities/ai/goals/EntityGoalNearestAttackableTarget.java b/eco-api/src/main/java/com/willfp/eco/core/entities/ai/goals/EntityGoalNearestAttackableTarget.java new file mode 100644 index 00000000..49e0ec3e --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/entities/ai/goals/EntityGoalNearestAttackableTarget.java @@ -0,0 +1,11 @@ +package com.willfp.eco.core.entities.ai.goals; + +import org.bukkit.entity.LivingEntity; +import org.jetbrains.annotations.NotNull; + +public record EntityGoalNearestAttackableTarget( + @NotNull Class targetClass, + boolean checkVisibility +) implements EntityGoal { + +} diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ControlledEntityFactory.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ControlledEntityFactory.kt new file mode 100644 index 00000000..5a29c429 --- /dev/null +++ b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ControlledEntityFactory.kt @@ -0,0 +1,12 @@ +package com.willfp.eco.internal.spigot.proxy.v1_17_R1 + +import com.willfp.eco.core.entities.ai.ControlledEntity +import com.willfp.eco.internal.spigot.proxy.ControlledEntityFactoryProxy +import com.willfp.eco.internal.spigot.proxy.v1_17_R1.ai.EcoControlledEntity +import org.bukkit.entity.Mob + +class ControlledEntityFactory : ControlledEntityFactoryProxy { + override fun createControlledEntity(entity: Mob): ControlledEntity { + return EcoControlledEntity(entity) + } +} diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ai/EcoControlledEntity.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ai/EcoControlledEntity.kt new file mode 100644 index 00000000..51c48483 --- /dev/null +++ b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ai/EcoControlledEntity.kt @@ -0,0 +1,32 @@ +package com.willfp.eco.internal.spigot.proxy.v1_17_R1.ai + +import com.willfp.eco.core.entities.ai.ControlledEntity +import com.willfp.eco.core.entities.ai.goals.EntityGoal +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity +import org.bukkit.entity.Mob + +class EcoControlledEntity( + private val handle: Mob +) : ControlledEntity { + override fun addGoal(priority: Int, goal: EntityGoal): ControlledEntity { + val craft = handle as? CraftEntity ?: return this + val nms = craft.handle as? net.minecraft.world.entity.Mob ?: return this + + nms.goalSelector.addGoal(priority, GoalFactory.getImplementation(goal).generateNMSGoal(goal, nms)) + + return this + } + + override fun addTarget(priority: Int, goal: EntityGoal): ControlledEntity { + val craft = handle as? CraftEntity ?: return this + val nms = craft.handle as? net.minecraft.world.entity.Mob ?: return this + + nms.targetSelector.addGoal(priority, GoalFactory.getImplementation(goal).generateNMSGoal(goal, nms)) + + return this + } + + override fun getEntity(): Mob { + return handle + } +} diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ai/EntityGoals.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ai/EntityGoals.kt new file mode 100644 index 00000000..1456c7f2 --- /dev/null +++ b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ai/EntityGoals.kt @@ -0,0 +1,17 @@ +package com.willfp.eco.internal.spigot.proxy.v1_17_R1.ai + +import com.willfp.eco.core.entities.ai.goals.EntityGoal +import com.willfp.eco.core.entities.ai.goals.EntityGoalNearestAttackableTarget +import net.minecraft.world.entity.Mob +import net.minecraft.world.entity.ai.goal.Goal +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal + +interface EcoEntityGoal { + fun generateNMSGoal(apiGoal: T, entity: Mob): Goal +} + +class NearestAttackableTargetImpl : EcoEntityGoal { + override fun generateNMSGoal(apiGoal: EntityGoalNearestAttackableTarget, entity: Mob): Goal { + return NearestAttackableTargetGoal(entity, apiGoal.targetClass, apiGoal.checkVisibility) + } +} diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ai/GoalFactory.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ai/GoalFactory.kt new file mode 100644 index 00000000..04b63264 --- /dev/null +++ b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ai/GoalFactory.kt @@ -0,0 +1,14 @@ +package com.willfp.eco.internal.spigot.proxy.v1_17_R1.ai + +import com.willfp.eco.core.entities.ai.goals.EntityGoal +import com.willfp.eco.core.entities.ai.goals.EntityGoalNearestAttackableTarget + +object GoalFactory { + fun getImplementation(apiGoal: T): EcoEntityGoal { + @Suppress("UNCHECKED_CAST") + return when (apiGoal) { + is EntityGoalNearestAttackableTarget -> NearestAttackableTargetImpl() + else -> throw IllegalArgumentException("Unknown API goal!") + } as EcoEntityGoal + } +} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoHandler.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoHandler.kt index 882d3dcd..501120eb 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoHandler.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoHandler.kt @@ -3,6 +3,7 @@ package com.willfp.eco.internal.spigot import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.Handler import com.willfp.eco.core.PluginProps +import com.willfp.eco.core.entities.ai.ControlledEntity import com.willfp.eco.core.fast.FastItemStack import com.willfp.eco.core.integrations.placeholder.PlaceholderIntegration import com.willfp.eco.internal.EcoCleaner @@ -28,12 +29,14 @@ import com.willfp.eco.internal.spigot.data.DataYml import com.willfp.eco.internal.spigot.data.EcoKeyRegistry import com.willfp.eco.internal.spigot.data.EcoProfileHandler import com.willfp.eco.internal.spigot.integrations.bstats.MetricHandler +import com.willfp.eco.internal.spigot.proxy.ControlledEntityFactoryProxy import com.willfp.eco.internal.spigot.proxy.DummyEntityFactoryProxy import com.willfp.eco.internal.spigot.proxy.FastItemStackFactoryProxy import net.kyori.adventure.platform.bukkit.BukkitAudiences import org.bukkit.Location import org.bukkit.NamespacedKey import org.bukkit.entity.Entity +import org.bukkit.entity.Mob import org.bukkit.inventory.ItemStack import java.util.logging.Logger @@ -160,4 +163,8 @@ class EcoHandler : EcoSpigotPlugin(), Handler { override fun getProps(existing: PluginProps?, plugin: Class): PluginProps { return existing ?: EcoPropsParser.parseForPlugin(plugin) } + + override fun createControlledEntity(mob: Mob): ControlledEntity { + return getProxy(ControlledEntityFactoryProxy::class.java).createControlledEntity(mob) + } } \ No newline at end of file diff --git a/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/ControlledEntityFactoryProxy.kt b/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/ControlledEntityFactoryProxy.kt new file mode 100644 index 00000000..c2b18420 --- /dev/null +++ b/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/ControlledEntityFactoryProxy.kt @@ -0,0 +1,10 @@ +package com.willfp.eco.internal.spigot.proxy + +import com.willfp.eco.core.entities.ai.ControlledEntity +import org.bukkit.entity.Mob + +interface ControlledEntityFactoryProxy { + fun createControlledEntity( + entity: Mob + ): ControlledEntity +}