diff --git a/src/main/java/com/garbagemule/MobArena/MASpawnThread.java b/src/main/java/com/garbagemule/MobArena/MASpawnThread.java index c8ba354..48dcc71 100644 --- a/src/main/java/com/garbagemule/MobArena/MASpawnThread.java +++ b/src/main/java/com/garbagemule/MobArena/MASpawnThread.java @@ -166,6 +166,9 @@ public class MASpawnThread implements Runnable // Spawn the monster LivingEntity e = entry.getKey().spawn(arena, world, spawnpoint); + // Add potion effects + e.addPotionEffects(w.getEffects()); + // Add it to the arena. monsterManager.addMonster(e); @@ -196,7 +199,6 @@ public class MASpawnThread implements Runnable boss.setDrops(bw.getDrops()); bw.addMABoss(boss); bw.activateAbilities(arena); - e.addPotionEffects(bw.getPotions()); if (bw.getBossName() != null) { e.setCustomName(bw.getBossName()); e.setCustomNameVisible(true); diff --git a/src/main/java/com/garbagemule/MobArena/waves/AbstractWave.java b/src/main/java/com/garbagemule/MobArena/waves/AbstractWave.java index b6f1829..d84c4a6 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/AbstractWave.java +++ b/src/main/java/com/garbagemule/MobArena/waves/AbstractWave.java @@ -4,7 +4,9 @@ import com.garbagemule.MobArena.framework.Arena; import com.garbagemule.MobArena.waves.enums.WaveBranch; import com.garbagemule.MobArena.waves.enums.WaveType; import org.bukkit.Location; +import org.bukkit.potion.PotionEffect; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -20,7 +22,12 @@ public abstract class AbstractWave implements Wave private int firstWave, frequency, priority; private List spawnpoints; + private List effects; + public AbstractWave() { + this.effects = new ArrayList<>(); + } + @Override public abstract Map getMonstersToSpawn(int wave, int playerCount, Arena arena); @@ -38,6 +45,16 @@ public abstract class AbstractWave implements Wave this.spawnpoints = spawnpoints; } + @Override + public List getEffects() { + return effects; + } + + @Override + public void setEffects(List effects) { + this.effects = effects; + } + @Override public void announce(Arena arena, int wave) { type.announce(arena, wave); diff --git a/src/main/java/com/garbagemule/MobArena/waves/Wave.java b/src/main/java/com/garbagemule/MobArena/waves/Wave.java index 00e5182..925f85e 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/Wave.java +++ b/src/main/java/com/garbagemule/MobArena/waves/Wave.java @@ -4,6 +4,7 @@ import com.garbagemule.MobArena.framework.Arena; import com.garbagemule.MobArena.waves.enums.WaveBranch; import com.garbagemule.MobArena.waves.enums.WaveType; import org.bukkit.Location; +import org.bukkit.potion.PotionEffect; import java.util.List; import java.util.Map; @@ -40,6 +41,22 @@ public interface Wave */ void setSpawnpoints(List spawnpoints); + /** + * Get a list of potion effects that the monsters of this wave + * will be given when they spawn. + * + * @return a list of potion effects, may be empty + */ + List getEffects(); + + /** + * Set the list of potion effects that the monsters of this wave + * will be given when they spawn. + * + * @param effects a list of potion effects, must be non-null + */ + void setEffects(List effects); + /** * Announce to all players that this wave is spawning. * @param arena an arena diff --git a/src/main/java/com/garbagemule/MobArena/waves/WaveParser.java b/src/main/java/com/garbagemule/MobArena/waves/WaveParser.java index 2d0e2bd..1b5eb08 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/WaveParser.java +++ b/src/main/java/com/garbagemule/MobArena/waves/WaveParser.java @@ -32,13 +32,16 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import java.util.TreeSet; +import java.util.stream.Collectors; public class WaveParser { @@ -135,6 +138,9 @@ public class WaveParser // Grab the specific spawnpoints if any List spawnpoints = getSpawnpoints(arena, name, config); + // Potion effects + List effects = getPotionEffects(config); + // Recurrent must have priority + frequency, single must have firstWave if (branch == WaveBranch.RECURRENT && (priority == -1 || frequency <= 0)) { arena.getPlugin().getLogger().warning(WaveError.RECURRENT_NODES.format(name, arena.configName())); @@ -157,6 +163,9 @@ public class WaveParser // Aaand the spawnpoints result.setSpawnpoints(spawnpoints); + + // Potions + result.setEffects(effects); return result; } @@ -324,13 +333,6 @@ public class WaveParser List drops = ItemParser.parseItems(drp); result.setDrops(drops); - // Potions! - String pots = config.getString("potions"); - if (pots != null) { - List potions = PotionEffectParser.parsePotionEffects(pots); - if (potions != null) result.setPotions(potions); - } - return result; } @@ -412,6 +414,26 @@ public class WaveParser return result; } + + private static List getPotionEffects(ConfigurationSection config) { + String value = config.getString("effects"); + if (value == null) { + value = config.getString("potions"); + } + if (value != null) { + List parsed = PotionEffectParser.parsePotionEffects(value); + return (parsed != null) ? parsed : Collections.emptyList(); + } + + List list = config.getStringList("effects"); + if (list.isEmpty()) { + list = config.getStringList("potions"); + } + return list.stream() + .map(PotionEffectParser::parsePotionEffect) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } private static Map> getUpgradeMap(ConfigurationSection config) { ConfigurationSection section = config.getConfigurationSection("upgrades"); diff --git a/src/main/java/com/garbagemule/MobArena/waves/types/BossWave.java b/src/main/java/com/garbagemule/MobArena/waves/types/BossWave.java index a63b6cf..f4c685d 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/types/BossWave.java +++ b/src/main/java/com/garbagemule/MobArena/waves/types/BossWave.java @@ -13,7 +13,6 @@ import com.garbagemule.MobArena.waves.ability.AbilityInfo; import com.garbagemule.MobArena.waves.enums.BossHealth; import com.garbagemule.MobArena.waves.enums.WaveType; import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffect; import java.util.ArrayList; import java.util.HashMap; @@ -40,13 +39,11 @@ public class BossWave extends AbstractWave private Thing reward; private List drops; - private List potions; public BossWave(MACreature monster) { this.monster = monster; this.bosses = new HashSet<>(); this.abilities = new ArrayList<>(); - this.potions = new ArrayList<>(); this.activated = false; this.abilityAnnounce = false; this.setType(WaveType.BOSS); @@ -138,14 +135,6 @@ public class BossWave extends AbstractWave this.drops = drops; } - public List getPotions() { - return potions; - } - - public void setPotions(List potions) { - this.potions = potions; - } - public void activateAbilities(Arena arena) { if (activated) { return; @@ -175,7 +164,6 @@ public class BossWave extends AbstractWave result.flatHealth = this.flatHealth; result.reward = this.reward; result.drops = this.drops; - result.potions = this.potions; result.bossName = this.bossName; // From AbstractWave @@ -183,6 +171,7 @@ public class BossWave extends AbstractWave result.setHealthMultiplier(getHealthMultiplier()); result.setName(getName()); result.setSpawnpoints(getSpawnpoints()); + result.setEffects(getEffects()); return result; } } diff --git a/src/main/java/com/garbagemule/MobArena/waves/types/DefaultWave.java b/src/main/java/com/garbagemule/MobArena/waves/types/DefaultWave.java index 3ac069a..0f8a865 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/types/DefaultWave.java +++ b/src/main/java/com/garbagemule/MobArena/waves/types/DefaultWave.java @@ -100,6 +100,7 @@ public class DefaultWave extends AbstractWave result.setHealthMultiplier(getHealthMultiplier()); result.setName(getName()); result.setSpawnpoints(getSpawnpoints()); + result.setEffects(getEffects()); return result; } } diff --git a/src/main/java/com/garbagemule/MobArena/waves/types/SpecialWave.java b/src/main/java/com/garbagemule/MobArena/waves/types/SpecialWave.java index 9e8a30b..24c602b 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/types/SpecialWave.java +++ b/src/main/java/com/garbagemule/MobArena/waves/types/SpecialWave.java @@ -61,6 +61,7 @@ public class SpecialWave extends AbstractWave result.setHealthMultiplier(getHealthMultiplier()); result.setName(getName()); result.setSpawnpoints(getSpawnpoints()); + result.setEffects(getEffects()); return result; } } diff --git a/src/main/java/com/garbagemule/MobArena/waves/types/SupplyWave.java b/src/main/java/com/garbagemule/MobArena/waves/types/SupplyWave.java index f61a92c..c21d040 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/types/SupplyWave.java +++ b/src/main/java/com/garbagemule/MobArena/waves/types/SupplyWave.java @@ -73,6 +73,7 @@ public class SupplyWave extends AbstractWave result.setHealthMultiplier(getHealthMultiplier()); result.setName(getName()); result.setSpawnpoints(getSpawnpoints()); + result.setEffects(getEffects()); return result; } } diff --git a/src/main/java/com/garbagemule/MobArena/waves/types/SwarmWave.java b/src/main/java/com/garbagemule/MobArena/waves/types/SwarmWave.java index 376880a..8576f7b 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/types/SwarmWave.java +++ b/src/main/java/com/garbagemule/MobArena/waves/types/SwarmWave.java @@ -50,6 +50,7 @@ public class SwarmWave extends AbstractWave result.setHealthMultiplier(getHealthMultiplier()); result.setName(getName()); result.setSpawnpoints(getSpawnpoints()); + result.setEffects(getEffects()); return result; } } diff --git a/src/main/java/com/garbagemule/MobArena/waves/types/UpgradeWave.java b/src/main/java/com/garbagemule/MobArena/waves/types/UpgradeWave.java index 57ac44b..196f7f4 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/types/UpgradeWave.java +++ b/src/main/java/com/garbagemule/MobArena/waves/types/UpgradeWave.java @@ -61,6 +61,7 @@ public class UpgradeWave extends AbstractWave result.setHealthMultiplier(getHealthMultiplier()); result.setName(getName()); result.setSpawnpoints(getSpawnpoints()); + result.setEffects(getEffects()); return result; }