Package com.tommytony.war

Source Code of com.tommytony.war.War

package com.tommytony.war;

import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.*;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;

import net.milkbowl.vault.economy.Economy;

import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

import com.tommytony.war.command.WarCommandHandler;
import com.tommytony.war.config.FlagReturn;
import com.tommytony.war.config.InventoryBag;
import com.tommytony.war.config.ScoreboardType;
import com.tommytony.war.config.KillstreakReward;
import com.tommytony.war.config.MySQLConfig;
import com.tommytony.war.config.TeamConfig;
import com.tommytony.war.config.TeamConfigBag;
import com.tommytony.war.config.TeamKind;
import com.tommytony.war.config.TeamSpawnStyle;
import com.tommytony.war.config.WarConfig;
import com.tommytony.war.config.WarConfigBag;
import com.tommytony.war.config.WarzoneConfig;
import com.tommytony.war.config.WarzoneConfigBag;
import com.tommytony.war.event.WarBlockListener;
import com.tommytony.war.event.WarEntityListener;
import com.tommytony.war.event.WarPlayerListener;
import com.tommytony.war.event.WarServerListener;
import com.tommytony.war.event.WarTagListener;
import com.tommytony.war.job.HelmetProtectionTask;
import com.tommytony.war.job.SpoutFadeOutMessageJob;
import com.tommytony.war.mapper.WarYmlMapper;
import com.tommytony.war.mapper.WarzoneYmlMapper;
import com.tommytony.war.spout.SpoutDisplayer;
import com.tommytony.war.structure.Bomb;
import com.tommytony.war.structure.Cake;
import com.tommytony.war.structure.HubLobbyMaterials;
import com.tommytony.war.structure.Monument;
import com.tommytony.war.structure.WarHub;
import com.tommytony.war.structure.ZoneLobby;
import com.tommytony.war.utility.Loadout;
import com.tommytony.war.utility.PlayerState;
import com.tommytony.war.utility.SizeCounter;
import com.tommytony.war.utility.WarLogFormatter;
import com.tommytony.war.volume.Volume;

/**
* Main class of War
*
* @author tommytony, Tim Düsterhus
* @package bukkit.tommytony.war
*/
public class War extends JavaPlugin {
  public static War war;

  // general
  private WarPlayerListener playerListener = new WarPlayerListener();
  private WarEntityListener entityListener = new WarEntityListener();
  private WarBlockListener blockListener = new WarBlockListener();
  private WarServerListener serverListener = new WarServerListener();
 
  private WarCommandHandler commandHandler = new WarCommandHandler();
  private PluginDescriptionFile desc = null;
  private boolean loaded = false;
  private boolean isSpoutServer = false;
  private boolean tagServer = false;

  // Zones and hub
  private List<Warzone> warzones = new ArrayList<Warzone>();
  private WarHub warHub;
 
  private final List<String> zoneMakerNames = new ArrayList<String>();
  private final List<String> commandWhitelist = new ArrayList<String>();
 
  private final List<Warzone> incompleteZones = new ArrayList<Warzone>();
  private final List<String> zoneMakersImpersonatingPlayers = new ArrayList<String>();
  private HashMap<String, PlayerState> disconnected = new HashMap<String, PlayerState>();
  private final HashMap<String, String> wandBearers = new HashMap<String, String>(); // playername to zonename

  private final List<String> deadlyAdjectives = new ArrayList<String>();
  private final List<String> killerVerbs = new ArrayList<String>();

  private final InventoryBag defaultInventories = new InventoryBag();
  private KillstreakReward killstreakReward;
  private MySQLConfig mysqlConfig;
  private Economy econ = null;

  private final WarConfigBag warConfig = new WarConfigBag();
  private final WarzoneConfigBag warzoneDefaultConfig = new WarzoneConfigBag();
  private final TeamConfigBag teamDefaultConfig = new TeamConfigBag();
  private SpoutDisplayer spoutMessenger = null;

  private static ResourceBundle messages = ResourceBundle.getBundle("messages");

  private HubLobbyMaterials warhubMaterials = new HubLobbyMaterials(
      new ItemStack(Material.GLASS), new ItemStack(Material.WOOD),
      new ItemStack(Material.OBSIDIAN), new ItemStack(Material.GLOWSTONE));

  public War() {
    super();
    War.war = this;
  }

  /**
   * @see JavaPlugin#onEnable()
   * @see War#loadWar()
   */
  public void onEnable() {
    this.loadWar();
  }

  /**
   * @see JavaPlugin#onDisable()
   * @see War#unloadWar()
   */
  public void onDisable() {
    this.unloadWar();
  }

  /**
   * Initializes war
   */
  public void loadWar() {
    this.setLoaded(true);
    this.desc = this.getDescription();
   
    // Spout server detection
    try {
      Class.forName("org.getspout.spoutapi.player.SpoutPlayer");
      isSpoutServer = true;
      spoutMessenger = new SpoutDisplayer();
    } catch (ClassNotFoundException e) {
      isSpoutServer = false;
    }
    try {
      Class.forName("org.sqlite.JDBC").newInstance();
    } catch (Exception e) {
      this.log("SQLite3 driver not found!", Level.SEVERE);
      this.getServer().getPluginManager().disablePlugin(this);
      return;
    }

    // Register events
    PluginManager pm = this.getServer().getPluginManager();
    pm.registerEvents(this.playerListener, this);
    pm.registerEvents(this.entityListener, this);
    pm.registerEvents(this.blockListener, this);
    pm.registerEvents(this.serverListener, this);
    if (pm.isPluginEnabled("TagAPI")) {
      try {
        Class.forName("org.kitteh.tag.TagAPI");
        pm.registerEvents(new WarTagListener(), this);
        this.tagServer = true;
      } catch (ClassNotFoundException e) {
        this.tagServer = false;
      }
    }

    // Add defaults
    warConfig.put(WarConfig.BUILDINZONESONLY, false);
    warConfig.put(WarConfig.DISABLEBUILDMESSAGE, false);
    warConfig.put(WarConfig.DISABLEPVPMESSAGE, false);
    warConfig.put(WarConfig.KEEPOLDZONEVERSIONS, true);
    warConfig.put(WarConfig.MAXZONES, 12);
    warConfig.put(WarConfig.PVPINZONESONLY, false);
    warConfig.put(WarConfig.TNTINZONESONLY, false);
    warConfig.put(WarConfig.RESETSPEED, 5000);
    warConfig.put(WarConfig.MAXSIZE, 750);
    warConfig.put(WarConfig.LANGUAGE, Locale.getDefault().toString());
    warConfig.put(WarConfig.AUTOJOIN, "");
    warConfig.put(WarConfig.TPWARMUP, 0);

    warzoneDefaultConfig.put(WarzoneConfig.AUTOASSIGN, false);
    warzoneDefaultConfig.put(WarzoneConfig.BLOCKHEADS, true);
    warzoneDefaultConfig.put(WarzoneConfig.DISABLED, false);
    warzoneDefaultConfig.put(WarzoneConfig.FRIENDLYFIRE, false);
    warzoneDefaultConfig.put(WarzoneConfig.GLASSWALLS, true);
    warzoneDefaultConfig.put(WarzoneConfig.INSTABREAK, false);
    warzoneDefaultConfig.put(WarzoneConfig.MINPLAYERS, 1);
    warzoneDefaultConfig.put(WarzoneConfig.MINTEAMS, 1);
    warzoneDefaultConfig.put(WarzoneConfig.MONUMENTHEAL, 5);
    warzoneDefaultConfig.put(WarzoneConfig.NOCREATURES, false);
    warzoneDefaultConfig.put(WarzoneConfig.NODROPS, false);
    warzoneDefaultConfig.put(WarzoneConfig.PVPINZONE, true);
    warzoneDefaultConfig.put(WarzoneConfig.REALDEATHS, false);
    warzoneDefaultConfig.put(WarzoneConfig.RESETONEMPTY, false);
    warzoneDefaultConfig.put(WarzoneConfig.RESETONCONFIGCHANGE, false);
    warzoneDefaultConfig.put(WarzoneConfig.RESETONLOAD, false);
    warzoneDefaultConfig.put(WarzoneConfig.RESETONUNLOAD, false);
    warzoneDefaultConfig.put(WarzoneConfig.UNBREAKABLE, false);
    warzoneDefaultConfig.put(WarzoneConfig.DEATHMESSAGES, true);
    warzoneDefaultConfig.put(WarzoneConfig.JOINMIDBATTLE, true);
    warzoneDefaultConfig.put(WarzoneConfig.AUTOJOIN, false);
    warzoneDefaultConfig.put(WarzoneConfig.SCOREBOARD, ScoreboardType.NONE);
    warzoneDefaultConfig.put(WarzoneConfig.XPKILLMETER, false);
    warzoneDefaultConfig.put(WarzoneConfig.SOUPHEALING, false);
    warzoneDefaultConfig.put(WarzoneConfig.ALLOWENDER, true);
    warzoneDefaultConfig.put(WarzoneConfig.RESETBLOCKS, true);

    teamDefaultConfig.put(TeamConfig.FLAGMUSTBEHOME, true);
    teamDefaultConfig.put(TeamConfig.FLAGPOINTSONLY, false);
    teamDefaultConfig.put(TeamConfig.FLAGRETURN, FlagReturn.BOTH);
    teamDefaultConfig.put(TeamConfig.LIFEPOOL, 7);
    teamDefaultConfig.put(TeamConfig.MAXSCORE, 10);
    teamDefaultConfig.put(TeamConfig.NOHUNGER, false);
    teamDefaultConfig.put(TeamConfig.PLAYERLOADOUTASDEFAULT, false);
    teamDefaultConfig.put(TeamConfig.RESPAWNTIMER, 0);
    teamDefaultConfig.put(TeamConfig.SATURATION, 10);
    teamDefaultConfig.put(TeamConfig.SPAWNSTYLE, TeamSpawnStyle.SMALL);
    teamDefaultConfig.put(TeamConfig.TEAMSIZE, 10);
    teamDefaultConfig.put(TeamConfig.PERMISSION, "war.player");
    teamDefaultConfig.put(TeamConfig.XPKILLMETER, false);
    teamDefaultConfig.put(TeamConfig.KILLSTREAK, false);
    teamDefaultConfig.put(TeamConfig.BLOCKWHITELIST, "all");
    teamDefaultConfig.put(TeamConfig.PLACEBLOCK, true);
    teamDefaultConfig.put(TeamConfig.APPLYPOTION, "");
    teamDefaultConfig.put(TeamConfig.ECOREWARD, 0.0);
    teamDefaultConfig.put(TeamConfig.INVENTORYDROP, false);

    this.getDefaultInventories().clearLoadouts();
    HashMap<Integer, ItemStack> defaultLoadout = new HashMap<Integer, ItemStack>();
   
    ItemStack stoneSword = new ItemStack(Material.STONE_SWORD, 1, (byte) 8);
    stoneSword.setDurability((short) 8);
    defaultLoadout.put(0, stoneSword);
   
    ItemStack bow = new ItemStack(Material.BOW, 1, (byte) 8);
    bow.setDurability((short) 8);
    defaultLoadout.put(1, bow);
   
    ItemStack arrows = new ItemStack(Material.ARROW, 7);
    defaultLoadout.put(2, arrows);
   
    ItemStack stonePick = new ItemStack(Material.IRON_PICKAXE, 1, (byte) 8);
    stonePick.setDurability((short) 8);
    defaultLoadout.put(3, stonePick);
   
    ItemStack stoneSpade = new ItemStack(Material.STONE_SPADE, 1, (byte) 8);
    stoneSword.setDurability((short) 8);
    defaultLoadout.put(4, stoneSpade);
       
    this.getDefaultInventories().addLoadout("default", defaultLoadout);
   
    HashMap<Integer, ItemStack> reward = new HashMap<Integer, ItemStack>();
    reward.put(0, new ItemStack(Material.CAKE, 1));
    this.getDefaultInventories().setReward(reward);
   
    this.getCommandWhitelist().add("who");
    this.getZoneMakerNames().add("tommytony");
    this.setKillstreakReward(new KillstreakReward());
    this.setMysqlConfig(new MySQLConfig());
   
    // Add constants
    this.getDeadlyAdjectives().clear();
    for (String adjective : this.getString("pvp.kill.adjectives").split(";")) {
      this.getDeadlyAdjectives().add(adjective);
    }
    this.getKillerVerbs().clear();
    for (String verb : this.getString("pvp.kill.verbs").split(";")) {
      this.getKillerVerbs().add(verb);
    }
   
    // Load files
    WarYmlMapper.load();
   
    // Start tasks
    HelmetProtectionTask helmetProtectionTask = new HelmetProtectionTask();
    this.getServer().getScheduler().scheduleSyncRepeatingTask(this, helmetProtectionTask, 250, 100);
   
    if (this.isSpoutServer) {
      SpoutFadeOutMessageJob fadeOutMessagesTask = new SpoutFadeOutMessageJob();
      this.getServer().getScheduler().scheduleSyncRepeatingTask(this, fadeOutMessagesTask, 100, 100);
    }
    if (this.mysqlConfig.isEnabled()) {
      try {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
      } catch (Exception ex) {
        this.log("MySQL driver not found!", Level.SEVERE);
        this.getServer().getPluginManager().disablePlugin(this);
      }
    }
    if (this.getServer().getPluginManager().isPluginEnabled("Vault")) {
      RegisteredServiceProvider<Economy> rsp = this.getServer().getServicesManager()
        .getRegistration(Economy.class);
      if (rsp != null) {
        this.econ = rsp.getProvider();
      }
    }

    War.reloadLanguage();

    // Get own log file
    try {
      // Create an appending file handler
      new File(this.getDataFolder() + "/temp/").mkdir();
      FileHandler handler = new FileHandler(this.getDataFolder() + "/temp/war.log", true);

      // Add to War-specific logger
      Formatter formatter = new WarLogFormatter();
      handler.setFormatter(formatter);
      this.getLogger().addHandler(handler);
    } catch (IOException e) {
      this.getLogger().log(Level.WARNING, "Failed to create War log file");
    }
   
    // Size check
    long datSize = SizeCounter.getFileOrDirectorySize(new File(this.getDataFolder() + "/dat/")) / 1024 / 1024;
    long tempSize = SizeCounter.getFileOrDirectorySize(new File(this.getDataFolder() + "/temp/")) / 1024 / 1024;
   
    if (datSize + tempSize > 100) {
      this.log("War data files are taking " + datSize + "MB and its temp files " + tempSize + "MB. Consider permanently deleting old warzone versions and backups in /plugins/War/temp/.", Level.WARNING);
    }
       
    this.log("War v" + this.desc.getVersion() + " is on.", Level.INFO);
  }

