public String allowBuild(Player player, Location location) {
    PlayerData playerData = this.dataStore.getPlayerData(player.getName());
    Claim claim = this.dataStore.getClaimAt(location, false, playerData.lastClaim);
    WorldConfig wc = GriefPrevention.instance.getWorldCfg(player.getWorld());
    // exception: administrators in ignore claims mode and special player accounts created by server
    // mods
    if (playerData.ignoreClaims || wc.getModsIgnoreClaimsAccounts().contains(player.getName()))
      return null;

    // wilderness rules
    if (claim == null) {
      // no building in the wilderness in creative mode
      if (this.creativeRulesApply(location)) {
        String reason =
            this.dataStore.getMessage(Messages.NoBuildOutsideClaims)
                + "  "
                + this.dataStore.getMessage(Messages.CreativeBasicsDemoAdvertisement);
        if (player.hasPermission("griefprevention.ignoreclaims"))
          reason += "  " + this.dataStore.getMessage(Messages.IgnoreClaimsAdvertisement);
        return reason;
      }

      // no building in survival wilderness when that is configured
      else if (wc.getApplyTrashBlockRules() && wc.getClaimsEnabled()) {
        if (wc.getTrashBlockPlacementBehaviour().Allowed(location, player).Denied())
          return this.dataStore.getMessage(Messages.NoBuildOutsideClaims)
              + "  "
              + this.dataStore.getMessage(Messages.SurvivalBasicsDemoAdvertisement);
        else return null;
      } else {
        // but it's fine in creative
        return null;
      }
    }

    // if not in the wilderness, then apply claim rules (permissions, etc)
    else {
      // cache the claim for later reference
      playerData.lastClaim = claim;
      return claim.allowBuild(player);
    }
  }