From 9594bd612692fd137f83ebd45c2057ae245116a3 Mon Sep 17 00:00:00 2001 From: Andreas Troelsen Date: Mon, 11 Jun 2018 23:26:37 +0200 Subject: [PATCH] Allow potion effects on all wave types. Boss waves already support potion effects, but with this commit, the potions node moves up as a common node, so all waves that spawn monsters (all but upgrade waves) can now spawn those monsters with a list of potion effects applied to them. It's not possible to give certain potion effects to specific monster types. All monsters get all the effects listed in the node. Because we aren't actually giving potions but potion effects, the node is renamed from "potions" to "effects". However, to preserve backwards compatibility, both names are supported in this commit. Closes #453 --- .../garbagemule/MobArena/MASpawnThread.java | 4 ++- .../MobArena/waves/AbstractWave.java | 17 +++++++++ .../com/garbagemule/MobArena/waves/Wave.java | 17 +++++++++ .../MobArena/waves/WaveParser.java | 36 +++++++++++++++---- .../MobArena/waves/types/BossWave.java | 13 +------ .../MobArena/waves/types/DefaultWave.java | 1 + .../MobArena/waves/types/SpecialWave.java | 1 + .../MobArena/waves/types/SupplyWave.java | 1 + .../MobArena/waves/types/SwarmWave.java | 1 + .../MobArena/waves/types/UpgradeWave.java | 1 + 10 files changed, 72 insertions(+), 20 deletions(-) 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; }