  public static void reloadLanguage() {
    String[] parts = War.war.getWarConfig().getString(WarConfig.LANGUAGE).replace("-", "_").split("_");
    Locale lang = new Locale(parts[0]);
    if (parts.length >= 2) {
      lang = new Locale(parts[0], parts[1]);
    }
    War.messages = ResourceBundle.getBundle("messages", lang);
  }

  /**
   * Cleans up war
   */
  public void unloadWar() {
    for (Warzone warzone : this.warzones) {
      warzone.unload();
    }
    this.warzones.clear();

    if (this.warHub != null) {
      this.warHub.getVolume().resetBlocks();
    }

    this.getServer().getScheduler().cancelTasks(this);
    this.playerListener.purgeLatestPositions();

    HandlerList.unregisterAll(this);
    this.log("War v" + this.desc.getVersion() + " is off.", Level.INFO);
    this.setLoaded(false);
  }

  /**
   * @see org.bukkit.command.CommandExecutor#onCommand(org.bukkit.command.CommandSender, org.bukkit.command.Command, String, String[])
   */
  public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
    return this.commandHandler.handle(sender, cmd, args);
  }

  /**
   * Converts the player-inventory to a loadout hashmap
   *
   * @param inv
   *                inventory to get the items from
   * @param loadout
   *                the hashmap to save to
   */
  private void inventoryToLoadout(PlayerInventory inv, HashMap<Integer, ItemStack> loadout) {
    loadout.clear();
    int i = 0;
    for (ItemStack stack : inv.getContents()) {
      if (stack != null && stack.getType() != Material.AIR) {
        loadout.put(i, stack.clone());
        i++;
      }
    }
    if (inv.getBoots() != null && inv.getBoots().getType() != Material.AIR) {
      loadout.put(100, inv.getBoots().clone());
    }
    if (inv.getLeggings() != null && inv.getLeggings().getType() != Material.AIR) {
      loadout.put(101, inv.getLeggings().clone());
    }
    if (inv.getChestplate() != null && inv.getChestplate().getType() != Material.AIR) {
      loadout.put(102, inv.getChestplate().clone());
    }
    if (inv.getHelmet() != null && inv.getHelmet().getType() != Material.AIR) {
      loadout.put(103, inv.getHelmet().clone());
    }
  }

  public void safelyEnchant(ItemStack target, Enchantment enchantment, int level) {
    if (level > enchantment.getMaxLevel()) {
      target.addUnsafeEnchantment(enchantment, level);
    } else {
      target.addEnchantment(enchantment, level);
    }
  }

  /**
   * Converts the player-inventory to a loadout hashmap
   *
   * @param player
   *                player to get the inventory to get the items from
   * @param loadout
   *                the hashmap to save to
   */
  private void inventoryToLoadout(Player player, HashMap<Integer, ItemStack> loadout) {
    this.inventoryToLoadout(player.getInventory(), loadout);
  }
 
  public String updateTeamFromNamedParams(Team team, CommandSender commandSender, String[] arguments) {
    try {
      Map<String, String> namedParams = new HashMap<String, String>();
      Map<String, String> thirdParameter = new HashMap<String, String>();
      for (String namedPair : arguments) {
        String[] pairSplit = namedPair.split(":");
        if (pairSplit.length == 2) {
          namedParams.put(pairSplit[0].toLowerCase(), pairSplit[1]);
        } else if (pairSplit.length == 3) {
          namedParams.put(pairSplit[0].toLowerCase(), pairSplit[1]);
          thirdParameter.put(pairSplit[0].toLowerCase(), pairSplit[2]);
        }
      }
     
      StringBuilder returnMessage = new StringBuilder();
      returnMessage.append(team.getTeamConfig().updateFromNamedParams(namedParams));
     
      if (commandSender instanceof Player) {
        Player player = (Player) commandSender;
        if (namedParams.containsKey("loadout")) {
          String loadoutName = namedParams.get("loadout");
          HashMap<Integer, ItemStack> loadout = team.getInventories().getLoadout(loadoutName);
          if (loadout == null) {
            // Check if any loadouts exist, if not gotta use the default inventories then add the newly created one
            if(!team.getInventories().hasLoadouts()) {
              Warzone warzone = team.getZone();
              for (String key : warzone.getDefaultInventories().resolveLoadouts().keySet()) {
                HashMap<Integer, ItemStack> transferredLoadout = warzone.getDefaultInventories().resolveLoadouts().get(key);
                if (transferredLoadout != null) {
                  team.getInventories().setLoadout(key, transferredLoadout);
                } else {
                  War.war.log("Failed to transfer loadout " + key + " down to team " + team.getName() + " in warzone " + warzone.getName(), Level.WARNING);
                }
              }
            }
           
            loadout = new HashMap<Integer, ItemStack>();
            team.getInventories().setLoadout(loadoutName, loadout);
            returnMessage.append(loadoutName + " respawn loadout added.");
          } else {
            returnMessage.append(loadoutName + " respawn loadout updated.");
          }
          this.inventoryToLoadout(player, loadout);
          Loadout ldt = team.getInventories().getNewLoadout(loadoutName);
          if (thirdParameter.containsKey("loadout")) {
            String permission = thirdParameter.get("loadout");
            ldt.setPermission(permission);
            returnMessage.append(' ').append(loadoutName).append(" respawn loadout permission set to ").append(permission).append('.');
          } else if (ldt.requiresPermission()) {
            ldt.setPermission(null);
            returnMessage.append(' ').append(loadoutName).append(" respawn loadout permission deleted.");
          }
        }
        if (namedParams.containsKey("deleteloadout")) {
          String loadoutName = namedParams.get("deleteloadout");
          if (team.getInventories().containsLoadout(loadoutName)) {
            team.getInventories().removeLoadout(loadoutName);
            returnMessage.append(" " + loadoutName + " loadout removed.");
          } else {
            returnMessage.append(" " + loadoutName + " loadout not found.");
          }
        }
        if (namedParams.containsKey("reward")) {
          HashMap<Integer, ItemStack> reward = new HashMap<Integer, ItemStack>();
          this.inventoryToLoadout(player, reward);
          team.getInventories().setReward(reward);
          returnMessage.append(" game end reward updated.");
        }
      }

      return returnMessage.toString();
    } catch (Exception e) {
      return "PARSE-ERROR";
    }
  }

  public String updateZoneFromNamedParams(Warzone warzone, CommandSender commandSender, String[] arguments) {
    try {
      Map<String, String> namedParams = new HashMap<String, String>();
      Map<String, String> thirdParameter = new HashMap<String, String>();
      for (String namedPair : arguments) {
        String[] pairSplit = namedPair.split(":");
        if (pairSplit.length == 2) {
          namedParams.put(pairSplit[0].toLowerCase(), pairSplit[1]);
        } else if (pairSplit.length == 3) {
          namedParams.put(pairSplit[0].toLowerCase(), pairSplit[1]);
          thirdParameter.put(pairSplit[0].toLowerCase(), pairSplit[2]);
        }
      }
     
      StringBuilder returnMessage = new StringBuilder();
      if (namedParams.containsKey("author")) {
        for(String author : namedParams.get("author").split(",")) {
          if (!author.equals("") && !warzone.getAuthors().contains(author)) {
            warzone.addAuthor(author);
            returnMessage.append(" author " + author + " added.");
          }
        }
      }
      if (namedParams.containsKey("deleteauthor")) {
        for(String author : namedParams.get("deleteauthor").split(",")) {
          if (warzone.getAuthors().contains(author)) {
            warzone.getAuthors().remove(author);
            returnMessage.append(" " + author + " removed from zone authors.");
          }
        }
      }
     
      returnMessage.append(warzone.getWarzoneConfig().updateFromNamedParams(namedParams));
      returnMessage.append(warzone.getTeamDefaultConfig().updateFromNamedParams(namedParams));

      if (commandSender instanceof Player) {
        Player player = (Player) commandSender;
        if (namedParams.containsKey("loadout")) {
          String loadoutName = namedParams.get("loadout");
          HashMap<Integer, ItemStack> loadout = warzone.getDefaultInventories().getLoadout(loadoutName);
          if (loadout == null) {
            loadout = new HashMap<Integer, ItemStack>();

            // Check if any loadouts exist, if not gotta use the default inventories then add the newly created one
            if(!warzone.getDefaultInventories().hasLoadouts()) {
              for (String key : warzone.getDefaultInventories().resolveLoadouts().keySet()) {
                HashMap<Integer, ItemStack> transferredLoadout = warzone.getDefaultInventories().resolveLoadouts().get(key);
                if (transferredLoadout != null) {
                  warzone.getDefaultInventories().setLoadout(key, transferredLoadout);
                } else {
                  War.war.log("Failed to transfer loadout " + key + " down to warzone " + warzone.getName(), Level.WARNING);
                }
              }
            }
           
            warzone.getDefaultInventories().setLoadout(loadoutName, loadout);
            returnMessage.append(loadoutName + " respawn loadout added.");
          } else {
            returnMessage.append(loadoutName + " respawn loadout updated.");
          }
          this.inventoryToLoadout(player, loadout);
          Loadout ldt = warzone.getDefaultInventories().getNewLoadout(loadoutName);
          if (thirdParameter.containsKey("loadout")) {
            String permission = thirdParameter.get("loadout");
            ldt.setPermission(permission);
            returnMessage.append(' ').append(loadoutName).append(" respawn loadout permission set to ").append(permission).append('.');
          } else if (ldt.requiresPermission()) {
            ldt.setPermission(null);
            returnMessage.append(' ').append(loadoutName).append(" respawn loadout permission deleted.");
          }
        }
        if (namedParams.containsKey("deleteloadout")) {
          String loadoutName = namedParams.get("deleteloadout");
          if (warzone.getDefaultInventories().containsLoadout(loadoutName)) {
            warzone.getDefaultInventories().removeLoadout(loadoutName);
            returnMessage.append(" " + loadoutName + " loadout removed.");
          } else {
            returnMessage.append(" " + loadoutName + " loadout not found.");
          }
        }
        if (namedParams.containsKey("reward")) {
          HashMap<Integer, ItemStack> reward = new HashMap<Integer, ItemStack>();
          this.inventoryToLoadout(player, reward);
          warzone.getDefaultInventories().setReward(reward);
          returnMessage.append(" game end reward updated.");
        }
        if (namedParams.containsKey("lobbymaterial")) {
          String whichBlocks = namedParams.get("lobbymaterial");
          ItemStack blockInHand = player.getItemInHand();
          boolean updatedLobbyMaterials = false;
         
          if (!blockInHand.getType().isBlock() && !blockInHand.getType().equals(Material.AIR)) {
            this.badMsg(player, "Can only use blocks or air as lobby material.");
          } else {
            if (whichBlocks.equals("floor")) {
              warzone.getLobbyMaterials().setFloorBlock(blockInHand);
              returnMessage.append(" lobby floor material set to " + blockInHand.getType());
              updatedLobbyMaterials = true;
            } else if (whichBlocks.equals("outline")) {
              warzone.getLobbyMaterials().setOutlineBlock(blockInHand);
              returnMessage.append(" lobby outline material set to " + blockInHand.getType());
              updatedLobbyMaterials = true;
            } else if (whichBlocks.equals("gate")) {
              warzone.getLobbyMaterials().setGateBlock(blockInHand);
              returnMessage.append(" lobby gate material set to " + blockInHand.getType());
              updatedLobbyMaterials = true;
            } else if (whichBlocks.equals("light")) {
              warzone.getLobbyMaterials().setLightBlock(blockInHand);
              returnMessage.append(" lobby light material set to " + blockInHand.getType());
              updatedLobbyMaterials = true;
            }
           
            if (updatedLobbyMaterials && warzone.getLobby() != null) {
              warzone.getLobby().getVolume().resetBlocks();
              warzone.getLobby().initialize();
            }
          }
        }
        if (namedParams.containsKey("material")) {
          String whichBlocks = namedParams.get("material");
          ItemStack blockInHand = player.getItemInHand();
          boolean updatedMaterials = false;
         
          if (!blockInHand.getType().isBlock()) {
            this.badMsg(player, "Can only use blocks as material.");
          } else {
            if (whichBlocks.equals("main")) {
              warzone.getWarzoneMaterials().setMainBlock(blockInHand);
              returnMessage.append(" main material set to " + blockInHand.getType());
              updatedMaterials = true;
            } else if (whichBlocks.equals("stand")) {
              warzone.getWarzoneMaterials().setStandBlock(blockInHand);
              returnMessage.append(" stand material set to " + blockInHand.getType());
              updatedMaterials = true;
            } else if (whichBlocks.equals("light")) {
              warzone.getWarzoneMaterials().setLightBlock(blockInHand);
              returnMessage.append(" light material set to " + blockInHand.getType());
              updatedMaterials = true;
            }
           
            if (updatedMaterials) {
              // reset all structures
              for (Monument monument : warzone.getMonuments()) {
                monument.getVolume().resetBlocks();
                monument.addMonumentBlocks();
              }
              for (Cake cake : warzone.getCakes()) {
                cake.getVolume().resetBlocks();
                cake.addCakeBlocks();
              }
              for (Bomb bomb : warzone.getBombs()) {
                bomb.getVolume().resetBlocks();
                bomb.addBombBlocks();
              }
              for (Team team : warzone.getTeams()) {
                for (Volume spawnVolume : team.getSpawnVolumes().values()) {
                  spawnVolume.resetBlocks();
                }
                team.initializeTeamSpawns();
                if (team.getTeamFlag() != null) {
                  team.getFlagVolume().resetBlocks();
                  team.initializeTeamFlag();
                }
              }
            }
          }
        }
      }

      return returnMessage.toString();
    } catch (Exception e) {
      return "PARSE-ERROR";
    }
  }

  public String updateFromNamedParams(CommandSender commandSender, String[] arguments) {
    try {
      Map<String, String> namedParams = new HashMap<String, String>();
      Map<String, String> thirdParameter = new HashMap<String, String>();
      for (String namedPair : arguments) {
        String[] pairSplit = namedPair.split(":");
        if (pairSplit.length == 2) {
          namedParams.put(pairSplit[0].toLowerCase(), pairSplit[1]);
        } else if (pairSplit.length == 3) {
          namedParams.put(pairSplit[0].toLowerCase(), pairSplit[1]);
          thirdParameter.put(pairSplit[0].toLowerCase(), pairSplit[2]);
        }
      }
     
      StringBuilder returnMessage = new StringBuilder();
     
      returnMessage.append(this.getWarConfig().updateFromNamedParams(namedParams));
      returnMessage.append(this.getWarzoneDefaultConfig().updateFromNamedParams(namedParams));
      returnMessage.append(this.getTeamDefaultConfig().updateFromNamedParams(namedParams));
 
      if (commandSender instanceof Player) {
        Player player = (Player) commandSender;
        if (namedParams.containsKey("loadout")) {
          String loadoutName = namedParams.get("loadout");
          HashMap<Integer, ItemStack> loadout = this.getDefaultInventories().getLoadout(loadoutName);
          if (loadout == null) {
            loadout = new HashMap<Integer, ItemStack>();
            this.getDefaultInventories().addLoadout(loadoutName, loadout);
            returnMessage.append(loadoutName + " respawn loadout added.");
          } else {
            returnMessage.append(loadoutName + " respawn loadout updated.");
          }
          this.inventoryToLoadout(player, loadout);
          Loadout ldt = this.getDefaultInventories().getNewLoadout(loadoutName);
          if (thirdParameter.containsKey("loadout")) {
            String permission = thirdParameter.get("loadout");
            ldt.setPermission(permission);
            returnMessage.append(' ').append(loadoutName).append(" respawn loadout permission set to ").append(permission).append('.');
          } else if (ldt.requiresPermission()) {
            ldt.setPermission(null);
            returnMessage.append(' ').append(loadoutName).append(" respawn loadout permission deleted.");
          }
        }
        if (namedParams.containsKey("deleteloadout")) {
          String loadoutName = namedParams.get("deleteloadout");
          if (this.getDefaultInventories().containsLoadout(loadoutName)) {
            if (this.getDefaultInventories().getNewLoadouts().size() > 1) {
              this.getDefaultInventories().removeLoadout(loadoutName);
              returnMessage.append(" " + loadoutName + " loadout removed.");
            } else {
              returnMessage.append(" Can't remove only loadout.");
            }
          } else {
            returnMessage.append(" " + loadoutName + " loadout not found.");
          }
        }
        if (namedParams.containsKey("reward")) {
          HashMap<Integer, ItemStack> reward = new HashMap<Integer, ItemStack>();
          this.inventoryToLoadout(player, reward);
          this.getDefaultInventories().setReward(reward);
          returnMessage.append(" game end reward updated.");
        }
        if (namedParams.containsKey("rallypoint")) {
          String zoneName = namedParams.get("rallypoint");
          this.setZoneRallyPoint(zoneName, player);
          returnMessage.append(" rallypoint set for zone " + zoneName + ".");
        }
        if (namedParams.containsKey("warhubmaterial")) {
          String whichBlocks = namedParams.get("warhubmaterial");
          ItemStack blockInHand = player.getItemInHand();
          boolean updatedWarhubMaterials = false;
         
          if (!blockInHand.getType().isBlock() && !blockInHand.getType().equals(Material.AIR)) {
            this.badMsg(player, "Can only use blocks or air as warhub material.");
          } else {
            if (whichBlocks.equals("floor")) {
              this.warhubMaterials.setFloorBlock(blockInHand);
              returnMessage.append(" warhub floor material set to " + blockInHand.getType());
              updatedWarhubMaterials = true;
            } else if (whichBlocks.equals("outline")) {
              this.warhubMaterials.setOutlineBlock(blockInHand);
              returnMessage.append(" warhub outline material set to " + blockInHand.getType());
              updatedWarhubMaterials = true;
            } else if (whichBlocks.equals("gate")) {
              this.warhubMaterials.setGateBlock(blockInHand);
              returnMessage.append(" warhub gate material set to " + blockInHand.getType());
              updatedWarhubMaterials = true;
            } else if (whichBlocks.equals("light")) {
              this.warhubMaterials.setLightBlock(blockInHand);
              returnMessage.append(" warhub light material set to " + blockInHand.getType());
              updatedWarhubMaterials = true;
            }
           
            if (updatedWarhubMaterials && War.war.getWarHub() != null) {
              War.war.getWarHub().getVolume().resetBlocks();
              War.war.getWarHub().initialize();
            }
          }
        }
      }

      return returnMessage.toString();
    } catch (Exception e) {
      return "PARSE-ERROR";
    }
  }
 
  public String printConfig(Team team) {
    ChatColor teamColor = ChatColor.AQUA;
   
    ChatColor normalColor = ChatColor.WHITE;
   
    String teamConfigStr = "";
    InventoryBag invs = team.getInventories();
    teamConfigStr += getLoadoutsString(invs);
   
    for (TeamConfig teamConfig : TeamConfig.values()) {
      Object value = team.getTeamConfig().getValue(teamConfig);
      if (value != null) {
        teamConfigStr += " " + teamConfig.toStringWithValue(value).replace(":", ":" + teamColor) + normalColor;
      }
    }
   
    return " ::" + teamColor + "Team " + team.getName() + teamColor +  " config" + normalColor + "::" 
      + ifEmptyInheritedForTeam(teamConfigStr);
  }

  private String getLoadoutsString(InventoryBag invs) {
    StringBuilder loadoutsString = new StringBuilder();
    ChatColor loadoutColor = ChatColor.GREEN;
    ChatColor normalColor = ChatColor.WHITE;
   
    if (invs.hasLoadouts()) {
      StringBuilder loadouts = new StringBuilder();
      for (Loadout ldt : invs.getNewLoadouts()) {
        if (ldt.requiresPermission()) {
          loadouts.append(ldt.getName()).append(":").append(ldt.getPermission()).append(",");
        } else {
          loadouts.append(ldt.getName()).append(",");
        }
      }
      loadoutsString.append(" loadout:").append(loadoutColor).append(loadouts.toString()).append(normalColor);
    }
   
    if (invs.hasReward()) {
      loadoutsString.append(" reward:").append(loadoutColor).append("default").append(normalColor);
    }
   
    return loadoutsString.toString();
  }

  public String printConfig(Warzone zone) {
    ChatColor teamColor = ChatColor.AQUA;
    ChatColor zoneColor = ChatColor.DARK_AQUA;
    ChatColor authorColor = ChatColor.GREEN;
    ChatColor normalColor = ChatColor.WHITE;
   
    String warzoneConfigStr = "";
    for (WarzoneConfig warzoneConfig : WarzoneConfig.values()) {
      Object value = zone.getWarzoneConfig().getValue(warzoneConfig);
      if (value != null) {
        warzoneConfigStr += " " + warzoneConfig.toStringWithValue(value).replace(":", ":" + zoneColor) + normalColor;
      }
    }
   
    String teamDefaultsStr = "";
    teamDefaultsStr += getLoadoutsString( zone.getDefaultInventories());
    for (TeamConfig teamConfig : TeamConfig.values()) {
      Object value = zone.getTeamDefaultConfig().getValue(teamConfig);
      if (value != null) {
        teamDefaultsStr += " " + teamConfig.toStringWithValue(value).replace(":", ":" + teamColor) + normalColor;
      }
    }
   
    return "::" + zoneColor + "Warzone " + authorColor + zone.getName() + zoneColor + " config" + normalColor + "::"
     + " author:" + authorColor + ifEmptyEveryone(zone.getAuthorsString()) + normalColor
     + ifEmptyInheritedForWarzone(warzoneConfigStr)
     + " ::" + teamColor + "Team defaults" + normalColor + "::"
     + ifEmptyInheritedForWarzone(teamDefaultsStr);
  }
 
  private String ifEmptyInheritedForWarzone(String maybeEmpty) {
    if (maybeEmpty.equals("")) {
      maybeEmpty = " all values inherited (see " + ChatColor.GREEN + "/warcfg -p)" + ChatColor.WHITE;
    }
    return maybeEmpty;
  }
 
  private String ifEmptyInheritedForTeam(String maybeEmpty) {
    if (maybeEmpty.equals("")) {
      maybeEmpty = " all values inherited (see " + ChatColor.GREEN + "/warcfg -p" + ChatColor.WHITE
        + " and " + ChatColor.GREEN + "/zonecfg -p" + ChatColor.WHITE + ")";
    }
    return maybeEmpty;
  }

  private String ifEmptyEveryone(String maybeEmpty) {
    if (maybeEmpty.equals("")) {
      maybeEmpty = "*";
    }
    return maybeEmpty;
  }

  public String printConfig() {
    ChatColor teamColor = ChatColor.AQUA;
    ChatColor zoneColor = ChatColor.DARK_AQUA;
    ChatColor globalColor = ChatColor.DARK_GREEN;
    ChatColor normalColor = ChatColor.WHITE;
   
    String warConfigStr = "";
    for (WarConfig warConfig : WarConfig.values()) {
      warConfigStr += " " + warConfig.toStringWithValue(this.getWarConfig().getValue(warConfig)).replace(":", ":" + globalColor) + normalColor;
    }
   
    String warzoneDefaultsStr = "";
    for (WarzoneConfig warzoneConfig : WarzoneConfig.values()) {
      warzoneDefaultsStr += " " + warzoneConfig.toStringWithValue(this.getWarzoneDefaultConfig().getValue(warzoneConfig)).replace(":", ":" + zoneColor) + normalColor;
    }
   
    String teamDefaultsStr = "";
    teamDefaultsStr += getLoadoutsString(this.getDefaultInventories());
    for (TeamConfig teamConfig : TeamConfig.values()) {
      teamDefaultsStr += " " + teamConfig.toStringWithValue(this.getTeamDefaultConfig().getValue(teamConfig)).replace(":", ":" + teamColor) + normalColor;
    }
   
    return normalColor + "::" + globalColor + "War config" + normalColor + "::" + warConfigStr 
      + normalColor + " ::" + zoneColor + "Warzone defaults" + normalColor + "::" + warzoneDefaultsStr
      + normalColor + " ::" + teamColor + "Team defaults" + normalColor + "::" + teamDefaultsStr;
  }

  private void setZoneRallyPoint(String warzoneName, Player player) {
    Warzone zone = this.findWarzone(warzoneName);
    if (zone == null) {
      this.badMsg(player, "Can't set rally point. No such warzone.");
    } else {
      zone.setRallyPoint(player.getLocation());
      WarzoneYmlMapper.save(zone);
    }
  }

  public void addWarzone(Warzone zone) {
    this.warzones.add(zone);
  }

  public List<Warzone> getWarzones() {
    return this.warzones;
  }

  /**
   * Get a list of warzones that are not disabled.
   * @return List of enabled warzones.
   */
  public List<Warzone> getEnabledWarzones() {
    List<Warzone> enabledZones = new ArrayList<Warzone>(this.warzones.size());
    for (Warzone zone : this.warzones) {
      if (zone.getWarzoneConfig().getBoolean(WarzoneConfig.DISABLED) == false) {
        enabledZones.add(zone);
      }
    }
    return enabledZones;
  }

  /**
   * Get a list of warzones that have players in them.
   * @return List of enabled warzones with players.
   */
  public List<Warzone> getActiveWarzones() {
    List<Warzone> activeZones = new ArrayList<Warzone>(this.warzones.size());
    for (Warzone zone : this.warzones) {
      if (zone.getWarzoneConfig().getBoolean(WarzoneConfig.DISABLED) == false
        && zone.getPlayerCount() > 0) {
        activeZones.add(zone);
      }
    }
    return activeZones;
  }

  static final boolean HIDE_BLANK_MESSAGES = true;

  public void msg(CommandSender sender, String str) {
    if (messages.containsKey(str)) str = this.getString(str);
    if (HIDE_BLANK_MESSAGES && (str == null || str.isEmpty())) return;
    if (sender instanceof Player) {
      StringBuilder output = new StringBuilder(ChatColor.GRAY.toString())
          .append(this.getString("war.prefix")).append(ChatColor.WHITE).append(' ');
      output.append(this.colorKnownTokens(str, ChatColor.WHITE));
      sender.sendMessage(output.toString());
    } else {
      sender.sendMessage(str);
    }
  }

  public void badMsg(CommandSender sender, String str) {
    if (messages.containsKey(str)) str = this.getString(str);
    if (HIDE_BLANK_MESSAGES && (str == null || str.isEmpty())) return;
    if (sender instanceof Player) {
      StringBuilder output = new StringBuilder(ChatColor.GRAY.toString())
          .append(this.getString("war.prefix")).append(ChatColor.RED).append(' ');
      output.append(this.colorKnownTokens(str, ChatColor.RED));
      sender.sendMessage(output.toString());
    } else {
      sender.sendMessage(str);
    }
  }

  public void msg(CommandSender sender, String str, Object... obj) {
    if (messages.containsKey(str)) str = this.getString(str);
    if (HIDE_BLANK_MESSAGES && (str == null || str.isEmpty())) return;
    if (sender instanceof Player) {
      StringBuilder output = new StringBuilder(ChatColor.GRAY.toString())
          .append(this.getString("war.prefix")).append(ChatColor.WHITE).append(' ');
      output.append(MessageFormat.format(
            this.colorKnownTokens(str, ChatColor.WHITE), obj));
      sender.sendMessage(output.toString());
    } else {
      StringBuilder output = new StringBuilder();
      output.append(MessageFormat.format(str, obj));
      sender.sendMessage(output.toString());
    }
  }

  public void badMsg(CommandSender sender, String str, Object... obj) {
    if (messages.containsKey(str)) str = this.getString(str);
    if (HIDE_BLANK_MESSAGES && (str == null || str.isEmpty())) return;
    if (sender instanceof Player) {
      StringBuilder output = new StringBuilder(ChatColor.GRAY.toString())
          .append(this.getString("war.prefix")).append(ChatColor.RED).append(' ');
      output.append(MessageFormat.format(
            this.colorKnownTokens(str, ChatColor.RED), obj));
      sender.sendMessage(output.toString());
    } else {
      StringBuilder output = new StringBuilder();
      output.append(MessageFormat.format(str, obj));
      sender.sendMessage(output.toString());
    }
  }

  /**
   * Colors the teams and examples in messages
   *
   * @param str message-string
   * @param msgColor current message-color
   * @return String Message with colored teams
   */
  private String colorKnownTokens(String str, ChatColor msgColor) {
    str = str.replaceAll("Ex -", ChatColor.BLUE + "Ex -" + ChatColor.GRAY);
    str = str.replaceAll("\\\\", ChatColor.BLUE + "\\\\" + ChatColor.GRAY);
    str = str.replaceAll("->", ChatColor.LIGHT_PURPLE + "->" + ChatColor.GRAY);
    str = str.replaceAll("/teamcfg", ChatColor.AQUA + "/teamcfg" + ChatColor.GRAY);
    str = str.replaceAll("Team defaults", ChatColor.AQUA + "Team defaults" + ChatColor.GRAY);
    str = str.replaceAll("Team config", ChatColor.AQUA + "Team config" + ChatColor.GRAY);
    str = str.replaceAll("/zonecfg", ChatColor.DARK_AQUA + "/zonecfg" + ChatColor.GRAY);
    str = str.replaceAll("Warzone defaults", ChatColor.DARK_AQUA + "Warzone defaults" + ChatColor.GRAY);
    str = str.replaceAll("Warzone config", ChatColor.DARK_AQUA + "Warzone config" + ChatColor.GRAY);
    str = str.replaceAll("/warcfg", ChatColor.DARK_GREEN + "/warcfg" + ChatColor.GRAY);
    str = str.replaceAll("War config", ChatColor.DARK_GREEN + "War config" + ChatColor.GRAY);
    str = str.replaceAll("Print config", ChatColor.WHITE + "Print config" + ChatColor.GREEN);
   
    for (TeamKind kind : TeamKind.values()) {
      str = str.replaceAll(" " + kind.toString(), " " + kind.getColor() + kind.toString() + msgColor);
      str = str.replaceAll(kind.toString() + "/", kind.getColor() + kind.toString() + ChatColor.GRAY + "/");
    }
   
    return str;
  }

  /**
   * Logs a specified message with a specified level
   *
   * @param str message to log
   * @param lvl level to use
   */
  public void log(String str, Level lvl) {
    this.getLogger().log(lvl, str);
  }

  // the only way to find a zone that has only one corner
  public Warzone findWarzone(String warzoneName) {
    for (Warzone warzone : this.warzones) {
      if (warzone.getName().toLowerCase().equals(warzoneName.toLowerCase())) {
        return warzone;
      }
    }
    for (Warzone warzone : this.incompleteZones) {
      if (warzone.getName().equals(warzoneName)) {
        return warzone;
      }
    }
    return null;
  }
       
  /**
   * Checks whether the given player is allowed to play in a certain team
   *
   * @param   player  Player to check
         * @param         team  Team to check 
   * @return    true if the player may play in the team
   */
  public boolean canPlayWar(Player player, Team team) {
    return player.hasPermission(team.getTeamConfig().resolveString(TeamConfig.PERMISSION));
  }

  /**
   * Checks whether the given player is allowed to warp.
   *
   * @param   player  Player to check
   * @return    true if the player may warp
   */
  public boolean canWarp(Player player) {
    return player.hasPermission("war.warp");
  }

  /**
   * Checks whether the given player is allowed to build outside zones
   *
   * @param   player  Player to check
   * @return    true if the player may build outside zones
   */
  public boolean canBuildOutsideZone(Player player) {
    if (this.getWarConfig().getBoolean(WarConfig.BUILDINZONESONLY)) {
      return player.hasPermission("war.build");
    } else {
      return true;
    }
  }

  /**
   * Checks whether the given player is allowed to pvp outside zones
   *
   * @param   player  Player to check
   * @return    true if the player may pvp outside zones
   */
  public boolean canPvpOutsideZones(Player player) {
    if (this.getWarConfig().getBoolean(WarConfig.PVPINZONESONLY)) {
      return player.hasPermission("war.pvp");
    } else {
      return true;
    }
  }

  /**
   * Checks whether the given player is a zone maker
   *
   * @param   player  Player to check
   * @return    true if the player is a zone maker
   */
  public boolean isZoneMaker(Player player) {
    // sort out disguised first
    for (String disguised : this.zoneMakersImpersonatingPlayers) {
      if (disguised.equals(player.getName())) {
        return false;
      }
    }

    for (String zoneMaker : this.zoneMakerNames) {
      if (zoneMaker.equals(player.getName())) {
        return true;
      }
    }
   
    return player.hasPermission("war.zonemaker");
  }
 
  /**
   * Checks whether the given player is a War admin
   *
   * @param   player  Player to check
   * @return    true if the player is a War admin
   */
  public boolean isWarAdmin(Player player) {
    return player.hasPermission("war.admin");
  }

  public void addWandBearer(Player player, String zoneName) {
    if (this.wandBearers.containsKey(player.getName())) {
      String alreadyHaveWand = this.wandBearers.get(player.getName());
      if (player.getInventory().first(Material.WOOD_SWORD) != -1) {
        if (zoneName.equals(alreadyHaveWand)) {
          this.badMsg(player, "You already have a wand for zone " + alreadyHaveWand + ". Drop the wooden sword first.");
        } else {
          // new zone, already have sword
          this.wandBearers.remove(player.getName());
          this.wandBearers.put(player.getName(), zoneName);
          this.msg(player, "Switched wand to zone " + zoneName + ".");
        }
      } else {
        // lost his sword, or new warzone
        if (zoneName.equals(alreadyHaveWand)) {
          // same zone, give him a new sword
          player.getInventory().addItem(new ItemStack(Material.WOOD_SWORD, 1, (byte) 8));
          this.msg(player, "Here's a new sword for zone " + zoneName + ".");
        }
      }
    } else {
      if (player.getInventory().firstEmpty() == -1) {
        this.badMsg(player, "Your inventory is full. Please drop an item and try again.");
      } else {
        this.wandBearers.put(player.getName(), zoneName);
        player.getInventory().addItem(new ItemStack(Material.WOOD_SWORD, 1, (byte) 8));
        // player.getWorld().dropItem(player.getLocation(), new ItemStack(Material.WOOD_SWORD));
        this.msg(player, "You now have a wand for zone " + zoneName + ". Left-click with wooden sword for corner 1. Right-click for corner 2.");
        War.war.log(player.getName() + " now has a wand for warzone " + zoneName, Level.INFO);
      }
    }
  }

  public boolean isWandBearer(Player player) {
    return this.wandBearers.containsKey(player.getName());
  }

  public String getWandBearerZone(Player player) {
    if (this.isWandBearer(player)) {
      return this.wandBearers.get(player.getName());
    }
    return "";
  }

  public void removeWandBearer(Player player) {
    if (this.wandBearers.containsKey(player.getName())) {
      this.wandBearers.remove(player.getName());
    }
  }
 
  public boolean isSpoutServer() {
    return this.isSpoutServer;
  }

  public Warzone zoneOfZoneWallAtProximity(Location location) {
    for (Warzone zone : this.warzones) {
      if (zone.getWorld() == location.getWorld() && zone.isNearWall(location)) {
        return zone;
      }
    }
    return null;
  }

  public List<String> getZoneMakerNames() {
    return this.zoneMakerNames;
  }

  public List<String> getCommandWhitelist() {
    return this.commandWhitelist;
  }

  public boolean inAnyWarzoneLobby(Location location) {
    if (ZoneLobby.getLobbyByLocation(location) == null) {
      return false;
    }
    return true;
  }

  public List<String> getZoneMakersImpersonatingPlayers() {
    return this.zoneMakersImpersonatingPlayers;
  }

  public List<Warzone> getIncompleteZones() {
    return this.incompleteZones;
  }

  public WarHub getWarHub() {
    return this.warHub;
  }

  public void setWarHub(WarHub warHub) {
    this.warHub = warHub;
  }

  public boolean isLoaded() {
    return this.loaded;
  }

  public void setLoaded(boolean loaded) {
    this.loaded = loaded;
  }

  public HashMap<String, PlayerState> getDisconnected() {
    return this.disconnected;
  }

  public void setDisconnected(HashMap<String, PlayerState> disconnected) {
    this.disconnected = disconnected;
  }

  public InventoryBag getDefaultInventories() {
    return defaultInventories;
  }

  public List<String> getDeadlyAdjectives() {
    return deadlyAdjectives;
  }

  public List<String> getKillerVerbs() {
    return killerVerbs;
  }

  public TeamConfigBag getTeamDefaultConfig() {
    return this.teamDefaultConfig ;
  }

  public WarzoneConfigBag getWarzoneDefaultConfig() {
    return this.warzoneDefaultConfig;
  }
 
  public WarConfigBag getWarConfig() {
    return this.warConfig;
  }

  public SpoutDisplayer getSpoutDisplayer() {
    return this.spoutMessenger ;
  }

  public void setWarhubMaterials(HubLobbyMaterials warhubMaterials) {
    this.warhubMaterials = warhubMaterials;
  }
 
  public HubLobbyMaterials getWarhubMaterials() {
    return this.warhubMaterials;
  }

  public boolean isTagServer() {
    return tagServer;
  }

  public KillstreakReward getKillstreakReward() {
    return killstreakReward;
  }

  public void setKillstreakReward(KillstreakReward killstreakReward) {
    this.killstreakReward = killstreakReward;
  }

  public MySQLConfig getMysqlConfig() {
    return mysqlConfig;
  }

  public void setMysqlConfig(MySQLConfig mysqlConfig) {
    this.mysqlConfig = mysqlConfig;
  }

  public String getString(String key) {
    return messages.getString(key);
  }

  public Locale getLoadedLocale() {
    return messages.getLocale();
  }

  /**
   * Convert serialized effect to actual effect.
   * @param serializedEffect String stored in configuration.
   *                         Format: TYPE;DURATION;AMPLIFY
   * @return Potion effect or null otherwise
   */
  public PotionEffect getPotionEffect(String serializedEffect) {
    String[] arr = serializedEffect.split(";");
    if (arr.length != 3) return null;
    try {
      PotionEffectType type = PotionEffectType.getByName(arr[0]);
      int duration = Integer.parseInt(arr[1]);
      int amplification = Integer.parseInt(arr[2]);
      return new PotionEffect(type, duration, amplification);
    } catch (RuntimeException ex) {
      return null;
    }
  }

  public Economy getEconomy() {
    return econ;
  }
}
TOP

Related Classes of com.tommytony.war.War

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.