diff --git a/src/main/java/com/garbagemule/MobArena/waves/WaveParser.java b/src/main/java/com/garbagemule/MobArena/waves/WaveParser.java index 1b5eb08..95f662d 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/WaveParser.java +++ b/src/main/java/com/garbagemule/MobArena/waves/WaveParser.java @@ -1,9 +1,9 @@ package com.garbagemule.MobArena.waves; -import com.garbagemule.MobArena.ArenaClass; import com.garbagemule.MobArena.framework.Arena; import com.garbagemule.MobArena.region.ArenaRegion; import com.garbagemule.MobArena.things.Thing; +import com.garbagemule.MobArena.things.ThingManager; import com.garbagemule.MobArena.util.ItemParser; import com.garbagemule.MobArena.util.PotionEffectParser; import com.garbagemule.MobArena.waves.ability.Ability; @@ -20,18 +20,13 @@ import com.garbagemule.MobArena.waves.types.SpecialWave; import com.garbagemule.MobArena.waves.types.SupplyWave; import com.garbagemule.MobArena.waves.types.SwarmWave; import com.garbagemule.MobArena.waves.types.UpgradeWave; -import com.garbagemule.MobArena.waves.types.UpgradeWave.ArmorUpgrade; -import com.garbagemule.MobArena.waves.types.UpgradeWave.GenericUpgrade; -import com.garbagemule.MobArena.waves.types.UpgradeWave.PermissionUpgrade; -import com.garbagemule.MobArena.waves.types.UpgradeWave.Upgrade; -import com.garbagemule.MobArena.waves.types.UpgradeWave.WeaponUpgrade; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -242,7 +237,8 @@ public class WaveParser } private static Wave parseUpgradeWave(Arena arena, String name, ConfigurationSection config) { - Map> upgrades = getUpgradeMap(config); + ThingManager thingman = arena.getPlugin().getThingManager(); + Map> upgrades = getUpgradeMap(config, thingman); if (upgrades == null || upgrades.isEmpty()) { arena.getPlugin().getLogger().warning(WaveError.UPGRADE_MAP_MISSING.format(name, arena.configName())); return null; @@ -435,7 +431,7 @@ public class WaveParser .collect(Collectors.toList()); } - private static Map> getUpgradeMap(ConfigurationSection config) { + private static Map> getUpgradeMap(ConfigurationSection config, ThingManager thingman) { ConfigurationSection section = config.getConfigurationSection("upgrades"); if (section == null) { return null; @@ -446,50 +442,59 @@ public class WaveParser return null; } - Map> upgrades = new HashMap<>(); + Map> upgrades = new HashMap<>(); String path = "upgrades."; for (String className : classes) { - String itemList; // Legacy support Object val = config.get(path + className, null); if (val instanceof String) { - itemList = (String) val; - List stacks = ItemParser.parseItems(itemList); - List list = new ArrayList<>(); - for (ItemStack stack : stacks) { - list.add(new GenericUpgrade(stack)); - } - upgrades.put(className.toLowerCase(), list); + String s = (String) val; + List things = Arrays.asList(s.split(",")).stream() + .map(String::trim) + .map(thingman::parse) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + upgrades.put(className.toLowerCase(), things); } // New complex setup else if (val instanceof ConfigurationSection) { ConfigurationSection classSection = (ConfigurationSection) val; - List list = new ArrayList<>(); + List list = new ArrayList<>(); - // Items (Generic + Weapons) - itemList = classSection.getString("items", null); - if (itemList != null) { - for (ItemStack stack : ItemParser.parseItems(itemList)) { - list.add(ArenaClass.isWeapon(stack) ? new WeaponUpgrade(stack) : new GenericUpgrade(stack)); - } + // Items + List items = classSection.getStringList("items"); + if (items == null || items.isEmpty()) { + String value = classSection.getString("items", ""); + items = Arrays.asList(value.split(",")); } + items.stream() + .map(String::trim) + .map(thingman::parse) + .filter(Objects::nonNull) + .forEach(list::add); // Armor - itemList = classSection.getString("armor", null); - if (itemList != null) { - for (ItemStack stack : ItemParser.parseItems(itemList)) { - list.add(new ArmorUpgrade(stack)); - } + List armor = classSection.getStringList("armor"); + if (armor == null || armor.isEmpty()) { + String value = classSection.getString("armor", ""); + armor = Arrays.asList(value.split(",")); } - // Permissions - List perms = classSection.getStringList("permissions"); - if (!perms.isEmpty()) { - for (String perm : perms) { - list.add(new PermissionUpgrade(perm)); - } - } + // Prepend "armor:" for the armor thing parser + armor.stream() + .map(String::trim) + .map(s -> "armor:" + s) + .map(thingman::parse) + .filter(Objects::nonNull) + .forEach(list::add); + + // Prepend "perm:" for the permission thing parser + classSection.getStringList("permissions").stream() + .map(perm -> "perm:" + perm) + .map(thingman::parse) + .filter(Objects::nonNull) + .forEach(list::add); // Put in the map upgrades.put(className.toLowerCase(), list); 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 906b500..f668915 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/types/UpgradeWave.java +++ b/src/main/java/com/garbagemule/MobArena/waves/types/UpgradeWave.java @@ -1,14 +1,12 @@ package com.garbagemule.MobArena.waves.types; -import com.garbagemule.MobArena.ArenaClass.ArmorType; import com.garbagemule.MobArena.framework.Arena; +import com.garbagemule.MobArena.things.Thing; 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; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.permissions.PermissionAttachment; import java.util.ArrayList; import java.util.HashMap; @@ -18,10 +16,10 @@ import java.util.Random; public class UpgradeWave extends AbstractWave { - private Map> upgrades; + private Map> upgrades; private boolean giveAll; - public UpgradeWave(Map> upgrades) { + public UpgradeWave(Map> upgrades) { this.upgrades = upgrades; this.setType(WaveType.UPGRADE); } @@ -32,16 +30,14 @@ public class UpgradeWave extends AbstractWave } public void grantItems(Arena arena, Player p, String className) { - List list = upgrades.get(className); + List list = upgrades.get(className); if (list == null) return; if (giveAll) { - for (Upgrade upgrade : list) { - upgrade.upgrade(arena, p); - } + list.forEach(thing -> thing.giveTo(p)); } else { int index = new Random().nextInt(list.size()); - list.get(index).upgrade(arena, p); + list.get(index).giveTo(p); } } @@ -50,8 +46,8 @@ public class UpgradeWave extends AbstractWave } public Wave copy() { - Map> upgrades = new HashMap<>(); - for (Map.Entry> entry : this.upgrades.entrySet()) { + Map> upgrades = new HashMap<>(); + for (Map.Entry> entry : this.upgrades.entrySet()) { upgrades.put(entry.getKey(), new ArrayList<>(entry.getValue())); } UpgradeWave result = new UpgradeWave(upgrades); @@ -65,126 +61,4 @@ public class UpgradeWave extends AbstractWave result.setEffects(getEffects()); return result; } - - /** - * Represents an upgrade for an upgrade wave - */ - public interface Upgrade { - void upgrade(Arena arena, Player p); - } - - /** - * Armor upgrades - * Replace the item in the specific slot - */ - public static class ArmorUpgrade implements Upgrade { - private ItemStack item; - private ArmorType type; - - public ArmorUpgrade(ItemStack item) { - this.item = item; - this.type = ArmorType.getType(item); - } - - @Override - public void upgrade(Arena arena, Player p) { - if (item == null || type == null) return; - - switch (type) { - case HELMET: p.getInventory().setHelmet(item); break; - case CHESTPLATE: p.getInventory().setChestplate(item); break; - case LEGGINGS: p.getInventory().setLeggings(item); break; - case BOOTS: p.getInventory().setBoots(item); break; - } - } - } - - /** - * Weapon upgrades - * Replace the first item that matches the ID on the quickbar - */ - public static class WeaponUpgrade implements Upgrade { - private ItemStack item; - - public WeaponUpgrade(ItemStack item) { - this.item = item; - } - - @Override - public void upgrade(Arena arena, Player p) { - if (item == null) return; - - ItemStack[] items = p.getInventory().getContents(); - int firstEmpty = -1; - - // Find a matching ID and upgrade it - for (int i = 0; i < 9; i++) { - // Save the first null index - if (items[i] == null) { - if (firstEmpty < 0) firstEmpty = i; - continue; - } - // If we find an ID, upgrade and quit - if (items[i].getTypeId() == item.getTypeId()) { - items[i] = item; - p.getInventory().setContents(items); - return; - } - } - - // If nothing was found, just give them a new weapon - if (firstEmpty > 0) { - items[firstEmpty] = item; - p.getInventory().setContents(items); - } else { - p.getInventory().addItem(item); - } - } - } - - /** - * Generic upgrades - * Add the item to the player's inventory - */ - public static class GenericUpgrade implements Upgrade { - private ItemStack item; - - public GenericUpgrade(ItemStack item) { - this.item = item; - } - - @Override - public void upgrade(Arena arena, Player p) { - if (item == null) return; - - p.getInventory().addItem(item); - } - } - - /** - * Permission upgrades - * Set the given permission - */ - public static class PermissionUpgrade implements Upgrade { - private String perm; - private boolean value; - - public PermissionUpgrade(String perm) { - if (perm.startsWith("-") || perm.startsWith("^")) { - perm = perm.substring(1).trim(); - value = false; - } else { - value = true; - } - this.perm = perm; - } - - @Override - public void upgrade(Arena arena, Player p) { - if (perm == null) return; - - PermissionAttachment attachment = p.addAttachment(arena.getPlugin()); - attachment.setPermission(perm, value); - } - } }