/**
   * Called when a player attempts to log in to the server
   *
   * @param event Relevant event details
   */
  @Override
  public void onPlayerLogin(PlayerLoginEvent event) {
    Player player = event.getPlayer();

    GlobalConfiguration cfg = plugin.getGlobalConfiguration();
    WorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());

    if (wcfg.enforceOneSession) {
      String name = player.getName();

      for (Player pl : plugin.getServer().getOnlinePlayers()) {
        if (pl.getName().equalsIgnoreCase(name)) {
          pl.kickPlayer("Logged in from another location.");
        }
      }
    }

    if (!checkediConomy) {
      iConomy iconomy = (iConomy) plugin.getServer().getPluginManager().getPlugin("iConomy");
      if (iconomy != null) {
        plugin.getGlobalConfiguration().setiConomy(iconomy);
      }

      checkediConomy = true;
    }
  }
 /**
  * @param defaultListener Revision listener that shall be applied if {@code
  *     org.hibernate.envers.revision_listener} parameter has not been set.
  * @return Revision listener.
  */
 private Class<? extends RevisionListener> getRevisionListenerClass(
     Class<? extends RevisionListener> defaultListener) {
   if (globalCfg.getRevisionListenerClass() != null) {
     return globalCfg.getRevisionListenerClass();
   }
   return defaultListener;
 }
  public void onEntityDamageByBlock(EntityDamageByBlockEvent event) {

    Entity defender = event.getEntity();
    DamageCause type = event.getCause();

    if (defender instanceof Player) {
      Player player = (Player) defender;

      GlobalConfiguration cfg = plugin.getGlobalConfiguration();
      WorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());

      if (cfg.isInvinciblePlayer(player.getName())) {
        event.setCancelled(true);
        return;
      }

      if (wcfg.disableLavaDamage && type == DamageCause.LAVA) {
        event.setCancelled(true);
        return;
      }

      if (wcfg.disableContactDamage && type == DamageCause.CONTACT) {
        event.setCancelled(true);
        return;
      }
    }
  }
  /**
   * Called when a player attempts to pickup an item
   *
   * @param event Relevant event details
   */
  @Override
  public void onPlayerPickupItem(PlayerPickupItemEvent event) {

    if (event.isCancelled()) {
      return;
    }

    GlobalConfiguration cfg = plugin.getGlobalConfiguration();
    WorldConfiguration wcfg = cfg.getWorldConfig(event.getPlayer().getWorld().getName());

    if (wcfg.getBlacklist() != null) {
      Item ci = event.getItem();

      if (!wcfg.getBlacklist()
          .check(
              new ItemAcquireBlacklistEvent(
                  BukkitPlayer.wrapPlayer(plugin, event.getPlayer()),
                  toVector(ci.getLocation()),
                  ci.getItemStack().getTypeId()),
              false,
              false)) {
        event.setCancelled(true);
        return;
      }
    }
  }
  public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
    Entity attacker = event.getDamager();
    Entity defender = event.getEntity();

    if (defender instanceof Player) {
      Player player = (Player) defender;

      GlobalConfiguration cfg = plugin.getGlobalConfiguration();
      WorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());

      if (cfg.isInvinciblePlayer(player.getName())) {
        event.setCancelled(true);
        return;
      }

      if (attacker != null && attacker instanceof Player) {
        if (wcfg.useRegions) {
          Vector pt = toVector(defender.getLocation());
          RegionManager mgr =
              plugin.getGlobalRegionManager().getRegionManager(player.getWorld().getName());

          if (!mgr.getApplicableRegions(pt).isStateFlagAllowed(Flags.PVP)) {
            ((Player) attacker).sendMessage(ChatColor.DARK_RED + "You are in a no-PvP area.");
            event.setCancelled(true);
            return;
          }
        }
      }

      if (attacker != null && attacker instanceof Monster) {
        if (attacker instanceof Creeper && wcfg.blockCreeperExplosions) {
          event.setCancelled(true);
          return;
        }

        if (wcfg.useRegions) {
          Vector pt = toVector(defender.getLocation());
          RegionManager mgr =
              plugin.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
          ApplicableRegionSet set = mgr.getApplicableRegions(pt);

          if (!set.isStateFlagAllowed(Flags.MOB_DAMAGE)) {
            event.setCancelled(true);
            return;
          }

          if (attacker instanceof Creeper) {
            if (!set.isStateFlagAllowed(Flags.CREEPER_EXPLOSION)) {
              event.setCancelled(true);
              return;
            }
          }
        }
      }
    }
  }
  /**
   * Called when a player leaves a server
   *
   * @param event Relevant event details
   */
  @Override
  public void onPlayerQuit(PlayerQuitEvent event) {
    Player player = event.getPlayer();

    GlobalConfiguration cfg = plugin.getGlobalConfiguration();

    cfg.removeInvinciblePlayer(player.getName());
    cfg.removeAmphibiousPlayer(player.getName());

    cfg.forgetPlayer(BukkitPlayer.wrapPlayer(plugin, player));
  }
  @Override
  public void onEntityExplode(EntityExplodeEvent event) {

    if (event.isCancelled()) {
      return;
    }

    GlobalConfiguration cfg = plugin.getGlobalConfiguration();
    Location l = event.getLocation();
    WorldConfiguration wcfg = cfg.getWorldConfig(l.getWorld().getName());

    if (event.getEntity() instanceof LivingEntity) {

      if (wcfg.blockCreeperBlockDamage) {
        event.setCancelled(true);
        return;
      }

      if (wcfg.blockCreeperExplosions) {
        event.setCancelled(true);
        return;
      }

      if (wcfg.useRegions) {
        Vector pt = toVector(l);
        RegionManager mgr = plugin.getGlobalRegionManager().getRegionManager(wcfg.getWorldName());

        if (!mgr.getApplicableRegions(pt).isStateFlagAllowed(Flags.CREEPER_EXPLOSION)) {
          event.setCancelled(true);
          return;
        }
      }
    } else { // Shall assume that this is TNT
      if (wcfg.blockTNT) {
        event.setCancelled(true);
        return;
      }

      if (wcfg.useRegions) {
        Vector pt = toVector(l);
        RegionManager mgr = plugin.getGlobalRegionManager().getRegionManager(wcfg.getWorldName());

        if (!mgr.getApplicableRegions(pt).isStateFlagAllowed(Flags.TNT)) {
          event.setCancelled(true);
          return;
        }
      }
    }
  }
 static SmlHost checkForSmlHostnameOverride(SmlHost smlHost) {
   String smlHostname = GlobalConfiguration.getInstance().getSmlHostname();
   if (!String.valueOf(smlHostname).isEmpty()) {
     log.debug("SML hostname has been overridden: [" + smlHostname + "]");
     smlHost = SmlHost.valueOf(smlHostname);
   }
   return smlHost;
 }
  public GlobalConfigurationBuilder read(GlobalConfiguration template) {
    this.cl = template.classLoader();

    asyncListenerExecutor.read(template.asyncListenerExecutor());
    asyncTransportExecutor.read(template.asyncTransportExecutor());
    evictionScheduledExecutor.read(template.evictionScheduledExecutor());
    globalJmxStatistics.read(template.globalJmxStatistics());
    replicationQueueScheduledExecutor.read(template.replicationQueueScheduledExecutor());
    serialization.read(template.serialization());
    shutdown.read(template.shutdown());
    transport.read(template.transport());

    return this;
  }
  // @Override
  public void onPlayerJoin(PlayerJoinEvent event) {
    Player player = event.getPlayer();

    GlobalConfiguration cfg = plugin.getGlobalConfiguration();
    WorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());

    if (wcfg.fireSpreadDisableToggle) {
      player.sendMessage(ChatColor.YELLOW + "Fire spread is currently globally disabled.");
    }

    // if (cfg.godmode || plugin.inGroup(player, "wg-invincible")) {
    cfg.addInvinciblePlayer(player.getName());
    // }

    if (plugin.inGroup(player, "wg-amphibious")) {
      cfg.addAmphibiousPlayer(player.getName());
    }
  }
