One document per feature, written for plugin developers building on the library. Each doc covers what the feature does, why it exists, how to use it, and the rules you must follow. For the end-to-end plugin skeleton and setup, start with the Developer Guide.
Both assemblies target .NET Framework 4.8, x64, against RagePluginHook 1.124+ and LSPDFR 0.4.9+.
Burnsie.Common.dll (needs RPH only)| Doc | Types | What it gives you |
|---|---|---|
| Logging | Log | Prefixed, leveled logging to RagePluginHook.log plus an optional diagnostics file sink |
| Configuration | ConfigSchema, IniFile | Declarative INI schema: one table drives values, the default file, and generated docs |
| Threading & fibers | FiberRegistry, CancellationFlag, OffThread | Exception-fenced fiber loops, cooperative cancellation, background threads for blocking IO |
| Notifications & text | Notifier, Palette, Captions | Rate-limited toast queue, persistent live-status HUD line, color conventions, subtitles |
| Audio | WavPlayer, FrontendSounds | Preloaded async WAV playback (RPH has no sound API) and fail-soft frontend cues |
| Entities & blips | EntityBag, Blips | Lifetime-scoped entity/blip ownership with one-call cleanup; standard-color blip factory |
| Keybinds | Keybind | Keyboard/controller chords with correct modifier semantics and input suppression |
| Safe natives | SafeNatives, CrowdNatives | Pinned-hash native calls behind a self-disabling fence — a bad native never crashes the plugin |
| World & positions | Positions | Street names, water checks, road-reachability heuristic for dispatch decisions |
| Diagnostics & updates | DependencyReport, UpdateChecker, LcpdfrVersionChecker, LibraryInfo | Install validation with correct version semantics; daily update checks; library identity |
Burnsie.Common.Lspdfr.dll (needs RPH + LSPDFR)| Doc | Types | What it gives you |
|---|---|---|
| Duty state | DutyStateService | Cached on-duty state (LSPDFR has no duty query API) with idempotent attach/detach |
| Scanner audio | ScannerAudio | Crash-proof police scanner playback: per-install token validation and a busy-gated queue |
| Backup dispatcher | BackupDispatcher, Wave, UnitOrder, TrackedUnit, DispatchOptions | Wave-based backup with honest unit tracking, arrival detection and incident-scoped cancellation |
| Callout base class | BurnsieCallout | Hardened LSPDFR callout lifecycle: automatic teardown, route blips, leash, death guard |
| Timer bars | TimerBarHud, ITextTimerBar, IProgressTimerBar | HUD timer bars over LSPDFR's undocumented engine UI, self-disabling on failure |
| LSPDFR helpers | ZoneInfo, Officers, Pursuits, RadioAnimation, LspdfrRuntime | Zone names, officer personas, pursuit-safe helpers, radio animation, plugin coexistence checks |
| Crowd engine | Crowd, CrowdSpawner, HostilityMeter, FactionManager, EscalationLadder, RoadClosure, CrowdArsenal, CrowdEngineOptions | Civil-disorder scenes: budget-disciplined crowds, faction combat, escalation waves, road closures |
These are the library-wide invariants every doc assumes. Violating them produces the classic plugin bugs.
GameFiber, never a CLR thread.GameFiber.Sleep for pacing (real time);
GameFiber.Wait is scaled by Game.TimeScale and is only for deliberate slow-motion
stretching..Exists() after any yield. Handles die at any time.Game.TickCount or DateTime.UtcNow, never Game.GameTime (time
dilation stretches it).OffThread.Run) — a fiber that blocks on disk or
network stalls the game.System.Version, never floats (as floats, 1.124 < 1.98).