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 2771035..bc61817 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,13 +3,25 @@ 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 com.willfp.ecobosses.bosses.util.obj.BossbarProperties; +import com.willfp.ecobosses.bosses.util.obj.ImmunityOptions; +import com.willfp.ecobosses.bosses.util.obj.SpawnTotem; import lombok.AccessLevel; import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.boss.BarFlag; +import org.bukkit.boss.BossBar; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.persistence.PersistentDataType; import org.jetbrains.annotations.NotNull; +import java.util.List; import java.util.Objects; public class EcoBoss extends PluginDependent { @@ -28,7 +40,6 @@ public class EcoBoss extends PluginDependent { /** * The base entity spawner. */ - @Getter private final BossType bossType; /** @@ -55,6 +66,30 @@ public class EcoBoss extends PluginDependent { @Getter private final SpawnTotem spawnTotem; + /** + * The max health. + */ + @Getter + private final int maxHealth; + + /** + * The attack damage. + */ + @Getter + private final int attackDamage; + + /** + * The immunity options. + */ + @Getter + private final ImmunityOptions immunityOptions; + + /** + * The drops. + */ + @Getter + private final List drops; + /** * Create a new Boss. * @@ -74,6 +109,61 @@ public class EcoBoss extends PluginDependent { } } + /** + * Spawn the boss. + * + * @param location The location. + */ + public void spawn(@NotNull final Location location) { + LivingEntity entity = bossType.spawnBossEntity(location); + entity.getPersistentDataContainer().set(this.getPlugin().getNamespacedKeyFactory().create("boss"), PersistentDataType.STRING, name); + entity.setPersistent(true); + + AttributeInstance maxHealth = entity.getAttribute(Attribute.GENERIC_MAX_HEALTH); + assert maxHealth != null; + maxHealth.setBaseValue(this.getMaxHealth()); + + AttributeInstance attackDamage = entity.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE); + assert attackDamage != null; + attackDamage.setBaseValue(this.getAttackDamage()); + + createBossBar(entity); + } + + private void createBossBar(@NotNull final LivingEntity entity) { + BossBar bossBar = Bukkit.getServer().createBossBar( + this.getDisplayName(), + this.getBossbarProperties().getColor(), + this.getBossbarProperties().getStyle(), + (BarFlag) null + ); + + int radius = this.getPlugin().getConfigYml().getInt("bossbar-radius"); + + this.getPlugin().getRunnableFactory().create(runnable -> { + if (!entity.isDead()) { + bossBar.getPlayers().forEach(bossBar::removePlayer); + entity.getNearbyEntities(radius, radius, radius).forEach(entity1 -> { + if (entity1 instanceof Player) { + bossBar.addPlayer((Player) entity1); + } + }); + } else { + runnable.cancel(); + } + }).runTaskTimer(0, 40); + + this.getPlugin().getRunnableFactory().create(runnable -> { + if (!entity.isDead()) { + bossBar.setProgress(entity.getHealth() / entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); + } else { + bossBar.getPlayers().forEach(bossBar::removePlayer); + bossBar.setVisible(false); + runnable.cancel(); + } + }).runTaskTimer(0, 1); + } + @Override public boolean equals(final Object o) { if (this == o) { diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/listeners/AttackListeners.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/listeners/AttackListeners.java index 54aa6d0..344c9d2 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/listeners/AttackListeners.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/listeners/AttackListeners.java @@ -1,7 +1,7 @@ package com.willfp.ecobosses.bosses.listeners; import com.willfp.eco.util.NumberUtils; -import com.willfp.ecobosses.bosses.util.OptionedSound; +import com.willfp.ecobosses.bosses.util.obj.OptionedSound; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/listeners/DeathListeners.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/listeners/DeathListeners.java index cc6240c..48fefcf 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/listeners/DeathListeners.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/listeners/DeathListeners.java @@ -2,7 +2,7 @@ package com.willfp.ecobosses.bosses.listeners; import com.willfp.eco.util.events.entitydeathbyentity.EntityDeathByEntityEvent; -import com.willfp.ecobosses.bosses.util.OptionedSound; +import com.willfp.ecobosses.bosses.util.obj.OptionedSound; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; 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 e5b94e3..6457ef3 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 @@ -1,8 +1,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.bosses.util.obj.SpawnTotem; 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/options/GameplayOptions.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/options/GameplayOptions.java index 632f56d..2183b82 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/options/GameplayOptions.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/options/GameplayOptions.java @@ -2,8 +2,8 @@ package com.willfp.ecobosses.bosses.options; import com.willfp.eco.util.internal.PluginDependent; import com.willfp.eco.util.plugin.AbstractEcoPlugin; -import com.willfp.ecobosses.bosses.util.EffectOption; -import com.willfp.ecobosses.bosses.util.OptionedSound; +import com.willfp.ecobosses.bosses.util.obj.EffectOption; +import com.willfp.ecobosses.bosses.util.obj.OptionedSound; import com.willfp.ecobosses.config.EcoBossesConfigs; import lombok.Getter; import lombok.ToString; diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/options/IllusionerOptions.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/options/IllusionerOptions.java index 0f1f2c4..889cff7 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/options/IllusionerOptions.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/options/IllusionerOptions.java @@ -5,8 +5,8 @@ import com.willfp.eco.util.internal.PluginDependent; import com.willfp.eco.util.plugin.AbstractEcoPlugin; import com.willfp.eco.util.tuples.Pair; import com.willfp.ecobosses.config.EcoBossesConfigs; -import com.willfp.ecobosses.bosses.util.SpawnTotem; -import com.willfp.ecobosses.bosses.util.OptionedSound; +import com.willfp.ecobosses.bosses.util.obj.SpawnTotem; +import com.willfp.ecobosses.bosses.util.obj.OptionedSound; import lombok.Getter; import lombok.ToString; import org.bukkit.Material; diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/BossbarUtils.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/BossbarUtils.java index 5ba1fb3..4b45605 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/BossbarUtils.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/BossbarUtils.java @@ -12,37 +12,5 @@ import org.jetbrains.annotations.NotNull; @UtilityClass public class BossbarUtils { public BossBar createBossBar(@NotNull final LivingEntity entity) { - if (bossBar != null) { - return bossBar; - } - BossBar bossBar = Bukkit.getServer().createBossBar(this.displayName, IllusionerManager.OPTIONS.getColor(), IllusionerManager.OPTIONS.getStyle(), (BarFlag) null); - this.bossBar = bossBar; - - LivingEntity entity = (LivingEntity) this.getBukkitEntity(); - - plugin.getRunnableFactory().create(runnable -> { - if (!entity.isDead()) { - bossBar.getPlayers().forEach(bossBar::removePlayer); - entity.getNearbyEntities(50, 50, 50).forEach(entity1 -> { - if (entity1 instanceof Player) { - bossBar.addPlayer((Player) entity1); - } - }); - } else { - runnable.cancel(); - } - }).runTaskTimer(0, 40); - - plugin.getRunnableFactory().create(runnable -> { - if (!entity.isDead()) { - bossBar.setProgress(entity.getHealth() / entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); - } else { - bossBar.getPlayers().forEach(bossBar::removePlayer); - bossBar.setVisible(false); - runnable.cancel(); - } - }).runTaskTimer(0, 1); - - return bossBar; } } 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/obj/BossbarProperties.java similarity index 85% rename from eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/BossbarProperties.java rename to eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/BossbarProperties.java index 92b050b..bafecec 100644 --- 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/obj/BossbarProperties.java @@ -1,4 +1,4 @@ -package com.willfp.ecobosses.bosses.util; +package com.willfp.ecobosses.bosses.util.obj; import lombok.Data; import org.bukkit.boss.BarColor; diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/EffectOption.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/EffectOption.java similarity index 95% rename from eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/EffectOption.java rename to eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/EffectOption.java index 5ce2797..d5132e7 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/EffectOption.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/EffectOption.java @@ -1,4 +1,4 @@ -package com.willfp.ecobosses.bosses.util; +package com.willfp.ecobosses.bosses.util.obj; import lombok.Getter; import org.bukkit.potion.PotionEffectType; diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/ExperienceOptions.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/ExperienceOptions.java new file mode 100644 index 0000000..648ad48 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/ExperienceOptions.java @@ -0,0 +1,36 @@ +package com.willfp.ecobosses.bosses.util.obj; + +import com.willfp.eco.util.NumberUtils; + +public class ExperienceOptions { + /** + * The minimum xp to drop. + */ + private final int minimum; + + /** + * The maximum xp to drop. + */ + private final int maximum; + + /** + * Create new experience options. + * + * @param minimum Minimum xp. + * @param maximum Maximum xp. + */ + public ExperienceOptions(final int minimum, + final int maximum) { + this.minimum = minimum; + this.maximum = maximum; + } + + /** + * Generate an exp amount. + * + * @return The amount. + */ + public int generateXp() { + return NumberUtils.randInt(minimum, maximum); + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/ImmunityOptions.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/ImmunityOptions.java new file mode 100644 index 0000000..710098e --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/ImmunityOptions.java @@ -0,0 +1,31 @@ +package com.willfp.ecobosses.bosses.util.obj; + +import lombok.Data; + +@Data +public class ImmunityOptions { + /** + * If is immune to fire. + */ + private final boolean immuneToFire; + + /** + * If is immune to suffocation. + */ + private final boolean immuneToSuffocation; + + /** + * If is immune to drowning. + */ + private final boolean immuneToDrowning; + + /** + * If is immune to projectiles. + */ + private final boolean immuneToProjectiles; + + /** + * If is immune to explosions. + */ + private final boolean immuneToExplosions; +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/OptionedSound.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/OptionedSound.java similarity index 94% rename from eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/OptionedSound.java rename to eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/OptionedSound.java index a79ab1f..f3c4970 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/OptionedSound.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/OptionedSound.java @@ -1,4 +1,4 @@ -package com.willfp.ecobosses.bosses.util; +package com.willfp.ecobosses.bosses.util.obj; import lombok.Getter; import org.bukkit.Sound; 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/obj/SpawnTotem.java similarity index 87% rename from eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/SpawnTotem.java rename to eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/SpawnTotem.java index 207bb94..e7f2008 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/obj/SpawnTotem.java @@ -1,4 +1,4 @@ -package com.willfp.ecobosses.bosses.util; +package com.willfp.ecobosses.bosses.util.obj; import lombok.Data; import org.bukkit.Material; diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/SummonsOption.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/SummonsOption.java similarity index 93% rename from eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/SummonsOption.java rename to eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/SummonsOption.java index a4a3a3b..2f099ee 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/SummonsOption.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/util/obj/SummonsOption.java @@ -1,4 +1,4 @@ -package com.willfp.ecobosses.bosses.util; +package com.willfp.ecobosses.bosses.util.obj; import lombok.Getter; import org.bukkit.entity.EntityType; diff --git a/eco-core/core-plugin/src/main/resources/config.yml b/eco-core/core-plugin/src/main/resources/config.yml index 820db9d..52d8b3c 100644 --- a/eco-core/core-plugin/src/main/resources/config.yml +++ b/eco-core/core-plugin/src/main/resources/config.yml @@ -1,4 +1,6 @@ # # EcoBosses # by Auxilor -# \ No newline at end of file +# + +bossbar-radius: 50 # How far away players should be able to see the boss bar for bosses. \ No newline at end of file