示例#11
0
  /**
   * Answer all the registered validators as they were defined by the extension points. That is
   * answer the validators as if the user has never applied any customizations.
   *
   * @return Answer an empty array if there are no validators.
   */
  public static Validator[] getDefaultValidators() throws InvocationTargetException {
    Map<String, Validator> extVals = ExtensionValidators.instance().getMapV2();
    TreeSet<Validator> sorted = new TreeSet<Validator>();
    for (Validator v : extVals.values()) sorted.add(v);

    IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
    GlobalConfiguration gc = new GlobalConfiguration(root);
    gc.resetToDefault();
    for (ValidatorMetaData vmd : gc.getValidators()) {
      Validator v = Validator.create(vmd, gc, null);
      v.setBuildValidation(vmd.isBuildValidation());
      v.setManualValidation(vmd.isManualValidation());
      sorted.add(v);
    }

    Validator[] val = new Validator[sorted.size()];
    sorted.toArray(val);
    return val;
  }
  @Override
  public void onCreatureSpawn(CreatureSpawnEvent event) {
    if (event.isCancelled()) {
      return;
    }

    GlobalConfiguration cfg = plugin.getGlobalConfiguration();
    WorldConfiguration wcfg = cfg.getWorldConfig(event.getEntity().getWorld().getName());

    // CreatureType creaType = (CreatureType) CreatureType.valueOf(event.getMobType().toString());
    CreatureType creaType = event.getCreatureType();
    String creaName = "";
    Boolean cancelEvent = false;

    if (wcfg.blockCreatureSpawn.contains(creaType)) {
      cancelEvent = true;
    }

    if (wcfg.useRegions) {
      Vector pt = toVector(event.getEntity().getLocation());
      RegionManager mgr =
          plugin.getGlobalRegionManager().getRegionManager(event.getEntity().getWorld().getName());

      Boolean flagValue =
          mgr.getApplicableRegions(pt)
              .getStringFlag(Flags.DENY_SPAWN, true)
              .getValue("")
              .contains(creaType.getName());
      if (flagValue != null) {
        if (flagValue) {
          cancelEvent = true;
        } else {
          cancelEvent = false;
        }
      }
    }

    if (cancelEvent) {
      event.setCancelled(true);
      return;
    }
  }
  private Document generateDefaultRevisionInfoXmlMapping() {
    Document document = XMLHelper.getDocumentFactory().createDocument();

    Element class_mapping =
        MetadataTools.createEntity(
            document,
            new AuditTableData(
                null, null, globalCfg.getDefaultSchemaName(), globalCfg.getDefaultCatalogName()),
            null);

    class_mapping.addAttribute("name", revisionInfoEntityName);
    class_mapping.addAttribute("table", "REVINFO");

    Element idProperty =
        MetadataTools.addNativelyGeneratedId(
            class_mapping, revisionInfoIdData.getName(), revisionPropType);
    MetadataTools.addColumn(idProperty, "REV", null, 0, 0, null, null, null, false);

    Element timestampProperty =
        MetadataTools.addProperty(
            class_mapping,
            revisionInfoTimestampData.getName(),
            revisionInfoTimestampType.getName(),
            true,
            false);
    MetadataTools.addColumn(timestampProperty, "REVTSTMP", null, 0, 0, null, null, null, false);

    if (globalCfg.isTrackEntitiesChangedInRevisionEnabled()) {
      generateEntityNamesTrackingTableMapping(
          class_mapping,
          "modifiedEntityNames",
          globalCfg.getDefaultSchemaName(),
          globalCfg.getDefaultCatalogName(),
          "REVCHANGES",
          "REV",
          "ENTITYNAME",
          "string");
    }

    return document;
  }
