diff --git a/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/ecobosses/proxy/v1_16_R1/CustomEntitySpawner.java b/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/ecobosses/proxy/v1_16_R1/CustomEntitySpawner.java new file mode 100644 index 0000000..1d844d3 --- /dev/null +++ b/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/ecobosses/proxy/v1_16_R1/CustomEntitySpawner.java @@ -0,0 +1,22 @@ +package com.willfp.ecobosses.proxy.v1_16_R1; + +import com.willfp.ecobosses.proxy.proxies.CustomEntitySpawnerProxy; +import com.willfp.ecobosses.proxy.proxies.CustomIllusionerProxy; +import com.willfp.ecobosses.proxy.util.CustomEntity; +import org.bukkit.Location; +import org.bukkit.entity.LivingEntity; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@SuppressWarnings("unchecked") +public class CustomEntitySpawner implements CustomEntitySpawnerProxy { + @Override + public @Nullable T spawnCustomEntity(final Class> entityClass, + @NotNull final Location location) { + if (entityClass.equals(CustomIllusionerProxy.class)) { + return (T) CustomIllusioner.spawn(location); + } + + return null; + } +} diff --git a/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/ecobosses/proxy/v1_16_R1/CustomIllusioner.java b/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/ecobosses/proxy/v1_16_R1/CustomIllusioner.java index 36ced13..b4d596c 100644 --- a/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/ecobosses/proxy/v1_16_R1/CustomIllusioner.java +++ b/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/ecobosses/proxy/v1_16_R1/CustomIllusioner.java @@ -18,21 +18,18 @@ import net.minecraft.server.v1_16_R1.PathfinderGoalNearestAttackableTarget; import net.minecraft.server.v1_16_R1.PathfinderGoalRandomStroll; import org.bukkit.Location; import org.bukkit.craftbukkit.v1_16_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R1.util.CraftNamespacedKey; -import org.bukkit.persistence.PersistentDataType; +import org.bukkit.entity.Illusioner; import org.jetbrains.annotations.NotNull; public class CustomIllusioner extends EntityIllagerIllusioner implements CustomIllusionerProxy { /** * Instantiate a new custom illusioner entity. * - * @param location The location to spawn it at. + * @param location The location to spawn it at. */ public CustomIllusioner(@NotNull final Location location) { super(EntityTypes.ILLUSIONER, ((CraftWorld) location.getWorld()).getHandle()); - this.getBukkitEntity().getPersistentDataContainer().set(CraftNamespacedKey.fromString("ecobosses:type"), PersistentDataType.STRING, "custom_illusioner"); - this.setPosition(location.getX(), location.getY(), location.getZ()); this.goalSelector.a(0, new PathfinderGoalFloat(this)); @@ -51,10 +48,15 @@ public class CustomIllusioner extends EntityIllagerIllusioner implements CustomI this.targetSelector.a(3, (new PathfinderGoalNearestAttackableTarget<>(this, EntityIronGolem.class, false)).a(300)); } - @Override - public CustomIllusionerProxy spawn(@NotNull final Location location) { + /** + * Spawn illusioner. + * + * @param location The location. + * @return The illusioner. + */ + public static Illusioner spawn(@NotNull final Location location) { CustomIllusioner illusioner = new CustomIllusioner(location); ((CraftWorld) location.getWorld()).getHandle().addEntity(illusioner); - return illusioner; + return (Illusioner) illusioner.getBukkitEntity(); } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/EcoBoss.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/EcoBoss.java index 95ac342..2771035 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/EcoBoss.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/EcoBoss.java @@ -3,6 +3,9 @@ package com.willfp.ecobosses.bosses; import com.willfp.eco.internal.config.AbstractUndefinedConfig; import com.willfp.eco.util.internal.PluginDependent; import com.willfp.eco.util.plugin.AbstractEcoPlugin; +import com.willfp.ecobosses.bosses.util.BossbarProperties; +import com.willfp.ecobosses.bosses.util.SpawnTotem; +import com.willfp.ecobosses.bosses.util.bosstype.BossType; import lombok.AccessLevel; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -22,6 +25,36 @@ public class EcoBoss extends PluginDependent { @Getter(AccessLevel.PRIVATE) private final AbstractUndefinedConfig config; + /** + * The base entity spawner. + */ + @Getter + private final BossType bossType; + + /** + * If the boss bar is enabled. + */ + @Getter + private final boolean bossbarEnabled; + + /** + * The BossBar properties. + */ + @Getter + private final BossbarProperties bossbarProperties; + + /** + * If spawn totem is enabled. + */ + @Getter + private final boolean spawnTotemEnabled; + + /** + * The spawn totem. + */ + @Getter + private final SpawnTotem spawnTotem; + /** * Create a new Boss. * diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/listeners/SpawnListeners.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/listeners/SpawnListeners.java index 7bc55ac..e5b94e3 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/listeners/SpawnListeners.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/listeners/SpawnListeners.java @@ -2,6 +2,7 @@ package com.willfp.ecobosses.bosses.listeners; import com.willfp.eco.util.internal.PluginDependent; import com.willfp.eco.util.plugin.AbstractEcoPlugin; import com.willfp.ecobosses.bosses.util.SpawnTotem; +import com.willfp.ecobosses.proxy.proxies.CustomEntitySpawnerProxy; import com.willfp.ecobosses.proxy.proxies.CustomIllusionerProxy; import com.willfp.ecobosses.util.ProxyUtils; import org.bukkit.Material; diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/BossbarProperties.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/BossbarProperties.java new file mode 100644 index 0000000..92b050b --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/BossbarProperties.java @@ -0,0 +1,18 @@ +package com.willfp.ecobosses.bosses.util; + +import lombok.Data; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; + +@Data +public class BossbarProperties { + /** + * The BossBar color. + */ + private final BarColor color; + + /** + * The BossBar style. + */ + private final BarStyle style; +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/SpawnTotem.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/SpawnTotem.java index 619dea7..207bb94 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/SpawnTotem.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/SpawnTotem.java @@ -1,59 +1,22 @@ package com.willfp.ecobosses.bosses.util; -import lombok.Getter; +import lombok.Data; import org.bukkit.Material; -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; +@Data public class SpawnTotem { /** * The bottom block. */ - @Getter private final Material bottom; /** * The middle block. */ - @Getter private final Material middle; /** * The top block. */ - @Getter private final Material top; - - /** - * Create a new spawn totem. - * - * @param bottom The bottom block. - * @param middle The middle block. - * @param top The top block. - */ - public SpawnTotem(@NotNull final Material bottom, - @NotNull final Material middle, - @NotNull final Material top) { - this.bottom = bottom; - this.middle = middle; - this.top = top; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof SpawnTotem)) { - return false; - } - SpawnTotem that = (SpawnTotem) o; - return getBottom() == that.getBottom() && getMiddle() == that.getMiddle() && getTop() == that.getTop(); - } - - @Override - public int hashCode() { - return Objects.hash(getBottom(), getMiddle(), getTop()); - } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/bosstype/BossEntityUtils.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/bosstype/BossEntityUtils.java new file mode 100644 index 0000000..1cfb77b --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/bosstype/BossEntityUtils.java @@ -0,0 +1,25 @@ +package com.willfp.ecobosses.bosses.util.bosstype; + +import com.willfp.ecobosses.proxy.util.CustomEntities; +import lombok.experimental.UtilityClass; +import org.bukkit.entity.EntityType; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +@UtilityClass +public class BossEntityUtils { + /** + * Get boss type. + * + * @param id The name. + * @return The boss type. + */ + public static BossType getBossType(@NotNull final String id) { + if (CustomEntities.getEntityClass(id) != null) { + return new CustomBossType(Objects.requireNonNull(CustomEntities.getEntityClass(id))); + } else { + return new VanillaBossType(Objects.requireNonNull(EntityType.valueOf(id.toUpperCase()).getEntityClass())); + } + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/bosstype/BossType.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/bosstype/BossType.java new file mode 100644 index 0000000..0a55461 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/bosstype/BossType.java @@ -0,0 +1,15 @@ +package com.willfp.ecobosses.bosses.util.bosstype; + +import org.bukkit.Location; +import org.bukkit.entity.LivingEntity; +import org.jetbrains.annotations.NotNull; + +public abstract class BossType { + /** + * Spawn boss entity. + * + * @param location The location. + * @return The entity. + */ + public abstract LivingEntity spawnBossEntity(@NotNull Location location); +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/bosstype/CustomBossType.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/bosstype/CustomBossType.java new file mode 100644 index 0000000..ddbbf90 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/bosstype/CustomBossType.java @@ -0,0 +1,29 @@ +package com.willfp.ecobosses.bosses.util.bosstype; + +import com.willfp.ecobosses.proxy.proxies.CustomEntitySpawnerProxy; +import com.willfp.ecobosses.proxy.util.CustomEntity; +import com.willfp.ecobosses.util.ProxyUtils; +import org.bukkit.Location; +import org.bukkit.entity.LivingEntity; +import org.jetbrains.annotations.NotNull; + +class CustomBossType extends BossType { + /** + * The entity type. + */ + private final Class> entityClass; + + /** + * Create new vanilla boss type. + * + * @param entityClass The entity class. + */ + CustomBossType(@NotNull final Class> entityClass) { + this.entityClass = entityClass; + } + + @Override + public LivingEntity spawnBossEntity(@NotNull final Location location) { + return ProxyUtils.getProxy(CustomEntitySpawnerProxy.class).spawnCustomEntity(entityClass, location); + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/bosstype/VanillaBossType.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/bosstype/VanillaBossType.java new file mode 100644 index 0000000..b521101 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/bosstype/VanillaBossType.java @@ -0,0 +1,29 @@ +package com.willfp.ecobosses.bosses.util.bosstype; + +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +class VanillaBossType extends BossType { + /** + * The entity type. + */ + private final Class entityClass; + + /** + * Create new vanilla boss type. + * + * @param entityClass The entity class. + */ + VanillaBossType(@NotNull final Class entityClass) { + this.entityClass = entityClass; + } + + @Override + public LivingEntity spawnBossEntity(@NotNull final Location location) { + return (LivingEntity) Objects.requireNonNull(location.getWorld()).spawn(location, entityClass); + } +} diff --git a/eco-core/core-plugin/src/main/resources/bosses/illusioner.yml b/eco-core/core-plugin/src/main/resources/bosses/illusioner.yml index 12cecc3..5d59e32 100644 --- a/eco-core/core-plugin/src/main/resources/bosses/illusioner.yml +++ b/eco-core/core-plugin/src/main/resources/bosses/illusioner.yml @@ -4,7 +4,7 @@ name: "Illusioner" # Display name base-mob: custom_illusioner # Any existing mob - custom_illusioner is also accepted (like in the old Illusioner plugin) spawn-egg: - mob-type: illusioner + egg-material: illusioner_spawn_egg display-name: "Illusioner Spawn Egg" lore: [] diff --git a/eco-core/core-proxy/src/main/java/com/willfp/ecobosses/proxy/proxies/CustomEntitySpawnerProxy.java b/eco-core/core-proxy/src/main/java/com/willfp/ecobosses/proxy/proxies/CustomEntitySpawnerProxy.java new file mode 100644 index 0000000..fad8436 --- /dev/null +++ b/eco-core/core-proxy/src/main/java/com/willfp/ecobosses/proxy/proxies/CustomEntitySpawnerProxy.java @@ -0,0 +1,21 @@ +package com.willfp.ecobosses.proxy.proxies; + +import com.willfp.eco.util.proxy.AbstractProxy; +import com.willfp.ecobosses.proxy.util.CustomEntity; +import org.bukkit.Location; +import org.bukkit.entity.LivingEntity; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public interface CustomEntitySpawnerProxy extends AbstractProxy { + /** + * Spawn custom entity. + * + * @param The class. + * @param entityClass The custom entity proxy class. + * @param location The location. + * @return The bukkit entity, or null if invalid class. + */ + @Nullable T spawnCustomEntity(Class> entityClass, + @NotNull Location location); +} diff --git a/eco-core/core-proxy/src/main/java/com/willfp/ecobosses/proxy/proxies/CustomIllusionerProxy.java b/eco-core/core-proxy/src/main/java/com/willfp/ecobosses/proxy/proxies/CustomIllusionerProxy.java index 86721ac..6d4a715 100644 --- a/eco-core/core-proxy/src/main/java/com/willfp/ecobosses/proxy/proxies/CustomIllusionerProxy.java +++ b/eco-core/core-proxy/src/main/java/com/willfp/ecobosses/proxy/proxies/CustomIllusionerProxy.java @@ -5,4 +5,5 @@ import com.willfp.ecobosses.proxy.util.CustomEntity; import org.bukkit.entity.Illusioner; public interface CustomIllusionerProxy extends AbstractProxy, CustomEntity { + } diff --git a/eco-core/core-proxy/src/main/java/com/willfp/ecobosses/proxy/util/CustomEntities.java b/eco-core/core-proxy/src/main/java/com/willfp/ecobosses/proxy/util/CustomEntities.java new file mode 100644 index 0000000..6470f02 --- /dev/null +++ b/eco-core/core-proxy/src/main/java/com/willfp/ecobosses/proxy/util/CustomEntities.java @@ -0,0 +1,30 @@ +package com.willfp.ecobosses.proxy.util; + +import com.google.common.collect.BiMap; +import com.google.common.collect.ImmutableBiMap; +import com.willfp.ecobosses.proxy.proxies.CustomIllusionerProxy; +import lombok.experimental.UtilityClass; +import org.bukkit.entity.LivingEntity; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@UtilityClass +public class CustomEntities { + /** + * Registered custom entities. + */ + private static final BiMap>> REGISTRY = new ImmutableBiMap.Builder>>() + .put("custom_illusioner", CustomIllusionerProxy.class) + .build(); + + /** + * Get entity class. + * + * @param id The entity id. + * @return The class. + */ + @Nullable + public Class> getEntityClass(@NotNull final String id) { + return REGISTRY.get(id); + } +} diff --git a/eco-core/core-proxy/src/main/java/com/willfp/ecobosses/proxy/util/CustomEntity.java b/eco-core/core-proxy/src/main/java/com/willfp/ecobosses/proxy/util/CustomEntity.java index 5308244..18709d1 100644 --- a/eco-core/core-proxy/src/main/java/com/willfp/ecobosses/proxy/util/CustomEntity.java +++ b/eco-core/core-proxy/src/main/java/com/willfp/ecobosses/proxy/util/CustomEntity.java @@ -1,14 +1,7 @@ package com.willfp.ecobosses.proxy.util; -import org.bukkit.Location; -import org.jetbrains.annotations.NotNull; +import org.bukkit.entity.LivingEntity; + +public interface CustomEntity { -public interface CustomEntity { - /** - * Spawn a custom entity. - * - * @param location The location to spawn it at. - * @return The created entity. - */ - T spawn(@NotNull Location location); }