public void loadBeacon() {
    beaconFlagBlocks = new ArrayList<Block>();
    beaconWireframeBlocks = new ArrayList<Block>();

    if (!TownyWarConfig.isDrawingBeacon()) return;

    int beaconSize = TownyWarConfig.getBeaconSize();
    if (Coord.getCellSize() < beaconSize) return;

    Block minBlock = getBeaconMinBlock(getFlagBaseBlock().getWorld());
    if (flagBaseBlock.getY() + 4 > minBlock.getY()) return;

    int outerEdge = beaconSize - 1;
    for (int y = 0; y < beaconSize; y++) {
      for (int z = 0; z < beaconSize; z++) {
        for (int x = 0; x < beaconSize; x++) {
          Block block =
              flagBaseBlock
                  .getWorld()
                  .getBlockAt(minBlock.getX() + x, minBlock.getY() + y, minBlock.getZ() + z);
          if (block.isEmpty()) {
            int edgeCount = getEdgeCount(x, y, z, outerEdge);
            if (edgeCount == 1) {
              beaconFlagBlocks.add(block);
            } else if (edgeCount > 1) {
              beaconWireframeBlocks.add(block);
            }
          }
        }
      }
    }
  }
  public void drawFlag() {
    loadBeacon();

    flagBaseBlock.setType(TownyWarConfig.getFlagBaseMaterial());
    updateFlag();
    flagLightBlock.setType(TownyWarConfig.getFlagLightMaterial());
    for (Block block : beaconWireframeBlocks)
      block.setType(TownyWarConfig.getBeaconWireFrameMaterial());
  }
  private Block getBeaconMinBlock(World world) {
    int middle = (int) Math.floor(Coord.getCellSize() / 2.0);
    int radiusCenterExpansion = TownyWarConfig.getBeaconRadius() - 1;
    int fromCorner = middle - radiusCenterExpansion;
    int maxY = world.getMaxHeight();

    int x = (getX() * Coord.getCellSize()) + fromCorner;
    int y = maxY - TownyWarConfig.getBeaconSize();
    int z = (getZ() * Coord.getCellSize()) + fromCorner;

    return world.getBlockAt(x, y, z);
  }
 public void begin() {
   drawFlag();
   thread =
       plugin
           .getServer()
           .getScheduler()
           .scheduleSyncRepeatingTask(
               plugin,
               new CellAttackThread(this),
               TownyWarConfig.getTimeBetweenFlagColorChange(),
               TownyWarConfig.getTimeBetweenFlagColorChange());
 }
  public void updateFlag() {
    DyeColor[] woolColors = TownyWarConfig.getWoolColors();
    if (flagColorId < woolColors.length) {
      System.out.println(
          String.format(
              "Flag at %s turned %s.", getCellString(), woolColors[flagColorId].toString()));
      int woolId = Material.WOOL.getId();
      byte woolData = woolColors[flagColorId].getData();

      flagBlock.setTypeIdAndData(woolId, woolData, true);
      for (Block block : beaconFlagBlocks) block.setTypeIdAndData(woolId, woolData, true);
    }
  }
 public boolean hasEnded() {
   return flagColorId >= TownyWarConfig.getWoolColors().length;
 }