extension

module
v5.0.0-alpha.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 14, 2026 License: MIT

README

OCAP Recorder (Go)

Coverage

About

A Go implementation of an ArmA 3 native extension that records gameplay to PostgreSQL (with SQLite fallback). Captures unit positions, combat events, markers, and more for mission replay and analytics.

Architecture

Overview
ArmA 3 Game
    ↓ callExtension("ocap_recorder", [":COMMAND:", args])
RVExtensionArgs() [CGo boundary]
    ↓
Dispatcher.Dispatch(Event)
    ↓
    ├─ [Buffered] → Channel → Goroutine → Handler
    └─ [Sync]     → Handler directly
           ↓
Handler (parse args, validate, create model)
    ↓
    ├─ Storage Backend (if configured)
    └─ Queue (traditional) → batch insert every 2s
           ↓
DB Writer Loop
    ↓
PostgreSQL / SQLite
DLL Entry Points

The extension exposes CGo-exported functions that ArmA 3 calls:

Function Purpose
RVExtensionArgs() Main entry point; receives command and arguments
RVExtension() Legacy simple command handler
RVExtensionVersion() Returns version string
Event Dispatcher

The dispatcher routes commands to handlers with optional buffering:

  • Sync handlers: Execute immediately (entity creation)
  • Buffered handlers: Queue events in channels for async processing (high-volume state updates)
  • Metrics: OpenTelemetry integration for queue sizes, events processed/dropped
Project Structure
cmd/ocap_recorder/main.go    Entry point, initialization, lifecycle commands
pkg/a3interface/             CGo exports (RVExtension*)
internal/
├── dispatcher/              Event routing with async buffering
├── worker/                  Handler registration and DB writer loop
├── handlers/                Business logic for parsing and validation
├── queue/                   Thread-safe queues for batch writes
├── cache/                   Entity lookup caching (ObjectID → model)
├── model/                   GORM database models
├── storage/                 Optional alternative storage backend
└── geo/                     Coordinate/geometry utilities
Design Principles
  1. Low latency: Async buffered handlers don't block ArmA's game loop
  2. High throughput: Batch writes every 2 seconds instead of per-event
  3. Entity caching: Sync entity creation → cache → async state updates use cached FK
  4. Graceful fallback: PostgreSQL → SQLite if connection fails
  5. Observability: OpenTelemetry metrics and structured logging (slog)

Building

Requires Docker with Linux containers.

Windows DLL
docker pull x1unix/go-mingw:1.24

docker run --rm -v ${PWD}:/go/work -w /go/work x1unix/go-mingw:1.24 \
  go build -buildvcs=false -o dist/ocap_recorder_x64.dll -buildmode=c-shared ./cmd/ocap_recorder
Linux .so
docker run --rm -v ${PWD}:/go/work -w /go/work golang:1.24-bullseye \
  go build -buildvcs=false -o dist/ocap_recorder_x64.so -buildmode=c-shared ./cmd/ocap_recorder

Uses Debian Bullseye (glibc 2.31) for broad compatibility with Linux game servers.

Configuration

Copy ocap_recorder.cfg.json.example to ocap_recorder.cfg.json alongside the DLL and edit as needed.

Supported Commands

Entity Commands
Command Buffer Purpose
:NEW:SOLDIER: Sync Register new unit
:NEW:VEHICLE: Sync Register new vehicle
:NEW:SOLDIER:STATE: 10,000 Update unit position/state
:NEW:VEHICLE:STATE: 10,000 Update vehicle position/state
Combat Commands
Command Buffer Purpose
:FIRED: 10,000 Weapon fire event
:PROJECTILE: 5,000 Projectile tracking
:HIT: 2,000 Damage event
:KILL: 2,000 Kill event
General Commands
Command Buffer Purpose
:EVENT: 1,000 General gameplay event
:CHAT: 1,000 Chat message
:RADIO: 1,000 Radio transmission
:FPS: 1,000 Server FPS sample
Marker Commands
Command Buffer Purpose
:MARKER:CREATE: 500 Create map marker
:MARKER:MOVE: 1,000 Update marker position
:MARKER:DELETE: 500 Delete marker
ACE3 Integration
Command Buffer Purpose
:ACE3:DEATH: 1,000 ACE3 death event
:ACE3:UNCONSCIOUS: 1,000 ACE3 unconscious event
Lifecycle Commands
Command Purpose
:INIT: Initialize extension
:INIT:DB: Connect to database
:NEW:MISSION: Start recording mission
:SAVE: End recording, flush data
:VERSION: Get extension version

Directories

Path Synopsis
cmd
ocap_recorder command
internal
api
internal/api/client.go
internal/api/client.go
geo
model/convert
Package convert provides functions to convert GORM models to core models
Package convert provides functions to convert GORM models to core models
model/core
internal/model/core/events.go
internal/model/core/events.go
storage
internal/storage/storage.go
internal/storage/storage.go
storage/memory
internal/storage/memory/export.go
internal/storage/memory/export.go
storage/memory/export/v1
Package v1 contains the v1 export format for OCAP2 mission data.
Package v1 contains the v1 export format for OCAP2 mission data.
util
Package util provides common utility functions used across the OCAP recorder.
Package util provides common utility functions used across the OCAP recorder.
pkg

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL