From f85f9e20d76ada9e1ebe0e48f6193d3379e6b196 Mon Sep 17 00:00:00 2001 From: garbagemule Date: Mon, 24 Feb 2014 17:22:20 +0100 Subject: [PATCH] Add copy() method to Wave interface. When the WaveManager is queried for the next wave to be spawned via the next() method, it now returns a copy of the wave instead of the wave itself. This is because waves (boss waves in particular) have state, and this state is transferred to the next occurrence of the given wave. This caused recurrent boss waves to inconsistently share state, which resulted in the BossAbilityThread bailing early after the first occurrence of the boss wave it belonged to. By copying the initial wave state in the WaveManager, the issue is fixed. Fixes: http://dev.bukkit.org/bukkit-plugins/mobarena/tickets/1220/ --- resources/plugin.yml | 2 +- src/com/garbagemule/MobArena/waves/Wave.java | 10 ++++++++ .../MobArena/waves/WaveManager.java | 4 ++-- .../MobArena/waves/types/BossWave.java | 23 ++++++++++++++----- .../MobArena/waves/types/DefaultWave.java | 8 +++++++ .../MobArena/waves/types/SpecialWave.java | 5 ++++ .../MobArena/waves/types/SupplyWave.java | 7 ++++++ .../MobArena/waves/types/SwarmWave.java | 7 ++++++ .../MobArena/waves/types/UpgradeWave.java | 11 +++++++++ 9 files changed, 68 insertions(+), 9 deletions(-) diff --git a/resources/plugin.yml b/resources/plugin.yml index 46da60a..d4f45c0 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -1,7 +1,7 @@ name: MobArena author: garbagemule main: com.garbagemule.MobArena.MobArena -version: 0.96.2.10 +version: 0.96.2.11 softdepend: [Multiverse-Core,Towny,Heroes,MagicSpells,Vault] commands: ma: diff --git a/src/com/garbagemule/MobArena/waves/Wave.java b/src/com/garbagemule/MobArena/waves/Wave.java index b7a98c2..da516d9 100644 --- a/src/com/garbagemule/MobArena/waves/Wave.java +++ b/src/com/garbagemule/MobArena/waves/Wave.java @@ -152,4 +152,14 @@ public interface Wave * @return true, if the wave should spawn, false otherwise */ public boolean matches(int wave); + + /** + * Make a copy of the wave. + *

