diff --git a/config/checkstyle/suppression.xml b/config/checkstyle/suppression.xml
index cb76125..7e74615 100644
--- a/config/checkstyle/suppression.xml
+++ b/config/checkstyle/suppression.xml
@@ -6,22 +6,10 @@
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
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 53170cf..dcf2224 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
@@ -1,11 +1,12 @@
package com.willfp.ecobosses.bosses;
import com.willfp.eco.internal.config.AbstractUndefinedConfig;
-import com.willfp.eco.util.NumberUtils;
import com.willfp.eco.util.StringUtils;
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.bosses.effects.Effect;
+import com.willfp.ecobosses.bosses.effects.Effects;
import com.willfp.ecobosses.bosses.util.bosstype.BossEntityUtils;
import com.willfp.ecobosses.bosses.util.bosstype.BossType;
import com.willfp.ecobosses.bosses.util.obj.*;
@@ -13,6 +14,7 @@ import com.willfp.ecobosses.bosses.util.obj.attacks.EffectOption;
import com.willfp.ecobosses.bosses.util.obj.attacks.SummonsOption;
import lombok.AccessLevel;
import lombok.Getter;
+import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
@@ -23,7 +25,6 @@ import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.*;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.inventory.ItemStack;
-import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.jetbrains.annotations.NotNull;
@@ -221,6 +222,11 @@ public class EcoBoss extends PluginDependent {
*/
private final Map livingBosses;
+ /**
+ * The effect names and arguments.
+ */
+ private final Map> effectNames;
+
/**
* Create a new Boss.
*
@@ -423,11 +429,40 @@ public class EcoBoss extends PluginDependent {
this.nearbyPlayersCommands.put(string, chance);
}
+ // Effects
+ this.effectNames = new HashMap<>();
+ for (String string : this.getConfig().getStrings("effects")) {
+ String effectName = string.split(":")[0];
+ List args = Arrays.asList(string.replace(effectName + ":", "").split(":"));
+ this.effectNames.put(effectName, args);
+ }
+
+ new HashMap<>(this.effectNames).forEach((string, args) -> {
+ if (Effects.getEffect(string, args) == null) {
+ this.effectNames.remove(string);
+ Bukkit.getLogger().warning("Invalid effect specified in " + this.name);
+ }
+ });
+
if (this.getConfig().getBool("enabled")) {
EcoBosses.addBoss(this);
}
}
+ /**
+ * Create effect tickers for Living Boss.
+ *
+ * @return The effects.
+ */
+ public Set createEffectTickers() {
+ Set effects = new HashSet<>();
+ this.effectNames.forEach((string, args) -> {
+ effects.add(Effects.getEffect(string, args));
+ });
+
+ return effects;
+ }
+
/**
* Spawn the boss.
*
diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/LivingEcoBoss.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/LivingEcoBoss.java
index 368c37c..a6eafe0 100644
--- a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/LivingEcoBoss.java
+++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/LivingEcoBoss.java
@@ -82,6 +82,7 @@ public class LivingEcoBoss extends PluginDependent {
)
);
}
+ this.tickers.addAll(boss.createEffectTickers());
AtomicLong currentTick = new AtomicLong(0);
diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/effects/Effect.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/effects/Effect.java
new file mode 100644
index 0000000..2ab264c
--- /dev/null
+++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/effects/Effect.java
@@ -0,0 +1,33 @@
+package com.willfp.ecobosses.bosses.effects;
+
+import com.willfp.ecobosses.bosses.tick.BossTicker;
+import lombok.Getter;
+import org.bukkit.Bukkit;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+public abstract class Effect implements BossTicker {
+ /**
+ * The effect args.
+ */
+ @Getter
+ private final List args;
+
+ /**
+ * Create a new effect.
+ *
+ * @param args The args.
+ */
+ protected Effect(@NotNull final List args) {
+ this.args = args;
+ }
+
+ public void showConfigError(@NotNull final String message) {
+ Bukkit.getLogger().warning("An effect is configured incorrectly!");
+ Bukkit.getLogger().warning(message);
+ Bukkit.getLogger().warning("Usage: " + getUsage());
+ }
+
+ public abstract String getUsage();
+}
diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/effects/Effects.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/effects/Effects.java
new file mode 100644
index 0000000..de40e49
--- /dev/null
+++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/effects/Effects.java
@@ -0,0 +1,30 @@
+package com.willfp.ecobosses.bosses.effects;
+
+import com.willfp.ecobosses.bosses.effects.effects.DamageNearbyPlayers;
+import lombok.experimental.UtilityClass;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+@UtilityClass
+public class Effects {
+ /**
+ * Get effect matching name.
+ *
+ * @param name The effect name.
+ * @param args The args.
+ * @return The found effect, or null.
+ */
+ @Nullable
+ public Effect getEffect(@NotNull final String name,
+ @NotNull final List args) {
+ switch (name.toLowerCase()) {
+ case "damage-nearby-players":
+ return new DamageNearbyPlayers(args);
+
+ default:
+ return null;
+ }
+ }
+}
diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/effects/effects/DamageNearbyPlayers.java b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/effects/effects/DamageNearbyPlayers.java
new file mode 100644
index 0000000..c8096cc
--- /dev/null
+++ b/eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/effects/effects/DamageNearbyPlayers.java
@@ -0,0 +1,52 @@
+package com.willfp.ecobosses.bosses.effects.effects;
+
+import com.willfp.ecobosses.bosses.EcoBoss;
+import com.willfp.ecobosses.bosses.effects.Effect;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+public class DamageNearbyPlayers extends Effect {
+ private final int frequency;
+ private final double damage;
+ private final double radius;
+ private final boolean triggerHandler;
+
+ public DamageNearbyPlayers(@NotNull final List args) {
+ super(args);
+
+ if (args.size() < 4) {
+ showConfigError("Incorrect amount of arguments!");
+ }
+
+ frequency = Integer.parseInt(args.get(0));
+ radius = Double.parseDouble(args.get(1));
+ damage = Double.parseDouble(args.get(2));
+ triggerHandler = Boolean.parseBoolean(args.get(3));
+ }
+
+ @Override
+ public String getUsage() {
+ return "damage-nearby-players::::";
+ }
+
+ @Override
+ public void tick(@NotNull final EcoBoss boss,
+ @NotNull final LivingEntity entity,
+ final long tick) {
+ if (tick % frequency == 0) {
+ for (Entity nearbyEntity : entity.getNearbyEntities(radius, radius, radius)) {
+ if (nearbyEntity instanceof Player) {
+ if (triggerHandler) {
+ ((Player) nearbyEntity).damage(damage, entity);
+ } else {
+ ((Player) nearbyEntity).damage(damage);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/eco-core/core-plugin/src/main/resources/bosses/alpha_wolf.yml b/eco-core/core-plugin/src/main/resources/bosses/alpha_wolf.yml
index 77e5e04..8375743 100644
--- a/eco-core/core-plugin/src/main/resources/bosses/alpha_wolf.yml
+++ b/eco-core/core-plugin/src/main/resources/bosses/alpha_wolf.yml
@@ -53,6 +53,7 @@ broadcast:
- "&f - %third%&f (%third_damage% Damage)"
- ""
+effects: []
defence:
immunities:
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 8b82c57..927eccf 100644
--- a/eco-core/core-plugin/src/main/resources/bosses/illusioner.yml
+++ b/eco-core/core-plugin/src/main/resources/bosses/illusioner.yml
@@ -53,6 +53,7 @@ broadcast:
- "&f - &9%third%&f (%third_damage% Damage)"
- ""
+effects: [ ]
defence:
immunities:
diff --git a/eco-core/core-plugin/src/main/resources/bosses/steel_golem.yml b/eco-core/core-plugin/src/main/resources/bosses/steel_golem.yml
index d290e3b..5d70c53 100644
--- a/eco-core/core-plugin/src/main/resources/bosses/steel_golem.yml
+++ b/eco-core/core-plugin/src/main/resources/bosses/steel_golem.yml
@@ -53,6 +53,7 @@ broadcast:
- "&f - &8%third%&f (%third_damage% Damage)"
- ""
+effects: []
defence:
immunities:
diff --git a/eco-core/core-plugin/src/main/resources/bosses/tarantula.yml b/eco-core/core-plugin/src/main/resources/bosses/tarantula.yml
index 49e9a69..2649aa8 100644
--- a/eco-core/core-plugin/src/main/resources/bosses/tarantula.yml
+++ b/eco-core/core-plugin/src/main/resources/bosses/tarantula.yml
@@ -53,6 +53,7 @@ broadcast:
- "&f - &4%third%&f (%third_damage% Damage)"
- ""
+effects: []
defence:
immunities: