@EventHandler(priority = EventPriority.HIGHEST)
 public void onBlockPlace(BlockPlaceEvent event) {
   if (event.getBlock().equals(place.getBlock())) {
     if (event.getBlock().getType().equals(Material.WOOL)) {
       if (((Wool) event.getBlock().getState().getData()).getColor().equals(color)) {
         if (Teams.getTeamByPlayer(event.getPlayer()).orNull() == team) {
           this.complete = true;
           if (this.show)
             ChatUtil.getGlobalChannel()
                 .sendLocalizedMessage(
                     new UnlocalizedChatMessage(
                         ChatColor.WHITE + "{0}",
                         new LocalizedChatMessage(
                             ChatConstant.UI_OBJECTIVE_PLACED,
                             team.getColor() + event.getPlayer().getName() + ChatColor.WHITE,
                             team.getCompleteName() + ChatColor.WHITE,
                             MiscUtil.convertDyeColorToChatColor(color)
                                 + name.toUpperCase().replaceAll("_", " ")
                                 + ChatColor.WHITE)));
           Fireworks.spawnFirework(
               event.getPlayer().getLocation(),
               event.getPlayer().getWorld(),
               MiscUtil.convertChatColorToColor(MiscUtil.convertDyeColorToChatColor(color)));
           ObjectiveCompleteEvent compEvent = new ObjectiveCompleteEvent(this, event.getPlayer());
           Bukkit.getServer().getPluginManager().callEvent(compEvent);
           event.setCancelled(false);
         } else {
           event.setCancelled(true);
           if (this.show)
             ChatUtil.sendWarningMessage(
                 event.getPlayer(), "You may not complete the other team's objective.");
         }
       } else {
         event.setCancelled(true);
         if (this.show)
           ChatUtil.sendWarningMessage(
               event.getPlayer(),
               new LocalizedChatMessage(
                   ChatConstant.ERROR_BLOCK_PLACE,
                   MiscUtil.convertDyeColorToChatColor(color)
                       + color.name().toUpperCase().replaceAll("_", " ")
                       + " WOOL"
                       + ChatColor.RED));
       }
     } else {
       event.setCancelled(true);
       if (this.show)
         ChatUtil.sendWarningMessage(
             event.getPlayer(),
             new LocalizedChatMessage(
                 ChatConstant.ERROR_BLOCK_PLACE,
                 MiscUtil.convertDyeColorToChatColor(color)
                     + color.name().toUpperCase().replaceAll("_", " ")
                     + " WOOL"
                     + ChatColor.RED));
     }
   }
 }
 @EventHandler(priority = EventPriority.MONITOR)
 public void onSafetyPlace(BlockPlaceEvent event) {
   if (!event.isCancelled() && this.touched) {
     if (event.getBlock().getType().equals(Material.WOOL)) {
       if (((Wool) event.getBlock().getState().getData()).getColor().equals(color)) {
         if (Teams.getTeamByPlayer(event.getPlayer()).orNull() == team) {
           if (event.getBlockPlaced().getLocation().distance(place.getLocation()) < proximity) {
             double old = proximity;
             proximity = event.getBlockPlaced().getLocation().distance(place.getLocation());
             Bukkit.getServer()
                 .getPluginManager()
                 .callEvent(new ObjectiveProximityEvent(this, event.getPlayer(), old, proximity));
           }
         }
       }
     }
   }
 }
 public boolean contains(BlockRegion region) {
   return contains(region.getVector());
 }
 @EventHandler
 public void onBlockBreak(BlockBreakEvent event) {
   if (event.getBlock().equals(place.getBlock())) {
     event.setCancelled(true);
   }
 }
 @EventHandler
 public void onWoolPickup(PlayerPickupItemEvent event) {
   Player player = event.getPlayer();
   if (!this.complete && GameHandler.getGameHandler().getMatch().isRunning()) {
     try {
       if (event.getItem().getItemStack().getType() == Material.WOOL
           && event.getItem().getItemStack().getData().getData() == color.getData()) {
         if (Teams.getTeamByPlayer(player).orNull() == team) {
           boolean touchMessage = false;
           if (!this.playersTouched.contains(player.getUniqueId())) {
             this.playersTouched.add(player.getUniqueId());
             if (this.show && !this.complete) {
               Teams.getTeamChannel(Optional.of(team))
                   .sendLocalizedMessage(
                       new UnlocalizedChatMessage(
                           ChatColor.WHITE + "{0}",
                           new LocalizedChatMessage(
                               ChatConstant.UI_OBJECTIVE_PICKED,
                               team.getColor() + player.getName() + ChatColor.WHITE,
                               MiscUtil.convertDyeColorToChatColor(color)
                                   + name.toUpperCase().replaceAll("_", " ")
                                   + ChatColor.WHITE,
                               team.getCompleteName() + ChatColor.WHITE)));
               for (Player player1 : Bukkit.getOnlinePlayers()) {
                 if (Teams.getTeamByPlayer(player1).isPresent()
                     && Teams.getTeamByPlayer(player1).get().isObserver()) {
                   player1.sendMessage(
                       new UnlocalizedChatMessage(
                               ChatColor.GRAY + "{0}",
                               new LocalizedChatMessage(
                                   ChatConstant.UI_OBJECTIVE_PICKED_FOR,
                                   team.getColor() + player.getName() + ChatColor.GRAY,
                                   MiscUtil.convertDyeColorToChatColor(color)
                                       + name.toUpperCase().replaceAll("_", " ")
                                       + ChatColor.GRAY,
                                   team.getCompleteName() + ChatColor.GRAY))
                           .getMessage(player1.getLocale()));
                 }
               }
               touchMessage = true;
             }
           }
           boolean oldState = this.touched;
           this.touched = true;
           if (touchMessage) {
             double newProx;
             if (location != null) {
               newProx = location.distance(place.getVector());
             } else {
               newProx = player.getLocation().toVector().distance(place.getVector());
             }
             if (!oldState || newProx < proximity) {
               proximity = newProx;
             }
           }
           ObjectiveTouchEvent touchEvent =
               new ObjectiveTouchEvent(this, player, !oldState, touchMessage);
           Bukkit.getServer().getPluginManager().callEvent(touchEvent);
         }
       }
     } catch (NullPointerException e) {
     }
   }
 }
  @SuppressWarnings({"unchecked"})
  private <T extends RegionModule> T mirrorRegion(T region) {

    if (region instanceof PointRegion) {

      PointRegion rg = (PointRegion) region;
      int[] v1 = getMirroredValues(rg.getX(), rg.getY(), rg.getZ());
      return (T) new PointRegion(null, rg.getX() + v1[0], rg.getY() + v1[1], rg.getZ() + v1[2]);

    } else if (region instanceof BlockRegion) {

      BlockRegion rg = (BlockRegion) region;
      int[] v1 = getMirroredValues(rg.getX(), rg.getY(), rg.getZ());
      return (T) new BlockRegion(null, rg.getX() + v1[0], rg.getY() + v1[1], rg.getZ() + v1[2]);

    } else if (region instanceof CircleRegion) {

      CircleRegion rg = (CircleRegion) region;
      int[] v1 = getMirroredValues(rg.getBaseX(), rg.getBaseY(), rg.getBaseZ());
      return (T)
          new CircleRegion(null, rg.getBaseX() + v1[0], rg.getBaseZ() + v1[2], rg.getRadius());

    } else if (region instanceof CylinderRegion) {

      CylinderRegion rg = (CylinderRegion) region;
      int[] v1 = getMirroredValues(rg.getBaseX(), rg.getBaseY(), rg.getBaseZ());
      return (T)
          new CylinderRegion(
              null,
              new Vector(rg.getBaseX() + v1[0], rg.getBaseY() + v1[1], rg.getBaseZ() + v1[2]),
              rg.getRadius(),
              rg.getHeight());

    } else if (region instanceof RectangleRegion) {

      RectangleRegion rg = (RectangleRegion) region;
      int[] v1 = getMirroredValues(rg.getXMin(), rg.getYMin(), rg.getZMin());
      int[] v2 = getMirroredValues(rg.getXMax(), rg.getYMax(), rg.getZMax());
      return (T)
          new RectangleRegion(
              null,
              rg.getXMin() + v1[0],
              rg.getZMin() + v1[2],
              rg.getXMax() + v2[0],
              rg.getZMax() + v2[2]);

    } else if (region instanceof CuboidRegion) {

      CuboidRegion rg = (CuboidRegion) region;
      int[] v1 = getMirroredValues(rg.getXMin(), rg.getYMin(), rg.getZMin());
      int[] v2 = getMirroredValues(rg.getXMax(), rg.getYMax(), rg.getZMax());
      return (T)
          new CuboidRegion(
              null,
              rg.getXMin() + v1[0],
              rg.getYMin() + v1[1],
              rg.getZMin() + v1[2],
              rg.getXMax() + v2[0],
              rg.getYMax() + v2[1],
              rg.getZMax() + v2[2]);

    } else if (region instanceof SphereRegion) {

      SphereRegion rg = (SphereRegion) region;
      int[] v1 = getMirroredValues(rg.getOriginX(), rg.getOriginY(), rg.getOriginZ());
      return (T)
          new SphereRegion(
              null,
              new Vector(rg.getOriginX() + v1[0], rg.getOriginY() + v1[1], rg.getOriginZ() + v1[2]),
              rg.getRadius());

    } else if (region instanceof EmptyRegion) {

      return (T) new EmptyRegion("");

    } else if (region instanceof ComplementRegion) {

      ComplementRegion rg = (ComplementRegion) region;
      ModuleCollection<RegionModule> regions = new ModuleCollection<>();
      for (RegionModule rg1 : rg.getRegions()) {
        regions.add(mirrorRegion(rg1));
      }
      return (T) new ComplementRegion(null, regions);

    } else if (region instanceof IntersectRegion) {

      IntersectRegion rg = (IntersectRegion) region;
      ModuleCollection<RegionModule> regions = new ModuleCollection<>();
      for (RegionModule rg1 : rg.getRegions()) {
        regions.add(mirrorRegion(rg1));
      }
      return (T) new IntersectRegion(null, regions);

    } else if (region instanceof NegativeRegion) {

      NegativeRegion rg = (NegativeRegion) region;
      ModuleCollection<RegionModule> regions = new ModuleCollection<>();
      for (RegionModule rg1 : rg.getRegions()) {
        regions.add(mirrorRegion(rg1));
      }
      return (T) new NegativeRegion(null, regions);

    } else if (region instanceof UnionRegion) {

      UnionRegion rg = (UnionRegion) region;
      ModuleCollection<RegionModule> regions = new ModuleCollection<>();
      for (RegionModule rg1 : rg.getRegions()) {
        regions.add(mirrorRegion(rg1));
      }
      return (T) new UnionRegion(null, regions);

    } else if (region instanceof TranslatedRegion) {

      TranslatedRegion rg = (TranslatedRegion) region;
      return (T) new TranslatedRegion(null, mirrorRegion(rg.getRegion()));

    } else if (region instanceof MirroredRegion) {

      MirroredRegion rg = (MirroredRegion) region;
      return (T) new MirroredRegion(null, mirrorRegion(rg.getRegion()));
    }
    return null;
  }