From 4fa14b356c06294114ae75adb7f76aba325c6bc2 Mon Sep 17 00:00:00 2001 From: Auxilor Date: Thu, 1 Apr 2021 12:15:02 +0100 Subject: [PATCH] Added effects system --- config/checkstyle/suppression.xml | 16 +----- .../com/willfp/ecobosses/bosses/EcoBoss.java | 39 +++++++++++++- .../ecobosses/bosses/LivingEcoBoss.java | 1 + .../ecobosses/bosses/effects/Effect.java | 33 ++++++++++++ .../ecobosses/bosses/effects/Effects.java | 30 +++++++++++ .../effects/effects/DamageNearbyPlayers.java | 52 +++++++++++++++++++ .../src/main/resources/bosses/alpha_wolf.yml | 1 + .../src/main/resources/bosses/illusioner.yml | 1 + .../src/main/resources/bosses/steel_golem.yml | 1 + .../src/main/resources/bosses/tarantula.yml | 1 + 10 files changed, 159 insertions(+), 16 deletions(-) create mode 100644 eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/effects/Effect.java create mode 100644 eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/effects/Effects.java create mode 100644 eco-core/core-plugin/src/main/java/com/willfp/ecobosses/bosses/effects/effects/DamageNearbyPlayers.java 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: