Roles, Permissions & Settings
Every island governs who can do what through two independent typed systems: roles (per-island, weighted, carry a set of IslandPermissions that gate member/co-op actions) and settings (per-island, environment flags that gate world behavior like PvP, explosions, and time/weather). Both catalogues — the full list of permissions and the full list of settings — are fixed by the plugin's enums; only which ones a role grants, and which ones an island has toggled on, are per-island data.
Roles
roles.yml structure
roles.yml seeds every new island's role set. It deserializes to RolesConfiguration, a map of role id → entry:
Field | Type | Required | Description |
|---|---|---|---|
(map key) | String | Yes | The role's id, e.g. |
|
| Yes | Deserializes into |
| int | Yes | Seniority. Higher outranks lower — drives promote/demote stepping and the "higher role" protections below. Must be unique per island; the shipped roles use |
| boolean | Yes ( | Marks the role new members are given. |
| String | Yes | Display name (used in role-management menus and in messages like |
|
| Yes |
|
|
| Yes | Raw keys resolved against |
RoleService.defaultRoleSeeds builds one RoleSeed (an IslandRole + its resolved EnumSet<IslandPermission>) per entry, in roles.yml iteration order; IslandRepository#create inserts them as part of the single island-creation transaction. roles.yml only affects islands created afterward — /is reload re-parses the file but does not retroactively touch existing islands' persisted roles or permissions.
Shipped roles
Id |
|
|
| Permissions |
|---|---|---|---|---|
|
|
|
|
|
|
|
|
| Build/break/interact-with-the-world grants ( |
|
|
|
| Everything |
|
|
|
|
|
Role weight & hierarchy
weight is the whole hierarchy mechanism — there is no separate rank field. It is used in two places:
Island#canEditRole(player, role)—truefor admins/the owner; for anyone else, only if their own member role'sweightis strictly greater than the target role'sweight. This gates[toggle-role-permission]andRoleService#updatePermissions(backing[update-role-permissions]): failing it sendsASMessages.ROLE_PERMISSION_HIGHER(" You cannot assign a role higher than your own. ").Promote/demote stepping (
MemberService#promote/#demote, see Members) — walks the island's roles ordered by ascendingweightand moves the target one step up/down that ladder. Non-owners can't promote a member to, or demote a member from, aweightat or above their own; those checks (and kicking/banning a peer-or-senior member) fail withASMessages.MEMBER_HIGHER_ROLE(" You cannot do that to a member whose role is equal to or higher than yours. ").
In short: ROLE_PERMISSION_HIGHER guards editing a role's permission set, while MEMBER_HIGHER_ROLE guards acting on a member whose role outranks (or matches) the actor's.
IslandPermission
IslandPermission is a fixed enum — the full catalogue an island can grant, never extended per-island. Each constant implements ConfigurationEnum<ItemStackWrapper>; permissions.yml supplies the display item (material, name, lore) for every constant, keyed by its kebab-case name (SPAWNER_BREAK → spawner-break) and loaded via ConfigurationManager#loadEnum into the constant's value.
Permission | Notes |
|---|---|
| Wildcard — |
| Entity/world interaction grants — each maps to one |
| Block place/break. |
| Brushing suspicious sand/gravel. |
| Dropping/picking up items on the island. |
| Access to the island chest. |
| Toggling flight outside creative/spectator. |
| Teleporting via ender pearl / chorus fruit consumption. |
| Launching wind charge projectiles. |
| Breaking a |
| Breaking a block matched by |
| Home/warp management. |
| Island bank access. |
| Ranking up the island. |
| Viewing island ratings — the only permission the |
| Sending member invitations ( |
| Granting/revoking a co-op trust ( |
| Removing a member / expelling a visitor. |
| Banning a player from the island (gates the |
| Role-ladder stepping ( |
| Assigning a member's role (gates the |
| Toggling a role's permissions — required by both |
| Toggling island settings — required by both |
| Island lock state and bypassing it while closed. |
| Bypassing being expelled. |
| Renaming the island. |
| Changing the island's biome. |
| Disbanding the island. |
Enforcement
Island#hasPermission(Player, IslandPermission) is the single check every command, action, and listener goes through:
The island owner and anyone with the
skyblock.adminBukkit permission always pass.If the player is a member, the check is
member.isOwner() || member.role().hasPermission(permission).Otherwise, if the player has an active co-op grant, the check falls back to the island's single
COOP-type role's permissions (co-ops don't hold an individual role — they all share whatever the island's oneCOOProle grants).Anyone else (a bare visitor) has no permissions at all through this path.
IslandRole#hasPermission itself checks the role's own ALL /specific grant, folding in any pending (un-flushed) toggle from the permissions menu.
On island servers only, IslandPermissionsListener calls hasPermission on the relevant Bukkit event and cancels it when the check fails — e.g. BlockBreakEvent against BREAK/SPAWNER_BREAK/VALUABLE_BREAK depending on the block, BlockPlaceEvent against BUILD, PlayerToggleFlightEvent against FLY, EntityMountEvent against ENTITY_RIDE/MINECART_ENTER, and so on for every listener method in the class. IslandSettingsListener (also island-server-only) uses Island#isSettingEnabled the same way for IslandSettings. Both listeners register only when SkyblockConfiguration#isIslandServer() is true — see Overview.
IslandSettings
IslandSettings is the environment-flag counterpart to permissions — per-island, not per-role. Like IslandPermission, it implements ConfigurationEnum<ItemStackWrapper>; settings.yml supplies the display item per constant (ALWAYS_DAY → always-day), loaded the same way via loadEnum.
Setting | Effect |
|---|---|
| Locks world time to |
| Locks world time to |
| Locks world time to |
| Locks world time to |
| Forces storm on, disables the weather-cycle gamerule; wins over |
| Forces storm/thunder off, disables the weather-cycle gamerule. |
| Allows creeper explosions to damage blocks. |
| Allows crops ( |
| Allows chickens to lay eggs. |
| Allows endermen to pick up/place blocks. |
| Allows fire to spread or ignite via |
| Allows ghast fireball explosions to damage blocks. |
| Allows lava to flow ( |
| Allows player-vs-player damage. |
| Allows TNT/TNT minecart explosions to damage blocks. |
| Allows saplings to grow into trees ( |
| Allows water to flow ( |
| Allows wither/wither skull explosions to damage blocks. |
Conflict groups
IslandSettings#conflictingSettings() defines two mutually-exclusive groups — only one member of each can be enabled on an island at a time:
Time locks:
ALWAYS_DAY,ALWAYS_MIDDLE_DAY,ALWAYS_NIGHT,ALWAYS_MIDDLE_NIGHTWeather locks:
ALWAYS_RAIN,ALWAYS_SHINY
Island#toggleSetting enforces this client-side of persistence: enabling a setting that has a conflicting group member currently on stages that conflicting member off in the same dirtySettings flush. Settings outside these two groups (PVP, CROPS_GROWTH, etc.) have no conflicts and toggle independently.
Applying environment settings
Because time/weather locks are world state rather than cancellable events, IslandSettingsListener handles them differently from the rest of the catalogue:
IslandSettingsListener.applyEnvironment(Island, World)is a static method that reads the active time/weather locks and callsWorld#setTime/setGameRule(DO_DAYLIGHT_CYCLE, …)/setStorm/setThundering/setGameRule(DO_WEATHER_CYCLE, …)directly. It runs on world load and again every time settings are flushed (from[toggle-island-setting]and[update-island-settings]).onTimeSkip/onWeatherChange/onThunderChangecancel any event that would fight an active lock in the interim (e.g. aTimeSkipEventwhile any time lock is set, or Minecraft's natural weather engine trying to clear rain whileALWAYS_RAINis on).Every other setting (
PVP,CREEPER_EXPLOSION,CROPS_GROWTH, …) is enforced purely by cancelling the relevant Bukkit event whenIsland#isSettingEnabledisfalse— no gamerule or world-state mutation.
Default settings on new islands
config.yml's default-settings list is applied to every setting at island creation — IslandRepository#create inserts each IslandSettings constant with its enabled state taken from whether it appears in SkyblockConfiguration#defaultSettings(). The shipped default enables CROPS_GROWTH, EGG_LAY, ENDERMAN_GRIEF, FIRE_SPREAD, GHAST_FIREBALL, LAVA_FLOW, PVP, TNT_EXPLOSION, TREE_GROWTH, WATER_FLOW, and WITHER_EXPLOSION — every setting except the six time/weather locks. See Configuration for the full config.yml reference.
Menu actions for governance
Four AstralSkyblock actions back the roles/permissions/settings menus (island-roles, island-permissions, island-settings) — all four are player-only and message the executor with ASMessages.NO_PERMISSION and return without effect when the underlying permission check fails.
toggle-role-permission
Flips one IslandPermission on one role, staging the change in the role's dirty-permission map (not yet persisted). Requires the executor to have SET_PERMISSION on the island and to outrank the target role.
Argument | Type | Description |
|---|---|---|
(1) |
| The island the role belongs to. |
(2) |
| The role being edited. |
(3) |
| The permission being toggled. |
update-role-permissions
Flushes a role's staged permission toggles to the database via RoleService#updatePermissions, re-checking SET_PERMISSION and the role-weight guard before writing. Sends ROLE_PERMISSION_UPDATE_SUCCESS/ROLE_PERMISSION_UPDATE_FAILURE to the executor. Wired as a close-actions hook on the island-permissions menu, so it fires once when the player backs out or closes the menu rather than on every individual toggle.
Argument | Type | Description |
|---|---|---|
(1) |
| The island the role belongs to. |
(2) |
| The role whose staged toggles are flushed. |
toggle-island-setting
Flips one IslandSettings flag, staging it in the island's dirty-settings map and immediately re-applying the environment (time/weather gamerules and state) if the island's world is loaded on the current server. Requires SET_SETTINGS.
Argument | Type | Description |
|---|---|---|
(1) |
| The island being edited. |
(2) |
| The setting being toggled. |
update-island-settings
Flushes an island's staged setting toggles via IslandService#updateSettings, re-checking SET_SETTINGS before writing and re-applying the environment once persistence succeeds. Sends SETTINGS_UPDATE_SUCCESS/SETTINGS_UPDATE_FAILURE. Wired as a close-actions hook on island-settings.
Argument | Type | Description |
|---|---|---|
(1) |
| The island whose staged toggles are flushed. |
Placeholders
Both catalogues expose a chainable, per-item placeholder namespace reached by iterating an ItemProvider:
Placeholder | Returns | Notes |
|---|---|---|
| Iterable of all 52 | Wrapped in an |
| The permission's enum name, e.g. | Resolved by |
| The | — |
| Whether the role it was iterated from currently has this permission |
|
| Iterable of all 18 | Wrapped in an |
| The setting's enum name, e.g. | Resolved by |
| The | — |
| Whether the island currently has this setting on |
|
Island also exposes %island_hasPermission_<PERMISSION>% directly (no role/iteration needed) — this is what menu view-requirements use to hide governance items the viewing player can't use, e.g. %skyblock_player_island_hasPermission_BAN_MEMBER%. See Placeholders for the full %skyblock_*% root and every other namespace.
See also
Islands — island lifecycle, blueprints, and upgrades.
Members, Co-ops & Invitations — promote/demote, kick/ban, and invitation flows that consume role weight and
IslandPermissionchecks.Configuration —
config.yml'sdefault-settings, and the rest of the shipped configuration surface.Placeholders — the full placeholder catalogue.