Skip to content

PermissionCheckEvent

Fired whenever any permission system evaluates a permission node. This event cannot be canceled.

The permission of a dynamic command is its id, so a spell can decide who may use the command.

On Fabric it fires for every check that goes through the Fabric Permissions API, also those of other mods. On NeoForge (WizardsOfLua.loader is "neoforge") it fires only for the checks of Wizards of Lua itself: its commands and the dynamic commands.

Intercept phase — before default logic: Handlers here may override the outcome by assigning allowed:

  • true : grant permission and stop further propagation

  • false : deny permission and stop further propagation

  • nil : continue with default logic (default)

Setting allowed to true or false acts as an implicit short-circuit: no further interceptors or default permission logic will run for this check. Only nil allows propagation to continue.

Assigning allowed outside of an intercept callback (e.g. in collectors) is ignored.

Example: Let players wearing golden helmets bypass examplemod.someaction.*

local PREFIX = "examplemod.someaction."

spell:intercept("PermissionCheckEvent", function(evt)
  ---@cast evt PermissionCheckEvent
  if evt.permission:find(PREFIX, 1, true)
      and instanceOf(Player, evt.entity)
  then
    local player = evt.entity --[[@as Player]]
    local helmet = player:getEquipment("head")
    -- grant this permission if wearing a golden helmet;
    -- either way, setting allowed stops further propagation
    if helmet and helmet.type.id == "golden_helmet" then
      evt.allowed = true
    else
      evt.allowed = false
    end
  end
end)

-- Keep the spell alive so the interceptor stays active
while true do sleep(20) end

Fields

allowed: boolean? — Read/Write

Optional. Intercept only: set to true to grant, false to deny, or nil to defer to default logic. Any non-nil value stops propagation immediately; assigning allowed in collectors has no effect.

entity: Entity? — Read-Only

A reference to the entity whose permissions are being checked, or nil if not applicable.

name: string — Read-Only

The event's name.

permission: string — Read-Only

The permission node being checked.

spell: Spell? — Read-Only

A reference to the spell that triggered this check, or nil if not linked to a spell.

world: World? — Read-Only

A reference to the world where the check occurs, or nil if unavailable.