+ * This method is used by the WaveManager in the {@code next()} method to + * ensure that boss waves in particular do not share state. + * + * @return a copy of the wave + */ + public Wave copy(); } \ No newline at end of file diff --git a/src/com/garbagemule/MobArena/waves/WaveManager.java b/src/com/garbagemule/MobArena/waves/WaveManager.java index cd59107..5801c97 100644 --- a/src/com/garbagemule/MobArena/waves/WaveManager.java +++ b/src/com/garbagemule/MobArena/waves/WaveManager.java @@ -66,11 +66,11 @@ public class WaveManager wave++; if (!singleWavesInstance.isEmpty() && singleWavesInstance.first().matches(wave)) { - currentWave = singleWavesInstance.pollFirst(); + currentWave = singleWavesInstance.pollFirst().copy(); } else { SortedSet matches = getMatchingRecurrentWaves(wave); - currentWave = (matches.isEmpty() ? defaultWave : matches.last()); + currentWave = (matches.isEmpty() ? defaultWave : matches.last()).copy(); } return currentWave; diff --git a/src/com/garbagemule/MobArena/waves/types/BossWave.java b/src/com/garbagemule/MobArena/waves/types/BossWave.java index 65020c6..3e91dc7 100644 --- a/src/com/garbagemule/MobArena/waves/types/BossWave.java +++ b/src/com/garbagemule/MobArena/waves/types/BossWave.java @@ -12,12 +12,8 @@ import org.bukkit.inventory.ItemStack; import com.garbagemule.MobArena.Messenger; import com.garbagemule.MobArena.Msg; import com.garbagemule.MobArena.framework.Arena; -import com.garbagemule.MobArena.waves.AbstractWave; -import com.garbagemule.MobArena.waves.BossAbilityThread; -import com.garbagemule.MobArena.waves.MABoss; -import com.garbagemule.MobArena.waves.MACreature; -import com.garbagemule.MobArena.waves.ability.Ability; -import com.garbagemule.MobArena.waves.ability.AbilityInfo; +import com.garbagemule.MobArena.waves.*; +import com.garbagemule.MobArena.waves.ability.*; import com.garbagemule.MobArena.waves.enums.*; public class BossWave extends AbstractWave @@ -141,4 +137,19 @@ public class BossWave extends AbstractWave Messenger.announce(arena, Msg.WAVE_BOSS_ABILITY, info.name()); } } + + public Wave copy() { + BossWave result = new BossWave(this.monster); + for (Ability ability : this.abilities) { + result.addBossAbility(ability); + } + result.abilityInterval = this.abilityInterval; + result.abilityAnnounce = this.abilityAnnounce; + result.useHealthMultiplier = this.useHealthMultiplier; + result.healthMultiplier = this.healthMultiplier; + result.flatHealth = this.flatHealth; + result.reward = this.reward; + result.bossName = this.bossName; + return result; + } } diff --git a/src/com/garbagemule/MobArena/waves/types/DefaultWave.java b/src/com/garbagemule/MobArena/waves/types/DefaultWave.java index cf4cf84..903d7b2 100644 --- a/src/com/garbagemule/MobArena/waves/types/DefaultWave.java +++ b/src/com/garbagemule/MobArena/waves/types/DefaultWave.java @@ -5,6 +5,7 @@ import java.util.*; import com.garbagemule.MobArena.framework.Arena; import com.garbagemule.MobArena.waves.AbstractWave; import com.garbagemule.MobArena.waves.MACreature; +import com.garbagemule.MobArena.waves.Wave; import com.garbagemule.MobArena.waves.enums.*; public class DefaultWave extends AbstractWave @@ -84,4 +85,11 @@ public class DefaultWave extends AbstractWave public void setFixed(boolean fixed) { this.fixed = fixed; } + + public Wave copy() { + DefaultWave result = new DefaultWave(monsterMap); + result.growth = this.growth; + result.fixed = this.fixed; + return result; + } } diff --git a/src/com/garbagemule/MobArena/waves/types/SpecialWave.java b/src/com/garbagemule/MobArena/waves/types/SpecialWave.java index 052b2bb..234c88c 100644 --- a/src/com/garbagemule/MobArena/waves/types/SpecialWave.java +++ b/src/com/garbagemule/MobArena/waves/types/SpecialWave.java @@ -5,6 +5,7 @@ import java.util.*; import com.garbagemule.MobArena.framework.Arena; import com.garbagemule.MobArena.waves.AbstractWave; import com.garbagemule.MobArena.waves.MACreature; +import com.garbagemule.MobArena.waves.Wave; import com.garbagemule.MobArena.waves.enums.WaveType; public class SpecialWave extends AbstractWave @@ -48,4 +49,8 @@ public class SpecialWave extends AbstractWave return result; } + + public Wave copy() { + return new SpecialWave(monsterMap); + } } diff --git a/src/com/garbagemule/MobArena/waves/types/SupplyWave.java b/src/com/garbagemule/MobArena/waves/types/SupplyWave.java index fef917e..bd603e9 100644 --- a/src/com/garbagemule/MobArena/waves/types/SupplyWave.java +++ b/src/com/garbagemule/MobArena/waves/types/SupplyWave.java @@ -2,6 +2,7 @@ package com.garbagemule.MobArena.waves.types; import java.util.*; +import com.garbagemule.MobArena.waves.Wave; import org.bukkit.inventory.ItemStack; import com.garbagemule.MobArena.framework.Arena; @@ -58,4 +59,10 @@ public class SupplyWave extends AbstractWave public void setDropList(List drops) { this.drops = drops; } + + public Wave copy() { + SupplyWave result = new SupplyWave(monsterMap); + result.drops = new ArrayList(this.drops); + return result; + } } diff --git a/src/com/garbagemule/MobArena/waves/types/SwarmWave.java b/src/com/garbagemule/MobArena/waves/types/SwarmWave.java index 547a312..1ce9c96 100644 --- a/src/com/garbagemule/MobArena/waves/types/SwarmWave.java +++ b/src/com/garbagemule/MobArena/waves/types/SwarmWave.java @@ -5,6 +5,7 @@ import java.util.*; import com.garbagemule.MobArena.framework.Arena; import com.garbagemule.MobArena.waves.AbstractWave; import com.garbagemule.MobArena.waves.MACreature; +import com.garbagemule.MobArena.waves.Wave; import com.garbagemule.MobArena.waves.enums.*; public class SwarmWave extends AbstractWave @@ -37,4 +38,10 @@ public class SwarmWave extends AbstractWave public void setAmount(SwarmAmount amount) { this.amount = amount; } + + public Wave copy() { + SwarmWave result = new SwarmWave(monster); + result.amount = this.amount; + return result; + } } diff --git a/src/com/garbagemule/MobArena/waves/types/UpgradeWave.java b/src/com/garbagemule/MobArena/waves/types/UpgradeWave.java index c0a399e..0b73446 100644 --- a/src/com/garbagemule/MobArena/waves/types/UpgradeWave.java +++ b/src/com/garbagemule/MobArena/waves/types/UpgradeWave.java @@ -2,6 +2,7 @@ package com.garbagemule.MobArena.waves.types; import java.util.*; +import com.garbagemule.MobArena.waves.Wave; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -44,6 +45,16 @@ public class UpgradeWave extends AbstractWave this.giveAll = giveAll; } + public Wave copy() { + Map> upgrades = new HashMap>(); + for (Map.Entry> entry : this.upgrades.entrySet()) { + upgrades.put(entry.getKey(), new ArrayList(entry.getValue())); + } + UpgradeWave result = new UpgradeWave(upgrades); + result.giveAll = this.giveAll; + return result; + } + /** * Represents an upgrade for an upgrade wave */