From 0f34e1fdb74708eaf41a8f4fc63255f8dfc948fb Mon Sep 17 00:00:00 2001 From: Andreas Troelsen Date: Mon, 25 Jun 2018 00:09:31 +0200 Subject: [PATCH] Use Things API in upgrade waves. This changes the upgrade waves from the local Upgrade interface to the Thing interface. This means that all Things can now be used in upgrade waves, including commands, money, potion effects, and permissions. Unfortunately, the weapons upgrade/replace functionality has been gutted as a result of the Things API not supporting it. We could add it back in later down the road, but for now let's just see if it causes anyone any inconvenience. Closes #468 --- .../MobArena/waves/WaveParser.java | 79 +++++----- .../MobArena/waves/types/UpgradeWave.java | 142 +----------------- 2 files changed, 50 insertions(+), 171 deletions(-) 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); - } - } }