> For the complete documentation index, see [llms.txt](https://mango-5m.gitbook.io/mango5m-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mango-5m.gitbook.io/mango5m-docs/resources/mango-prison/developer-guide/events-and-statebags.md).

# Events & Statebags

Public events, broadcast events you can listen to, and replicated state.

## Public server events

Registered with `AddEventHandler` **only** — call them from server scripts; modified clients cannot trigger them over the network. Every event also answers to the `mango_corrections:*` prefix.

```lua
TriggerEvent('mango_prison:jailPlayer', target, minutes, opts)
TriggerEvent('mango_prison:releasePlayer', target, reason)
TriggerEvent('mango_prison:addSentence', target, minutes, reason)
TriggerEvent('mango_prison:reduceSentence', target, minutes, reason)
TriggerEvent('mango_prison:storeInventory', src)
TriggerEvent('mango_prison:returnInventory', src)
TriggerEvent('mango_prison:startLockdown', scope)
TriggerEvent('mango_prison:endLockdown', scope)
TriggerEvent('mango_prison:setRiot', true)               -- seals every cell gate
TriggerEvent('mango_prison:setCellLocked', '7-3', false) -- one gate
TriggerEvent('mango_prison:announce', { text = '...', sound = 'chime' })
TriggerEvent('mango_prison:startHeadcount')
TriggerEvent('mango_prison:startVisitation', visitorSrc, inmateIdentifier)
```

## Broadcast events (listen from any server script)

```lua
AddEventHandler('mango_prison:playerJailed',    function(src, data) end)
AddEventHandler('mango_prison:playerReleased',  function(src, data) end)
AddEventHandler('mango_prison:playerEscaped',   function(src, data) end)
AddEventHandler('mango_prison:lockdownChanged', function(scope, active) end)
AddEventHandler('mango_prison:riotChanged',     function(active) end)
AddEventHandler('mango_prison:writeupIssued',   function(identifier, data) end)
```

## Statebags

The replicated player state lets any resource check prison status **without an event round-trip** — targets, HUDs, phones:

```lua
-- server or client:
local ps = Player(serverId).state.mango_prison
-- nil when free, else:
-- { number = 214, cell = 'A3', status = 'active', behaviour = 62, trusty = false }
```

Global lockdown and riot state:

```lua
local lockdowns = GlobalState.mango_prison_lockdowns   -- { ['prison'] = { by, at }, ... }
local rioting   = GlobalState.mango_prison_riot        -- boolean
```

{% hint style="info" %}
This is exactly how the built-in guard "Search Prisoner" target works — it shows only on peds whose statebag says they are an inmate.
{% endhint %}
