diff --git a/MobArena.jar b/MobArena.jar index d76a86b..f0296d0 100644 Binary files a/MobArena.jar and b/MobArena.jar differ diff --git a/src/com/garbagemule/MobArena/MAUtils.java b/src/com/garbagemule/MobArena/MAUtils.java index 8d932d4..1bcdbef 100644 --- a/src/com/garbagemule/MobArena/MAUtils.java +++ b/src/com/garbagemule/MobArena/MAUtils.java @@ -1028,14 +1028,32 @@ public class MAUtils return false; } + public static double getDouble(Configuration config, String path) + { + return getDouble(config, path, 0D); + } + + public static double getDouble(Configuration config, String path, double def) + { + Object o = config.getProperty(path); + if (o instanceof Double) + return (Double) o; + else if (o instanceof Number) + return (Integer) o; + return def; + } + public static int getInt(Configuration config, String path) + { + return getInt(config, path, 0); + } + + public static int getInt(Configuration config, String path, int def) { Object o = config.getProperty(path); - if (o instanceof Integer) return (Integer) o; - - return 0; + return def; } diff --git a/src/com/garbagemule/MobArena/util/WaveUtils.java b/src/com/garbagemule/MobArena/util/WaveUtils.java index ea690fc..656488e 100644 --- a/src/com/garbagemule/MobArena/util/WaveUtils.java +++ b/src/com/garbagemule/MobArena/util/WaveUtils.java @@ -137,14 +137,12 @@ public class WaveUtils if (type == null || !isWaveWellDefined(config, path, branch, type)) return null; - // Wave result = null; if (branch == WaveBranch.RECURRENT) { int frequency = config.getInt(path + "frequency", 0); int priority = config.getInt(path + "priority", 0); int wave = MAUtils.getInt(config, path + "wave"); - //int wave = config.getInt(path + "wave", frequency); if (type == WaveType.DEFAULT) result = new DefaultWave(arena, name, wave, frequency, priority, config, path); @@ -158,7 +156,6 @@ public class WaveUtils else { int wave = MAUtils.getInt(config, path + "wave"); - //int wave = config.getInt(path + "wave", 0); if (type == WaveType.DEFAULT) result = new DefaultWave(arena, name, wave, config, path); @@ -199,6 +196,23 @@ public class WaveUtils // This boolean is used in the "leaf methods" boolean wellDefined = true; + // OPTIONAL: Health multiplier + int hMulti = MAUtils.getInt(config, path + "health-multiplier"); + if (hMulti < 0) + { + MobArena.warning("Invalid health multiplier '" + hMulti + "' in " + path); + wellDefined = false; + } + + // OPTIONAL: Amount multiplier + int aMulti = MAUtils.getInt(config, path + "amount-multiplier"); + if (aMulti < 0) + { + MobArena.warning("Invalid amount multiplier '" + aMulti + "' in " + path); + wellDefined = false; + } + + // Branch-specific nodes. if (branch == WaveBranch.RECURRENT) { // REQUIRED: Priority and frequency @@ -214,9 +228,9 @@ public class WaveUtils MobArena.warning("Missing 'frequency'-node in " + path); wellDefined = false; } + // OPTIONAL: Wave int wave = MAUtils.getInt(config, path + "wave"); - //int wave = config.getInt(path + "wave", frequency); if (wave < 0) { MobArena.warning("'wave' must be greater than 0 in " + path); @@ -227,7 +241,6 @@ public class WaveUtils { // REQUIRED: Wave number int wave = MAUtils.getInt(config, path + "wave"); - //int wave = config.getInt(path + "wave", 0); if (wave == 0) { MobArena.warning("Missing 'wave'-node in " + path); diff --git a/src/com/garbagemule/MobArena/waves/AbstractWave.java b/src/com/garbagemule/MobArena/waves/AbstractWave.java index 9942bc2..6577a59 100644 --- a/src/com/garbagemule/MobArena/waves/AbstractWave.java +++ b/src/com/garbagemule/MobArena/waves/AbstractWave.java @@ -18,6 +18,7 @@ public abstract class AbstractWave implements Wave private World world; private String waveName; private int wave, frequency, priority; + private double healthMultiplier, amountMultiplier; private WaveBranch branch; private WaveType type; private WaveGrowth growth; @@ -86,6 +87,10 @@ public abstract class AbstractWave implements Wave // Spawn and add to collection LivingEntity e = creature.spawn(getArena(), getWorld(), loc); getArena().addMonster(e); + + // Boost health + if (getHealthMultiplier() > 1) + e.setHealth((int) Math.min(150D, e.getHealth() * getHealthMultiplier())); // Grab a random target. if (e instanceof Creature) @@ -114,7 +119,8 @@ public abstract class AbstractWave implements Wave { for (int i = 0; i < entry.getValue(); i++) { - spawnMonster(entry.getKey(), spawnpoints.get(index % spawnpointCount)); + LivingEntity e = spawnMonster(entry.getKey(), spawnpoints.get(index % spawnpointCount)); + e.setHealth((int) Math.min(150D, e.getHealth() * healthMultiplier)); index++; } } @@ -161,6 +167,16 @@ public abstract class AbstractWave implements Wave return priority; } + public double getHealthMultiplier() + { + return healthMultiplier; + } + + public double getAmountMultiplier() + { + return amountMultiplier; + } + public String getName() { return waveName; @@ -182,6 +198,16 @@ public abstract class AbstractWave implements Wave this.growth = growth; } + public void setHealthMultiplier(double value) + { + healthMultiplier = Math.max(0.1D, value); + } + + public void setAmountMultiplier(double value) + { + amountMultiplier = Math.max(0.1D, value); + } + // MISC public String toString() { diff --git a/src/com/garbagemule/MobArena/waves/DefaultWave.java b/src/com/garbagemule/MobArena/waves/DefaultWave.java index 6a0d290..c357d2e 100644 --- a/src/com/garbagemule/MobArena/waves/DefaultWave.java +++ b/src/com/garbagemule/MobArena/waves/DefaultWave.java @@ -43,19 +43,20 @@ public class DefaultWave extends NormalWave List validSpawnpoints = WaveUtils.getValidSpawnpoints(getArena(), getArena().getLivingPlayers()); // Initialize the total amount of mobs to spawn - int totalToSpawn = getGrowth().getAmount(wave, getArena().getPlayerCount()); + int totalToSpawn = (int) (getGrowth().getAmount(wave, getArena().getPlayerCount()) * getAmountMultiplier()); // Spawn all the monsters spawnAll(getMonstersToSpawn(totalToSpawn), validSpawnpoints); } private Map getMonstersToSpawn(int totalToSpawn) - { + { Map result = new HashMap(); Random random = new Random(); int randomNumber; MACreature creature; - + + if (totalToSpawn < 1) totalToSpawn = 1; for (int i = 0; i < totalToSpawn; i++) { randomNumber = random.nextInt(getTotalProbability()); diff --git a/src/com/garbagemule/MobArena/waves/NormalWave.java b/src/com/garbagemule/MobArena/waves/NormalWave.java index d66fd51..65e6dd8 100644 --- a/src/com/garbagemule/MobArena/waves/NormalWave.java +++ b/src/com/garbagemule/MobArena/waves/NormalWave.java @@ -7,6 +7,7 @@ import java.util.TreeMap; import org.bukkit.util.config.Configuration; import com.garbagemule.MobArena.Arena; +import com.garbagemule.MobArena.MAUtils; import com.garbagemule.MobArena.util.WaveUtils; public abstract class NormalWave extends AbstractWave @@ -75,6 +76,10 @@ public abstract class NormalWave extends AbstractWave totalProbability = 50; } } + + // Load multipliers + setHealthMultiplier(MAUtils.getDouble(config, path + "health-multiplier", 1D)); + setAmountMultiplier(MAUtils.getDouble(config, path + "amount-multiplier", 1D)); } public int getTotalProbability() diff --git a/src/com/garbagemule/MobArena/waves/SpecialWave.java b/src/com/garbagemule/MobArena/waves/SpecialWave.java index 6e762f8..4c21d7f 100644 --- a/src/com/garbagemule/MobArena/waves/SpecialWave.java +++ b/src/com/garbagemule/MobArena/waves/SpecialWave.java @@ -68,7 +68,7 @@ public class SpecialWave extends NormalWave default: amount = playerCount + 1; break; } - result.put(entry.getValue(), amount); + result.put(entry.getValue(), (int) (amount * getAmountMultiplier())); break; } diff --git a/src/com/garbagemule/MobArena/waves/SwarmWave.java b/src/com/garbagemule/MobArena/waves/SwarmWave.java index d69e382..a4889ab 100644 --- a/src/com/garbagemule/MobArena/waves/SwarmWave.java +++ b/src/com/garbagemule/MobArena/waves/SwarmWave.java @@ -40,6 +40,10 @@ public class SwarmWave extends AbstractWave // And the amount amount = WaveUtils.getEnumFromString(SwarmAmount.class, config.getString(path + "amount"), SwarmAmount.LOW); + + // Load multipliers + setHealthMultiplier(MAUtils.getDouble(config, path + "health-multiplier", 1D)); + setAmountMultiplier(MAUtils.getDouble(config, path + "amount-multiplier", 1D)); } public void spawn(int wave) @@ -51,7 +55,8 @@ public class SwarmWave extends AbstractWave List validSpawnpoints = WaveUtils.getValidSpawnpoints(getArena(), getArena().getLivingPlayers()); // Spawn the hellians! - spawnAll(monster, amount.getAmount(getArena().getPlayerCount()), validSpawnpoints); + int toSpawn = (int) (amount.getAmount(getArena().getPlayerCount()) * getAmountMultiplier()); + spawnAll(monster, toSpawn, validSpawnpoints); } public void spawnAll(MACreature monster, int amount, List spawnpoints) diff --git a/src/com/garbagemule/MobArena/waves/Wave.java b/src/com/garbagemule/MobArena/waves/Wave.java index e6d2690..49260d8 100644 --- a/src/com/garbagemule/MobArena/waves/Wave.java +++ b/src/com/garbagemule/MobArena/waves/Wave.java @@ -133,6 +133,18 @@ public interface Wave */ public int getPriority(); + /** + * Get the wave's health multiplier. + * @return The health multiplier + */ + public double getHealthMultiplier(); + + /** + * Get the wave's amount multiplier. + * @return The amount multiplier + */ + public double getAmountMultiplier(); + /** * Get the wave's name. * @return The name