Sentinel Enforcer
Sentinel Enforcer Server-side event reporter for DayZ - real-time, structured, HMAC-authenticated events into the dayz.fyi platform. A server-admin mod: players see no new content. What you get Live event feed - sessions, combat, chat, item pickups, vehicles, building and raid events, locks - structured and queryable on dayz.fyi within seconds, across all your servers. Server health - frame time, freezes and… (more)
Sentinel Enforcer Server-side event reporter for DayZ - real-time, structured, HMAC-authenticated events into the dayz.fyi platform. A server-admin mod: players see no new content. What you get Live event feed - sessions, combat, chat, item pickups, vehicles, building and raid events, locks - structured and queryable on dayz.fyi within seconds, across all your servers. Server health - frame time, freezes and restart-cycle trends on every 30-second heartbeat, so you can see when your server stutters and how hard. Optional anti-cheat signals - observe-only inputs to the dashboard's review tools. Raw observations only; you decide. Methods and thresholds are deliberately not documented publicly. Take-action (opt-in) - kick or message a player from the dashboard over the mod's own connection; no RCON credentials needed. Add-ons for DayZ-Expansion (Market / Groups / Hardline / Quests), VPPAdminTools, CodeLock and BreachingCharge - separate Workshop items; subscribe only to what your server runs. Install (server admin) Add the server on dayz.fyi first. Sign in at dayz.fyi, open your community page (first time? create your community from the dashboard - one click), click Add server, name it. You get a bootstrap token (sntl_v1. followed by a long string) and a ready-to-paste config.json snippet. Install the mod. Subscribe, copy @SentinelEnforcer/ into your server root, drop keys/sentinel_enforcer.bikey into keys/. Paste the token. Save the snippet as <profile>/SentinelEnforcer/config.json. That one line is the whole setup: it tells the mod which server on your community it reports for, and it is what signs the upload. Every other setting has a default. {"BootstrapToken": "sntl_v1.YOUR-TOKEN-HERE"} Launch with -serverMod=@SentinelEnforcer. The server comes up already linked - your setup page on dayz.fyi flips to Connected on the first heartbeat. (Add -doLogs -adminLog if you also want DayZ's own admin log files - not required.) Already booted the mod before adding the server on the site? Then use the claim-code fallback: the mod registered itself and wrote a one-time claim code to <profile>/SentinelEnforcer/claim.txt (it is in the server log too) - paste that code at dayz.fyi/claim to attach the server to your community. Full walkthrough: dayz.fyi/docs/getting-started Tip: set steamQueryPort in serverDZ.cfg so the dashboard auto-fills your server name and map. What it costs your server The mod measures its own footprint on every server - the numbers are on your dashboard, not taken on faith. On a 100-player server running the previous release, that self-report was 1.6% of the main thread with the standard capture set and up to 5.3% with item-movement capture on, nearly all of it the signed upload pipeline, with a 10-12 ms burst once per batch at full population. 0.26.0 is the performance release that addresses exactly that: events are serialized as they arrive instead of a hundred at a time, batches are capped at 16 KB, the queue drains without touching every entry, the signing cost per byte no longer grows with batch size, and the signed lane carries four times the throughput. Per-frame work outside uploads is about 0.02% of a frame. The event queue is bounded (10,000); the previous release dropped no events in seven days of fleet telemetry at full population. Transparency and control Every engine hook the mod owns is disclosed at every boot in your script log ( chain-link lines: what it is for, what it cannot do, how to switch it off) and in the full description linked below. Every override calls the original engine code - a build check enforces it. Owner kill switches in config.json turn any hook family into a pure pass-through without uninstalling. Server-side only. Sends the same identifiers vanilla admin logs already expose (Steam ID / DayZ ID); no client-side data; item types only, never inventories. Pure Enforce Script - Windows and Linux servers identically, no DLL. Validated against every DayZ update (badge on dayz.fyi). Hooks the eight vanilla vehicle classes for a count-only health metric; a game update that changes those classes can need a hotfix. Full description, hook list, privacy details dayz.fyi/docs/sentinel-enforcer Support dayz.fyi platform: dayz.fyi Discord: link in the dayz.fyi footer - bug reports and integration questions go here
No file I/O on hot paths, no timers created per event, no per-player-per-frame hooks.
Every server-visible override preserves its chain.
0.0308% of each server frame at 100 players (0.308 ms/s). Counts hook dispatch and timers only, not what the hooks do inside. Methodology.
Structural load of the 328 scripted mods analyzed, lightest on the left. This mod's bar is lit; 25 others share it. Ranked list.
Every-frame hooks carry 97% of this mod's structural load. 0.308 ms/s in all.
12 hooks · 0.3 ms/s
7 hooks · 0.01 ms/s
13 hooks · 0.000026 ms/s
| Every-frame hooksrun every server frame | 12 hooks | 0.3 ms/s | 97% | AnimalBase.CommandHandler, CarScript.EOnPostSimulate, CivilianSedan.EOnPostSimulate and 9 more |
| Event hooksrun when something happens: an inventory move, a hit, an action | 7 hooks | 0.01 ms/s | 3.4% | ItemBase.EEItemLocationChanged, PlayerBase.EEItemAttached, PlayerBase.EEItemDetached and 4 more |
| Lifecycle hooksrun when an entity is created, loaded or deleted | 13 hooks | 0.000026 ms/s | <0.1% | BaseBuildingBase.EEDelete, BaseBuildingBase.EEInit, BaseBuildingBase.EEKilled and 10 more |
Counts how often each hook is dispatched and how many timers stay alive, not what the code inside does. Some rates are order-of-magnitude estimates; the methodology lists which.
Where this mod runs often
Hooks on per-frame and high-rate surfaces, with what their bodies call. Body work, not the hook itself, is what costs frame time.
Other findings
super() only on some paths · 1 · warning
- WeaponManager.StartPendingAction calls super.StartPendingAction() only on some paths — on the others the chain below this mod is dropped.
sentinel_enforcer.pbo::scripts\4_World\capture\WeaponActionHook.c:837
- WeaponManager.StartPendingAction calls super.StartPendingAction() only on some paths — on the others the chain below this mod is dropped.
Which vanilla methods the mod hooks, which of them drop the chain, how often each hook fires, and which risky calls sit inside hot hooks.
How long hook bodies take, network cost, or engine-side load. Measured across live fleets, most server lag comes from the engine and world state, not mod script chains — a light footprint does not clear a mod of lag, and a heavy one does not convict it. Methodology.
Everything else
All 52 overrides
Surface is the dispatch tier the rubric can price (— = unpriced); server is whether the override exists on a dedicated server; super() shows whether the vanilla chain is preserved on a server.
| method | surface | server | super() | where |
|---|---|---|---|---|
ActionTakeItem.OnEndServer |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\PickupHook.c:42 |
ActionTakeItemToHands.OnEndServer |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\PickupHook.c:51 |
AnimalBase.CommandHandler |
T1 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\ActivationHook.c:108 |
BaseBuildingBase.OnPartBuiltServer |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\BuildingHook.c:20 |
BaseBuildingBase.OnPartDismantledServer |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\BuildingHook.c:31 |
BaseBuildingBase.EEHitBy |
T2 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\BuildingHook.c:47 |
BaseBuildingBase.EEKilled |
T3 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\BuildingHook.c:58 |
BaseBuildingBase.EEInit |
T3 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\BuildingHook.c:67 |
BaseBuildingBase.EEDelete |
T3 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\BuildingHook.c:73 |
CarScript.EEKilled |
T3 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\VehicleHook.c:45 |
CarScript.EEDelete |
T3 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\VehicleHook.c:54 |
CarScript.EOnPostSimulate |
T1 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\VehicleHook.c:83 |
CivilianSedan.EOnPostSimulate |
T1 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\VehicleHook.c:102 |
CombinationLock.LockServer |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\CodeLockHook.c:21 |
CombinationLock.UnlockServer |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\CodeLockHook.c:27 |
FirearmActionDetachMagazine.ActionConditionContinue |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\MagazineHook.c:24 |
HandEventBase.ReadFromContext |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\3_Game\SentinelInvCommandHook.c:55 |
HandEventBase.CheckRequestEx |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\3_Game\SentinelInvCommandHook.c:65 |
Hatchback_02.EOnPostSimulate |
T1 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\VehicleHook.c:111 |
ItemBase.CanPutInCargo |
T2 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\ItemLocationHook.c:220 |
ItemBase.OnCEUpdate |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\ItemLocationHook.c:235 |
ItemBase.EEItemLocationChanged |
T2 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\ItemLocationHook.c:241 |
MissionServer.OnInit |
T3 | yes | ✓ | sentinel_enforcer.pbo::scripts\5_Mission\SentinelMissionInit.c:16 |
MissionServer.OnEvent |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\5_Mission\SentinelMissionInit.c:145 |
MissionServer.OnClientRespawnEvent |
T3 | yes | ✓ | sentinel_enforcer.pbo::scripts\5_Mission\SentinelMissionInit.c:217 |
MissionServer.OnClientNewEvent |
T3 | yes | ✓ | sentinel_enforcer.pbo::scripts\5_Mission\SentinelMissionInit.c:229 |
MissionServer.OnClientReadyEvent |
T3 | yes | ✓ | sentinel_enforcer.pbo::scripts\5_Mission\SentinelMissionInit.c:246 |
MissionServer.OnClientDisconnectedEvent |
T3 | yes | ✓ | sentinel_enforcer.pbo::scripts\5_Mission\SentinelMissionInit.c:273 |
MissionServer.OnMissionFinish |
T3 | yes | ✓ | sentinel_enforcer.pbo::scripts\5_Mission\SentinelMissionInit.c:288 |
MissionServer.OnUpdate |
T0 | yes | ✓ | sentinel_enforcer.pbo::scripts\5_Mission\SentinelMissionInit.c:307 |
Offroad_02.EOnPostSimulate |
T1 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\VehicleHook.c:129 |
OffroadHatchback.EOnPostSimulate |
T1 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\VehicleHook.c:120 |
PlayerBase.OnConnect |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\KillHook.c:142 |
PlayerBase.OnDisconnect |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\KillHook.c:189 |
PlayerBase.EEHitBy |
T2 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\KillHook.c:334 |
PlayerBase.EEKilled |
T3 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\KillHook.c:611 |
PlayerBase.OnVehicleSeatDriverEnter |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\KillHook.c:763 |
PlayerBase.OnVehicleSeatDriverLeft |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\KillHook.c:769 |
PlayerBase.EEItemAttached |
T2 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\KillHook.c:792 |
PlayerBase.EEItemDetached |
T2 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\KillHook.c:799 |
PlayerBase.OnRPC |
T2 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\KillHook.c:810 |
PlayerBase.OnInputUserDataProcess |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\KillHook.c:838 |
PluginAdminLog.LogPrint |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\AdminLogHook.c:40 |
Sedan_02.EOnPostSimulate |
T1 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\VehicleHook.c:138 |
TerritoryFlag.OnPartBuiltServer |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\FlagHook.c:30 |
TerritoryFlag.EEKilled |
T3 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\FlagHook.c:42 |
Truck_01_Base.EOnPostSimulate |
T1 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\VehicleHook.c:147 |
Truck_02.EOnPostSimulate |
T1 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\VehicleHook.c:156 |
Van_01.EOnPostSimulate |
T1 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\VehicleHook.c:165 |
Weapon_Base.EEFired |
— | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\FireHook.c:29 |
WeaponManager.StartPendingAction |
— | yes | conditional | sentinel_enforcer.pbo::scripts\4_World\capture\WeaponActionHook.c:837 |
ZombieBase.CommandHandler |
T1 | yes | ✓ | sentinel_enforcer.pbo::scripts\4_World\capture\ActivationHook.c:56 |
Dispatch surfaces and timers the grade prices
| surface | tier | rate (Hz) | rate source | ms/s |
|---|---|---|---|---|
ZombieBase.CommandHandler | T1 | 1000.0 | placeholder | 0.0248 |
AnimalBase.CommandHandler | T1 | 1000.0 | placeholder | 0.0248 |
CarScript.EOnPostSimulate | T1 | 1000.0 | placeholder | 0.0248 |
CivilianSedan.EOnPostSimulate | T1 | 1000.0 | placeholder | 0.0248 |
Hatchback_02.EOnPostSimulate | T1 | 1000.0 | placeholder | 0.0248 |
OffroadHatchback.EOnPostSimulate | T1 | 1000.0 | placeholder | 0.0248 |
Offroad_02.EOnPostSimulate | T1 | 1000.0 | placeholder | 0.0248 |
Sedan_02.EOnPostSimulate | T1 | 1000.0 | placeholder | 0.0248 |
Truck_01_Base.EOnPostSimulate | T1 | 1000.0 | placeholder | 0.0248 |
Truck_02.EOnPostSimulate | T1 | 1000.0 | placeholder | 0.0248 |
Van_01.EOnPostSimulate | T1 | 1000.0 | placeholder | 0.0248 |
MissionServer.OnUpdate | T0 | 1000.0 | measured | 0.0248 |
ItemBase.EEItemLocationChanged | T2 | 130.0 | measured | 0.0032 |
PlayerBase.EEItemAttached | T2 | 130.0 | measured | 0.0032 |
PlayerBase.EEItemDetached | T2 | 130.0 | measured | 0.0032 |
BaseBuildingBase.EEHitBy | T2 | 8.0 | placeholder | 0.0002 |
ItemBase.CanPutInCargo | T2 | 8.0 | placeholder | 0.0002 |
PlayerBase.EEHitBy | T2 | 8.0 | placeholder | 0.0002 |
PlayerBase.OnRPC | T2 | 8.0 | placeholder | 0.0002 |
BaseBuildingBase.EEKilled | T3 | 0.1 | placeholder | 0.0000 |
BaseBuildingBase.EEInit | T3 | 0.1 | placeholder | 0.0000 |
BaseBuildingBase.EEDelete | T3 | 0.1 | placeholder | 0.0000 |
TerritoryFlag.EEKilled | T3 | 0.1 | placeholder | 0.0000 |
PlayerBase.EEKilled | T3 | 0.1 | placeholder | 0.0000 |
CarScript.EEKilled | T3 | 0.1 | placeholder | 0.0000 |
CarScript.EEDelete | T3 | 0.1 | placeholder | 0.0000 |
MissionServer.OnInit | T3 | 0.1 | placeholder | 0.0000 |
MissionServer.OnClientRespawnEvent | T3 | 0.1 | placeholder | 0.0000 |
MissionServer.OnClientNewEvent | T3 | 0.1 | placeholder | 0.0000 |
MissionServer.OnClientReadyEvent | T3 | 0.1 | placeholder | 0.0000 |
MissionServer.OnClientDisconnectedEvent | T3 | 0.1 | placeholder | 0.0000 |
MissionServer.OnMissionFinish | T3 | 0.1 | placeholder | 0.0000 |
Includes 0.274 ms/s from placeholder-rated surfaces.
Load-order constraints (CfgPatches)
What each PBO declares: its addon identity and the addons it requires to be loaded first (requiredAddons). A partial load-order signal from the mod's own metadata.
sentinel_enforcer.pbo
SentinelEnforcerrequiredVersion 0.1 — no requiredAddons
census 1.1 · findings 1.1 · hash 00e6265b9f8d28eb