From 0c02bd36da85172d9410801effff6251a005db1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Szab=C3=B3?= Date: Mon, 22 Jul 2024 18:56:49 +0200 Subject: [PATCH] Added entity resolver APIs --- src/main/java/gg/auroramc/aurora/Aurora.java | 2 + .../gg/auroramc/aurora/api/AuroraAPI.java | 6 ++ .../aurora/api/entity/EntityManager.java | 57 +++++++++++++++++++ .../aurora/api/entity/EntityResolver.java | 18 ++++++ .../aurora/api/entity/EntitySpawner.java | 9 +++ .../api/entity/VanillaEntityResolver.java | 25 ++++++++ .../api/entity/VanillaEntitySpawner.java | 23 ++++++++ .../expansions/entity/EntityExpansion.java | 35 ++++++++++++ .../ecomobs/EcoMobsEntityResolver.java | 31 ++++++++++ .../ecomobs/EcoMobsEntitySpawner.java | 27 +++++++++ .../mythicmobs/MythicEntityResolver.java | 29 ++++++++++ .../mythicmobs/MythicEntitySpawner.java | 29 ++++++++++ 12 files changed, 291 insertions(+) create mode 100644 src/main/java/gg/auroramc/aurora/api/entity/EntityManager.java create mode 100644 src/main/java/gg/auroramc/aurora/api/entity/EntityResolver.java create mode 100644 src/main/java/gg/auroramc/aurora/api/entity/EntitySpawner.java create mode 100644 src/main/java/gg/auroramc/aurora/api/entity/VanillaEntityResolver.java create mode 100644 src/main/java/gg/auroramc/aurora/api/entity/VanillaEntitySpawner.java create mode 100644 src/main/java/gg/auroramc/aurora/expansions/entity/EntityExpansion.java create mode 100644 src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/ecomobs/EcoMobsEntityResolver.java create mode 100644 src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/ecomobs/EcoMobsEntitySpawner.java create mode 100644 src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/mythicmobs/MythicEntityResolver.java create mode 100644 src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/mythicmobs/MythicEntitySpawner.java diff --git a/src/main/java/gg/auroramc/aurora/Aurora.java b/src/main/java/gg/auroramc/aurora/Aurora.java index 84e523a..f4548f3 100644 --- a/src/main/java/gg/auroramc/aurora/Aurora.java +++ b/src/main/java/gg/auroramc/aurora/Aurora.java @@ -10,6 +10,7 @@ import gg.auroramc.aurora.config.Config; import gg.auroramc.aurora.api.expansions.ExpansionManager; import gg.auroramc.aurora.expansions.economy.EconomyExpansion; +import gg.auroramc.aurora.expansions.entity.EntityExpansion; import gg.auroramc.aurora.expansions.item.ItemExpansion; import gg.auroramc.aurora.expansions.leaderboard.LeaderboardExpansion; import gg.auroramc.aurora.expansions.numberformat.NumberFormatExpansion; @@ -78,6 +79,7 @@ private void setupExpansions() { expansionManager.loadExpansion(EconomyExpansion.class); expansionManager.loadExpansion(NumberFormatExpansion.class); expansionManager.loadExpansion(ItemExpansion.class); + expansionManager.loadExpansion(EntityExpansion.class); expansionManager.loadExpansion(LeaderboardExpansion.class); if (DependencyManager.hasDep(Dep.WORLDGUARD)) { diff --git a/src/main/java/gg/auroramc/aurora/api/AuroraAPI.java b/src/main/java/gg/auroramc/aurora/api/AuroraAPI.java index 6c99271..8699a3e 100644 --- a/src/main/java/gg/auroramc/aurora/api/AuroraAPI.java +++ b/src/main/java/gg/auroramc/aurora/api/AuroraAPI.java @@ -1,6 +1,7 @@ package gg.auroramc.aurora.api; import gg.auroramc.aurora.Aurora; +import gg.auroramc.aurora.api.entity.EntityManager; import gg.auroramc.aurora.api.expansions.ExpansionManager; import gg.auroramc.aurora.api.item.ItemManager; import gg.auroramc.aurora.api.placeholder.PlaceholderHandler; @@ -9,6 +10,7 @@ import gg.auroramc.aurora.api.user.UserManager; import gg.auroramc.aurora.expansions.economy.AuroraEconomy; import gg.auroramc.aurora.expansions.economy.EconomyExpansion; +import gg.auroramc.aurora.expansions.entity.EntityExpansion; import gg.auroramc.aurora.expansions.item.ItemExpansion; import gg.auroramc.aurora.expansions.leaderboard.LeaderboardExpansion; import gg.auroramc.aurora.expansions.numberformat.NumberFormatExpansion; @@ -142,4 +144,8 @@ public static RegionExpansion getRegionManager() { public static ItemManager getItemManager() { return Aurora.getExpansionManager().getExpansion(ItemExpansion.class).getItemManager(); } + + public static EntityManager getEntityManager() { + return Aurora.getExpansionManager().getExpansion(EntityExpansion.class).getEntityManager(); + } } diff --git a/src/main/java/gg/auroramc/aurora/api/entity/EntityManager.java b/src/main/java/gg/auroramc/aurora/api/entity/EntityManager.java new file mode 100644 index 0000000..f614ce5 --- /dev/null +++ b/src/main/java/gg/auroramc/aurora/api/entity/EntityManager.java @@ -0,0 +1,57 @@ +package gg.auroramc.aurora.api.entity; + + +import gg.auroramc.aurora.api.dependency.Dep; +import gg.auroramc.aurora.api.item.TypeId; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class EntityManager { + private final VanillaEntityResolver vanillaEntityResolver = new VanillaEntityResolver(); + private final Map resolvers = new LinkedHashMap<>(); + + public void registerResolver(String plugin, EntityResolver resolver) { + resolvers.put(plugin, resolver); + } + + public void registerResolver(Dep plugin, EntityResolver resolver) { + resolvers.put(plugin.getId().toLowerCase(), resolver); + } + + public EntityResolver getResolver(String plugin) { + return resolvers.get(plugin); + } + + public void unregisterResolver(String plugin) { + resolvers.remove(plugin.toLowerCase()); + } + + public TypeId resolveId(Entity entity) { + for (EntityResolver resolver : resolvers.values()) { + if (resolver.matches(entity)) { + return resolver.resolveId(entity); + } + } + return TypeId.from(entity.getType()); + } + + public EntitySpawner resolveEntitySpawner(TypeId typeId, @Nullable Player player) { + if (typeId.namespace().equalsIgnoreCase("minecraft")) + return vanillaEntityResolver.resolveEntitySpawner(typeId.id(), player); + + for (var resolver : resolvers.entrySet()) { + if (resolver.getKey().equalsIgnoreCase(typeId.namespace())) { + return resolver.getValue().resolveEntitySpawner(typeId.id(), player); + } + } + return vanillaEntityResolver.resolveEntitySpawner(typeId.id(), player); + } + + public EntitySpawner resolveEntitySpawner(TypeId typeId) { + return resolveEntitySpawner(typeId, null); + } +} diff --git a/src/main/java/gg/auroramc/aurora/api/entity/EntityResolver.java b/src/main/java/gg/auroramc/aurora/api/entity/EntityResolver.java new file mode 100644 index 0000000..e4bfa93 --- /dev/null +++ b/src/main/java/gg/auroramc/aurora/api/entity/EntityResolver.java @@ -0,0 +1,18 @@ +package gg.auroramc.aurora.api.entity; + +import gg.auroramc.aurora.api.item.TypeId; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; + +public interface EntityResolver { + boolean matches(Entity entity); + + TypeId resolveId(Entity entity); + + EntitySpawner resolveEntitySpawner(String id, @Nullable Player player); + + default EntitySpawner resolveEntitySpawner(String id) { + return resolveEntitySpawner(id, null); + } +} diff --git a/src/main/java/gg/auroramc/aurora/api/entity/EntitySpawner.java b/src/main/java/gg/auroramc/aurora/api/entity/EntitySpawner.java new file mode 100644 index 0000000..095ecab --- /dev/null +++ b/src/main/java/gg/auroramc/aurora/api/entity/EntitySpawner.java @@ -0,0 +1,9 @@ +package gg.auroramc.aurora.api.entity; + +import org.bukkit.Location; + +import java.util.Map; + +public interface EntitySpawner { + void spawn(Location location, Map args); +} diff --git a/src/main/java/gg/auroramc/aurora/api/entity/VanillaEntityResolver.java b/src/main/java/gg/auroramc/aurora/api/entity/VanillaEntityResolver.java new file mode 100644 index 0000000..cd168f3 --- /dev/null +++ b/src/main/java/gg/auroramc/aurora/api/entity/VanillaEntityResolver.java @@ -0,0 +1,25 @@ +package gg.auroramc.aurora.api.entity; + +import gg.auroramc.aurora.api.item.TypeId; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; + +public class VanillaEntityResolver implements EntityResolver { + + @Override + public boolean matches(Entity entity) { + return true; + } + + @Override + public TypeId resolveId(Entity entity) { + return TypeId.from(entity.getType()); + } + + @Override + public EntitySpawner resolveEntitySpawner(String id, @Nullable Player player) { + return new VanillaEntitySpawner(EntityType.valueOf(id.toUpperCase())); + } +} diff --git a/src/main/java/gg/auroramc/aurora/api/entity/VanillaEntitySpawner.java b/src/main/java/gg/auroramc/aurora/api/entity/VanillaEntitySpawner.java new file mode 100644 index 0000000..0dc4973 --- /dev/null +++ b/src/main/java/gg/auroramc/aurora/api/entity/VanillaEntitySpawner.java @@ -0,0 +1,23 @@ +package gg.auroramc.aurora.api.entity; + +import gg.auroramc.aurora.Aurora; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.EntityType; + +import java.util.Map; + +public class VanillaEntitySpawner implements EntitySpawner { + private final EntityType entityType; + + public VanillaEntitySpawner(EntityType entityType) { + this.entityType = entityType; + } + + @Override + public void spawn(Location location, Map args) { + Bukkit.getRegionScheduler().run(Aurora.getInstance(), location, (task) -> { + location.getWorld().spawnEntity(location, entityType); + }); + } +} diff --git a/src/main/java/gg/auroramc/aurora/expansions/entity/EntityExpansion.java b/src/main/java/gg/auroramc/aurora/expansions/entity/EntityExpansion.java new file mode 100644 index 0000000..5b2104f --- /dev/null +++ b/src/main/java/gg/auroramc/aurora/expansions/entity/EntityExpansion.java @@ -0,0 +1,35 @@ +package gg.auroramc.aurora.expansions.entity; + +import gg.auroramc.aurora.Aurora; +import gg.auroramc.aurora.api.dependency.Dep; +import gg.auroramc.aurora.api.dependency.DependencyManager; +import gg.auroramc.aurora.api.entity.EntityManager; +import gg.auroramc.aurora.api.expansions.AuroraExpansion; +import gg.auroramc.aurora.expansions.entity.resolvers.ecomobs.EcoMobsEntityResolver; +import gg.auroramc.aurora.expansions.entity.resolvers.mythicmobs.MythicEntityResolver; +import lombok.Getter; + +@Getter +public class EntityExpansion implements AuroraExpansion { + private EntityManager entityManager; + + @Override + public void hook() { + entityManager = new EntityManager(); + + if (DependencyManager.hasDep(Dep.MYTHICMOBS)) { + entityManager.registerResolver(Dep.MYTHICMOBS, new MythicEntityResolver()); + Aurora.logger().debug("Hooked into MythicMobs for entity resolvers."); + } + + if (DependencyManager.hasEveryDep("Eco", "EcoMobs")) { + entityManager.registerResolver("ecomobs", new EcoMobsEntityResolver()); + Aurora.logger().debug("Hooked into EcoMobs for entity resolvers."); + } + } + + @Override + public boolean canHook() { + return true; + } +} diff --git a/src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/ecomobs/EcoMobsEntityResolver.java b/src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/ecomobs/EcoMobsEntityResolver.java new file mode 100644 index 0000000..47015db --- /dev/null +++ b/src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/ecomobs/EcoMobsEntityResolver.java @@ -0,0 +1,31 @@ +package gg.auroramc.aurora.expansions.entity.resolvers.ecomobs; + +import com.willfp.eco.core.entities.Entities; +import gg.auroramc.aurora.api.entity.EntityResolver; +import gg.auroramc.aurora.api.entity.EntitySpawner; +import gg.auroramc.aurora.api.item.TypeId; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.Nullable; + +public class EcoMobsEntityResolver implements EntityResolver { + private final NamespacedKey namespacedKey = new NamespacedKey("ecomobs", "mob"); + + @Override + public boolean matches(Entity entity) { + return entity.getPersistentDataContainer().has(namespacedKey); + } + + @Override + public TypeId resolveId(Entity entity) { + String id = entity.getPersistentDataContainer().get(namespacedKey, PersistentDataType.STRING); + return new TypeId("ecomobs", id); + } + + @Override + public EntitySpawner resolveEntitySpawner(String id, @Nullable Player player) { + return new EcoMobsEntitySpawner(Entities.lookup("ecomobs:" + id)); + } +} diff --git a/src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/ecomobs/EcoMobsEntitySpawner.java b/src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/ecomobs/EcoMobsEntitySpawner.java new file mode 100644 index 0000000..1351a6c --- /dev/null +++ b/src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/ecomobs/EcoMobsEntitySpawner.java @@ -0,0 +1,27 @@ +package gg.auroramc.aurora.expansions.entity.resolvers.ecomobs; + +import com.willfp.eco.core.entities.TestableEntity; +import gg.auroramc.aurora.Aurora; +import gg.auroramc.aurora.api.entity.EntitySpawner; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.EntityType; + +import java.util.Map; + +public class EcoMobsEntitySpawner implements EntitySpawner { + private final TestableEntity entityType; + + public EcoMobsEntitySpawner(TestableEntity entityType) { + this.entityType = entityType; + } + + @Override + public void spawn(Location location, Map args) { + if(entityType == null) { + Aurora.logger().warning("Failed to spawn entity, because eco entity is null"); + return; + } + Bukkit.getRegionScheduler().run(Aurora.getInstance(), location, (task) -> entityType.spawn(location)); + } +} diff --git a/src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/mythicmobs/MythicEntityResolver.java b/src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/mythicmobs/MythicEntityResolver.java new file mode 100644 index 0000000..824af50 --- /dev/null +++ b/src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/mythicmobs/MythicEntityResolver.java @@ -0,0 +1,29 @@ +package gg.auroramc.aurora.expansions.entity.resolvers.mythicmobs; + +import gg.auroramc.aurora.api.entity.EntityResolver; +import gg.auroramc.aurora.api.entity.EntitySpawner; +import gg.auroramc.aurora.api.item.TypeId; +import io.lumine.mythic.bukkit.MythicBukkit; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; + +public class MythicEntityResolver implements EntityResolver { + + @Override + public boolean matches(Entity entity) { + return MythicBukkit.inst().getMobManager().isMythicMob(entity); + } + + @Override + public TypeId resolveId(Entity entity) { + var id = MythicBukkit.inst().getMobManager().getMythicMobInstance(entity).getType().getInternalName(); + return new TypeId("mythicmobs", id); + } + + @Override + public EntitySpawner resolveEntitySpawner(String id, @Nullable Player player) { + return new MythicEntitySpawner(id); + } +} diff --git a/src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/mythicmobs/MythicEntitySpawner.java b/src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/mythicmobs/MythicEntitySpawner.java new file mode 100644 index 0000000..4ad0f1c --- /dev/null +++ b/src/main/java/gg/auroramc/aurora/expansions/entity/resolvers/mythicmobs/MythicEntitySpawner.java @@ -0,0 +1,29 @@ +package gg.auroramc.aurora.expansions.entity.resolvers.mythicmobs; + +import gg.auroramc.aurora.Aurora; +import gg.auroramc.aurora.api.entity.EntitySpawner; +import io.lumine.mythic.bukkit.MythicBukkit; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.EntityType; + +import java.util.Map; + +public class MythicEntitySpawner implements EntitySpawner { + private final String id; + + public MythicEntitySpawner(String id) { + this.id = id; + } + + @Override + public void spawn(Location location, Map args) { + Bukkit.getRegionScheduler().run(Aurora.getInstance(), location, (task) -> { + var level = args.containsKey("level") ? (double) args.get("level") : 1.0; + var mob = MythicBukkit.inst().getMobManager().spawnMob(id, location, level); + if (mob == null) { + Aurora.logger().warning("Failed to spawn mythic mob with id " + id); + } + }); + } +}