示例#14
0
  /**
   * Discovers which SML host should be used.
   *
   * @return the SML host instance to be used
   */
  static SmlHost discoverSmlHost() {
    SmlHost smlHost;
    switch (GlobalConfiguration.getInstance().getModeOfOperation()) {
      case TEST:
        log.warn("Mode of operation is TEST");
        smlHost = SmlHost.TEST_SML;
        break;
      default:
        smlHost = SmlHost.PRODUCTION_SML;
        break;
    }

    // Finally we check to see if the SML hostname has been overridden in the configuration file
    smlHost = checkForSmlHostnameOverride(smlHost);

    log.debug("SML hostname: " + smlHost);
    return smlHost;
  }
  @Override
  public void onEntityDamage(EntityDamageEvent event) {

    if (event.isCancelled()) {
      return;
    }

    if (event instanceof EntityDamageByProjectileEvent) {
      this.onEntityDamageByProjectile((EntityDamageByProjectileEvent) event);
      return;
    } else if (event instanceof EntityDamageByEntityEvent) {
      this.onEntityDamageByEntity((EntityDamageByEntityEvent) event);
      return;
    } else if (event instanceof EntityDamageByBlockEvent) {
      this.onEntityDamageByBlock((EntityDamageByBlockEvent) event);
      return;
    }

    Entity defender = event.getEntity();
    DamageCause type = event.getCause();

    if (defender instanceof Player) {
      Player player = (Player) defender;

      GlobalConfiguration cfg = plugin.getGlobalConfiguration();
      WorldConfiguration wcfg = cfg.getWorldConfig(player.getWorld().getName());

      if (cfg.isInvinciblePlayer(player.getName())) {
        event.setCancelled(true);
        return;
      }

      if (wcfg.disableFallDamage && type == DamageCause.FALL) {
        event.setCancelled(true);
        return;
      }

      if (wcfg.disableFireDamage && (type == DamageCause.FIRE || type == DamageCause.FIRE_TICK)) {
        event.setCancelled(true);
        return;
      }

      if (wcfg.disableDrowningDamage && type == DamageCause.DROWNING) {
        event.setCancelled(true);
        return;
      }

      if (wcfg.teleportOnSuffocation && type == DamageCause.SUFFOCATION) {
        findFreePosition(player);
        event.setCancelled(true);
        return;
      }

      if (wcfg.disableSuffocationDamage && type == DamageCause.SUFFOCATION) {
        event.setCancelled(true);
        return;
      }

      if (type == DamageCause.DROWNING && cfg.isAmphibiousPlayer(player.getName())) {
        event.setCancelled(true);
        return;
      }
    }
  }
  public RevisionInfoConfigurationResult configure(
      Configuration cfg, ReflectionManager reflectionManager) {
    Iterator<PersistentClass> classes = (Iterator<PersistentClass>) cfg.getClassMappings();
    boolean revisionEntityFound = false;
    RevisionInfoGenerator revisionInfoGenerator = null;

    Class<?> revisionInfoClass = null;

    while (classes.hasNext()) {
      PersistentClass pc = classes.next();
      XClass clazz;
      try {
        clazz = reflectionManager.classForName(pc.getClassName(), this.getClass());
      } catch (ClassNotFoundException e) {
        throw new MappingException(e);
      }

      RevisionEntity revisionEntity = clazz.getAnnotation(RevisionEntity.class);
      if (revisionEntity != null) {
        if (revisionEntityFound) {
          throw new MappingException("Only one entity may be annotated with @RevisionEntity!");
        }

        // Checking if custom revision entity isn't audited
        if (clazz.getAnnotation(Audited.class) != null) {
          throw new MappingException("An entity annotated with @RevisionEntity cannot be audited!");
        }

        revisionEntityFound = true;

        MutableBoolean revisionNumberFound = new MutableBoolean();
        MutableBoolean revisionTimestampFound = new MutableBoolean();
        MutableBoolean modifiedEntityNamesFound = new MutableBoolean();

        searchForRevisionInfoCfg(
            clazz,
            reflectionManager,
            revisionNumberFound,
            revisionTimestampFound,
            modifiedEntityNamesFound);

        if (!revisionNumberFound.isSet()) {
          throw new MappingException(
              "An entity annotated with @RevisionEntity must have a field annotated "
                  + "with @RevisionNumber!");
        }

        if (!revisionTimestampFound.isSet()) {
          throw new MappingException(
              "An entity annotated with @RevisionEntity must have a field annotated "
                  + "with @RevisionTimestamp!");
        }

        revisionInfoEntityName = pc.getEntityName();
        revisionInfoClass = pc.getMappedClass();
        Class<? extends RevisionListener> revisionListenerClass =
            getRevisionListenerClass(revisionEntity.value());
        revisionInfoTimestampType = pc.getProperty(revisionInfoTimestampData.getName()).getType();
        if (globalCfg.isTrackEntitiesChangedInRevisionEnabled()
            || DefaultTrackingModifiedEntitiesRevisionEntity.class.isAssignableFrom(
                revisionInfoClass)
            || modifiedEntityNamesFound.isSet()) {
          // If tracking modified entities parameter is enabled, custom revision info entity is a
          // subtype
          // of DefaultTrackingModifiedEntitiesRevisionEntity class, or @ModifiedEntityNames
          // annotation is used.
          revisionInfoGenerator =
              new DefaultTrackingModifiedEntitiesRevisionInfoGenerator(
                  revisionInfoEntityName,
                  revisionInfoClass,
                  revisionListenerClass,
                  revisionInfoTimestampData,
                  isTimestampAsDate(),
                  modifiedEntityNamesData);
          globalCfg.setTrackEntitiesChangedInRevisionEnabled(true);
        } else {
          revisionInfoGenerator =
              new DefaultRevisionInfoGenerator(
                  revisionInfoEntityName,
                  revisionInfoClass,
                  revisionListenerClass,
                  revisionInfoTimestampData,
                  isTimestampAsDate());
        }
      }
    }

    // In case of a custom revision info generator, the mapping will be null.
    Document revisionInfoXmlMapping = null;

    Class<? extends RevisionListener> revisionListenerClass =
        getRevisionListenerClass(RevisionListener.class);

    if (revisionInfoGenerator == null) {
      if (globalCfg.isTrackEntitiesChangedInRevisionEnabled()) {
        revisionInfoClass = DefaultTrackingModifiedEntitiesRevisionEntity.class;
        revisionInfoEntityName = DefaultTrackingModifiedEntitiesRevisionEntity.class.getName();
        revisionInfoGenerator =
            new DefaultTrackingModifiedEntitiesRevisionInfoGenerator(
                revisionInfoEntityName,
                revisionInfoClass,
                revisionListenerClass,
                revisionInfoTimestampData,
                isTimestampAsDate(),
                modifiedEntityNamesData);
      } else {
        revisionInfoClass = DefaultRevisionEntity.class;
        revisionInfoGenerator =
            new DefaultRevisionInfoGenerator(
                revisionInfoEntityName,
                revisionInfoClass,
                revisionListenerClass,
                revisionInfoTimestampData,
                isTimestampAsDate());
      }
      revisionInfoXmlMapping = generateDefaultRevisionInfoXmlMapping();
    }

    return new RevisionInfoConfigurationResult(
        revisionInfoGenerator,
        revisionInfoXmlMapping,
        new RevisionInfoQueryCreator(
            revisionInfoEntityName,
            revisionInfoIdData.getName(),
            revisionInfoTimestampData.getName(),
            isTimestampAsDate()),
        generateRevisionInfoRelationMapping(),
        new RevisionInfoNumberReader(revisionInfoClass, revisionInfoIdData),
        globalCfg.isTrackEntitiesChangedInRevisionEnabled()
            ? new ModifiedEntityNamesReader(revisionInfoClass, modifiedEntityNamesData)
            : null,
        revisionInfoEntityName,
        revisionInfoClass,
        revisionInfoTimestampData);
  }
  public void onPlayerInteract(PlayerInteractEvent event) {
    if (event.isCancelled()) {
      return;
    }
    Action action = event.getAction();
    if (action == Action.RIGHT_CLICK_BLOCK || action == Action.RIGHT_CLICK_AIR) {
      Block block = event.getClickedBlock();
      Material type = block.getType();
      Player player = event.getPlayer();

      GlobalConfiguration cfg = plugin.getGlobalConfiguration();
      WorldConfiguration wcfg = cfg.getWorldConfig(event.getClickedBlock().getWorld().getName());

      if (wcfg.useRegions && player.getItemInHand().getTypeId() == wcfg.regionWand) {
        Vector pt = toVector(block);

        RegionManager mgr =
            plugin.getGlobalRegionManager().getRegionManager(player.getWorld().getName());
        ApplicableRegionSet app = mgr.getApplicableRegions(pt);
        List<String> regions = mgr.getApplicableRegionsIDs(pt);

        if (regions.size() > 0) {
          player.sendMessage(
              ChatColor.YELLOW
                  + "Can you build? "
                  + (app.canBuild(BukkitPlayer.wrapPlayer(plugin, player)) ? "Yes" : "No"));

          StringBuilder str = new StringBuilder();
          for (Iterator<String> it = regions.iterator(); it.hasNext(); ) {
            str.append(it.next());
            if (it.hasNext()) {
              str.append(", ");
            }
          }

          player.sendMessage(ChatColor.YELLOW + "Applicable regions: " + str.toString());
        } else {
          player.sendMessage(ChatColor.YELLOW + "WorldGuard: No defined regions here!");
        }
      }

      if (block.getType() == Material.CHEST
          || block.getType() == Material.DISPENSER
          || block.getType() == Material.FURNACE
          || block.getType() == Material.BURNING_FURNACE
          || block.getType() == Material.NOTE_BLOCK) {
        if (wcfg.useRegions) {
          Vector pt = toVector(block);
          LocalPlayer localPlayer = BukkitPlayer.wrapPlayer(plugin, player);
          RegionManager mgr =
              plugin.getGlobalRegionManager().getRegionManager(player.getWorld().getName());

          if (!plugin.hasPermission(player, "region.bypass")) {
            ApplicableRegionSet set = mgr.getApplicableRegions(pt);
            if (!set.isStateFlagAllowed(Flags.CHEST_ACCESS) && !set.canBuild(localPlayer)) {
              player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area.");
              event.setCancelled(true);
              return;
            }
          }
        }
      }

      if (wcfg.useRegions && (type == Material.LEVER || type == Material.STONE_BUTTON)) {
        Vector pt = toVector(block);
        RegionManager mgr =
            cfg.getWorldGuardPlugin()
                .getGlobalRegionManager()
                .getRegionManager(player.getWorld().getName());
        ApplicableRegionSet applicableRegions = mgr.getApplicableRegions(pt);
        LocalPlayer localPlayer = BukkitPlayer.wrapPlayer(plugin, player);

        if (!applicableRegions.isStateFlagAllowed(Flags.LEVER_AND_BUTTON, localPlayer)) {
          player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area.");
          event.setCancelled(true);
          return;
        }
      }

      if (wcfg.useRegions && type == Material.CAKE_BLOCK) {

        Vector pt = toVector(block);

        if (!cfg.canBuild(player, pt)) {
          player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area.");

          byte newData = (byte) (block.getData() - 1);
          newData = newData < 0 ? 0 : newData;

          block.setData(newData);
          player.setHealth(player.getHealth() - 3);

          return;
        }
      }

      if (wcfg.useRegions
          && wcfg.useiConomy
          && cfg.getiConomy() != null
          && (type == Material.SIGN_POST || type == Material.SIGN || type == Material.WALL_SIGN)) {
        BlockState blockstate = block.getState();

        if (((Sign) blockstate).getLine(0).equalsIgnoreCase("[WorldGuard]")
            && ((Sign) blockstate).getLine(1).equalsIgnoreCase("For sale")) {
          String regionId = ((Sign) blockstate).getLine(2);
          // String regionComment = ((Sign)block).getLine(3);

          if (regionId != null && regionId != "") {
            RegionManager mgr =
                cfg.getWorldGuardPlugin()
                    .getGlobalRegionManager()
                    .getRegionManager(player.getWorld().getName());
            ProtectedRegion region = mgr.getRegion(regionId);

            if (region != null) {
              RegionFlagContainer flags = region.getFlags();

              if (flags.getBooleanFlag(Flags.BUYABLE).getValue(false)) {
                if (iConomy.getBank().hasAccount(player.getName())) {
                  Account account = iConomy.getBank().getAccount(player.getName());
                  double balance = account.getBalance();
                  double regionPrice = flags.getDoubleFlag(Flags.PRICE).getValue();

                  if (balance >= regionPrice) {
                    account.subtract(regionPrice);
                    player.sendMessage(
                        ChatColor.YELLOW
                            + "You have bought the region "
                            + regionId
                            + " for "
                            + iConomy.getBank().format(regionPrice));
                    DefaultDomain owners = region.getOwners();
                    owners.addPlayer(player.getName());
                    region.setOwners(owners);
                    flags.getBooleanFlag(Flags.BUYABLE).setValue(false);
                    account.save();
                  } else {
                    player.sendMessage(ChatColor.YELLOW + "You have not enough money.");
                  }
                } else {
                  player.sendMessage(ChatColor.YELLOW + "You have not enough money.");
                }
              } else {
                player.sendMessage(ChatColor.RED + "Region: " + regionId + " is not buyable");
              }
            } else {
              player.sendMessage(
                  ChatColor.DARK_RED + "The region " + regionId + " does not exist.");
            }
          } else {
            player.sendMessage(ChatColor.DARK_RED + "No region specified.");
          }
        }
      }

      if (wcfg.getBlacklist() != null) {

        if (!wcfg.getBlacklist()
            .check(
                new BlockInteractBlacklistEvent(
                    BukkitPlayer.wrapPlayer(plugin, player), toVector(block), block.getTypeId()),
                false,
                false)) {
          event.setCancelled(true);
          return;
        }
      }
    }
  }
  public GlobalConfigurationBuilder read(GlobalConfiguration template) {
    this.cl = new WeakReference<ClassLoader>(template.classLoader());

    for (Object c : template.modules().values()) {
      BuiltBy builtBy = c.getClass().getAnnotation(BuiltBy.class);
      Builder<Object> builder = (Builder<Object>) this.addModule(builtBy.value());
      builder.read(c);
    }

    asyncListenerExecutor.read(template.asyncListenerExecutor());
    asyncTransportExecutor.read(template.asyncTransportExecutor());
    remoteCommandsExecutor.read(template.remoteCommandsExecutor());
    evictionScheduledExecutor.read(template.evictionScheduledExecutor());
    globalJmxStatistics.read(template.globalJmxStatistics());
    replicationQueueScheduledExecutor.read(template.replicationQueueScheduledExecutor());
    serialization.read(template.serialization());
    shutdown.read(template.shutdown());
    transport.read(template.transport());
    site.read(template.sites());
    totalOrderExecutor.read(template.totalOrderExecutor());
    return this;
  }