mirror of
https://github.com/garbagemule/MobArena.git
synced 2024-11-23 02:55:46 +01:00
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
This commit is contained in:
parent
a9d0ca0828
commit
0f34e1fdb7
@ -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<String,List<Upgrade>> upgrades = getUpgradeMap(config);
|
||||
ThingManager thingman = arena.getPlugin().getThingManager();
|
||||
Map<String,List<Thing>> 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<String,List<Upgrade>> getUpgradeMap(ConfigurationSection config) {
|
||||
private static Map<String,List<Thing>> 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<String,List<Upgrade>> upgrades = new HashMap<>();
|
||||
Map<String,List<Thing>> 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<ItemStack> stacks = ItemParser.parseItems(itemList);
|
||||
List<Upgrade> list = new ArrayList<>();
|
||||
for (ItemStack stack : stacks) {
|
||||
list.add(new GenericUpgrade(stack));
|
||||
}
|
||||
upgrades.put(className.toLowerCase(), list);
|
||||
String s = (String) val;
|
||||
List<Thing> 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<Upgrade> list = new ArrayList<>();
|
||||
List<Thing> 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<String> 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<String> armor = classSection.getStringList("armor");
|
||||
if (armor == null || armor.isEmpty()) {
|
||||
String value = classSection.getString("armor", "");
|
||||
armor = Arrays.asList(value.split(","));
|
||||
}
|
||||
|
||||
// Permissions
|
||||
List<String> 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);
|
||||
|
@ -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<String,List<Upgrade>> upgrades;
|
||||
private Map<String,List<Thing>> upgrades;
|
||||
private boolean giveAll;
|
||||
|
||||
public UpgradeWave(Map<String,List<Upgrade>> upgrades) {
|
||||
public UpgradeWave(Map<String,List<Thing>> 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<Upgrade> list = upgrades.get(className);
|
||||
List<Thing> 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<String,List<Upgrade>> upgrades = new HashMap<>();
|
||||
for (Map.Entry<String,List<Upgrade>> entry : this.upgrades.entrySet()) {
|
||||
Map<String,List<Thing>> upgrades = new HashMap<>();
|
||||
for (Map.Entry<String,List<Thing>> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user