> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apex-services.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Aduty hooks

> Every hook exposed by apex-aduty/hooks.lua.

Source: `apex-aduty/hooks.lua` (unencrypted).

<AccordionGroup>
  <Accordion title="Hooks.OnAdutyStateChanged(isNowActive)" icon="user-shield">
    **Side:** client. Fires when aduty is entered or left. Default no-op — wire up HUD changes, sounds, etc.

    ```lua theme={null}
    function Hooks.OnAdutyStateChanged(isNowActive)
        TriggerEvent('your-hud:setStaffMode', isNowActive)
    end
    ```
  </Accordion>

  <Accordion title="Hooks.OnNoclipStateChanged(isNowActive)" icon="ghost">
    **Side:** client. Fires when noclip is toggled. Default no-op.
  </Accordion>

  <Accordion title="Hooks.OnInvisibleStateChanged(isNowInvisible)" icon="eye-slash">
    **Side:** client. Fires on invisibility toggle. Default no-op.
  </Accordion>

  <Accordion title="Hooks.OnClientNotify(type, message)" icon="bell">
    **Side:** client. Default uses `ESX.ShowNotification` and falls back to `lib.notify`.
  </Accordion>

  <Accordion title="Hooks.BanPlayer(source, reason, isAutomatic)" icon="ban">
    **Side:** server. Default `DropPlayer(source, reason)`. Override to integrate with your anti-cheat.

    ```lua theme={null}
    function Hooks.BanPlayer(source, reason, isAutomatic)
        exports['my-anticheat']:banPlayer(source, reason, isAutomatic)
    end
    ```
  </Accordion>

  <Accordion title="Hooks.OnAuditLog(source, category, message, subcategory)" icon="file-lines">
    **Side:** server. Default `lib.logger`. Wire to Discord / your audit pipeline.
  </Accordion>

  <Accordion title="Hooks.OnServerNotify(targetSource, type, message)" icon="bell">
    **Side:** server. Default `TriggerClientEvent('esx:showNotification', targetSource, message)`.
  </Accordion>
</AccordionGroup>
