Change log


This version requires a schema update. If you're using one of the 3 supported databases, this should occur automatically. However, please read that page for precautions to take. Also see the "Data Versioning" section below.

This version adds new config.yml options:

  • auto-refresh-force
  • vault-metadata-includes-group

This version adds new permissions:

  • zpermissions.player.*
    • zpermissions.player.manage
      • zpermissions.player.view
      • zpermissions.player.chat
  • zpermissions.group.*
    • zpermissions.group.manage
      • zpermissions.group.view
      • zpermissions.group.chat

The old permissions zpermissions.player and zpermissions.group are now deprecated. For the time being, they will remain as aliases for the "wildcard" versions (zpermissions.player.* and zpermissions.group.* respectively). Also see the permissions documentation.


  • Allow world argument to getPlayerPermissions() and getGroupPermissions() API methods to be null. This also fixes a bug with the playerHas() and groupHas() implementations for Vault.
  • Keep track of "data version." Add ability to refresh from database conditionally.
  • Add basic support for world mirroring.
  • Use finer-grained permissions to control "/permissions player" and "/permissions group" commands.
  • Add equivalent sub-commands (addgroup/removegroup) under player to add/remove players to/from groups.
  • Add ZPermissionsRankChangeEvent, a Bukkit event fired off upon successful completion of a rank command (promote, demote, setrank, unsetrank).
  • Add region manager support based on Factions roles/relations.
  • Add -m/--members-only option to group..purge command.

Data Versioning

To better support multi-server installations, zPermissions will now maintain a version number for the data in the database schema. A new table will be created named DATA_VERSION by default. (If you wish it to be named something else, you are advised to update config.yml before running the new version.)

This new table will normally contain a single row: the version number. All operations made through zPermissions that update the database will increment this version number.

The /permissions refresh command will now accept a new option flag: --conditional (which can be abbreviated simply as -c)

When run with this option, zPermissions will first check the data version in the database and compare it with the data version it was last initialized or refreshed with. If the versions are different, the refresh will be performed. Otherwise nothing happens.

This extends to the auto-refresh-interval option in config.yml. With this new version of zPermissions, the refreshes performed by setting auto-refresh-interval to a positive integer (representing the interval in minutes) will now be conditional. (This can be changed with the new auto-refresh-force option.)

The load on your server (and database) caused by the auto-refresh feature should now be significantly less. To synchronize servers, you can probably get away with much shorter intervals — like 5-10 minutes — or even 1 minute if you're absolutely sure zPermissions can load from the database fast enough (when zPermissions starts up, it will report how quickly it loaded your permissions which should give you an idea).

If you are making external modifications to the database schema while using the auto-refresh-interval option, then it is recommended that you change your process so you also increment the version number in the DATA_VERSION table. If this isn't possible, you can also switch auto-refresh-force to true to preserve the pre-1.1 behavior of auto-refresh. (That is, refreshes are done unconditionally at the defined interval.)

World Mirroring

World mirroring is a configuration option where you can define that permissions in one particular world will simply mirror that of another.

To set it up, simply add a section like the following to config.yml:

    - world_nether
    - world_the_end
    - creative_nether

In the above example, permissions for "world_nether" and "world_the_end" simply mirror permissions on "world." And permissions for "creative_nether" mirrors those on "creative."

Even if you have world mirroring enabled for a particular world you can still have world-specific permissions for that world. These world-specific permissions will always override the permissions from the mirrored world.

Vault Change

A new option named vault-metadata-includes-group has been added. It is similar to the already-existing vault-prefix-includes-group. It defaults to true, changing the pre-1.1 behavior.

When true, the Vault methods getPlayerInfo*() will fall back to returning metadata from the player's primary group, if present. This is to address issues with other plugins that don't do this fallback behavior themselves.

Factions Support

Region-specific permissions for Factions territories has been added. However, for Factions, it's a bit special. When setting permissions, the region names you use should be based on Factions roles/relations, e.g.:

/perm group default set leader/foo.bar

This means that all Faction leaders (assuming they are in the "default" group directly or through inheritance) will have the foo.bar permission node when they are in their own territory.

The exact names of all roles/relations are:


Note that if you are using Factions with other supported region plugins (e.g. WorldGuard), you will probably have to edit the region-managers option so that Factions is detected first.


Uploaded on
Oct 06, 2013
Game version
  • 1.6.4
351.4 KiB