parser

package
v5.0.0-alpha.5 Latest Latest
Warning

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

Go to latest
Published: Feb 23, 2026 License: MIT Imports: 9 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ChatChannels = map[int]string{
	0:  "Global",
	1:  "Side",
	2:  "Command",
	3:  "Group",
	4:  "Vehicle",
	5:  "Direct",
	16: "System",
}

ChatChannels maps ArmA 3 channel numbers to human-readable names.

Functions

This section is empty.

Types

type HitPart

type HitPart struct {
	EntityID      uint16
	ComponentsHit []string
	CaptureFrame  core.Frame
	Position      core.Position3D
}

HitPart represents a single hit from a projectile as parsed from ArmA data. EntityID is a raw ArmA object ID that the worker classifies as soldier or vehicle.

type KillEvent

type KillEvent struct {
	Time           time.Time
	CaptureFrame   core.Frame
	VictimID       uint16
	KillerID       uint16
	WeaponVehicle  string
	WeaponName     string
	WeaponMagazine string
	EventText      string
	Distance       float32
}

KillEvent represents a kill event as parsed from ArmA data. VictimID and KillerID are raw ArmA object IDs that the worker classifies as soldier or vehicle.

type MarkerMove

type MarkerMove struct {
	MarkerName   string
	CaptureFrame core.Frame
	Position     core.Position3D
	Direction    float32
	Alpha        float32
	Time         time.Time
}

MarkerMove represents a marker position update as parsed from ArmA data. MarkerName needs resolution to a MarkerID via MarkerCache by the worker.

type Parser

type Parser struct {
	// contains filtered or unexported fields
}

Parser provides pure []string -> model struct conversion. It has zero external dependencies beyond a logger.

func NewParser

func NewParser(logger *slog.Logger) *Parser

NewParser creates a new parser with only a logger dependency

func (*Parser) ParseAce3DeathEvent

func (p *Parser) ParseAce3DeathEvent(data []string) (core.Ace3DeathEvent, error)

ParseAce3DeathEvent parses ACE3 death event data and returns a core Ace3DeathEvent. SoldierID and LastDamageSourceID are set directly (no cache validation).

func (*Parser) ParseAce3UnconsciousEvent

func (p *Parser) ParseAce3UnconsciousEvent(data []string) (core.Ace3UnconsciousEvent, error)

ParseAce3UnconsciousEvent parses ACE3 unconscious event data and returns a core Ace3UnconsciousEvent. SoldierID is set directly (no cache validation - worker validates).

func (*Parser) ParseChatEvent

func (p *Parser) ParseChatEvent(data []string) (core.ChatEvent, error)

ParseChatEvent parses chat event data and returns a core ChatEvent. SoldierID is set directly (no cache validation - worker validates).

func (*Parser) ParseGeneralEvent

func (p *Parser) ParseGeneralEvent(data []string) (core.GeneralEvent, error)

ParseGeneralEvent parses general event data and returns a core GeneralEvent

func (*Parser) ParseKillEvent

func (p *Parser) ParseKillEvent(data []string) (KillEvent, error)

ParseKillEvent parses kill event data into a KillEvent. Raw victim/killer IDs are returned for the worker to classify as soldier vs vehicle.

func (*Parser) ParseMarkerCreate

func (p *Parser) ParseMarkerCreate(data []string) (core.Marker, error)

ParseMarkerCreate parses marker create data and returns a core Marker

func (*Parser) ParseMarkerDelete

func (p *Parser) ParseMarkerDelete(data []string) (*core.DeleteMarker, error)

ParseMarkerDelete parses marker delete data and returns a DeleteMarker

func (*Parser) ParseMarkerMove

func (p *Parser) ParseMarkerMove(data []string) (MarkerMove, error)

ParseMarkerMove parses marker move data into a MarkerMove. The MarkerName is returned for the worker to resolve to a MarkerID via MarkerCache.

func (*Parser) ParseMission

func (p *Parser) ParseMission(data []string) (core.Mission, core.World, error)

ParseMission parses mission and world data from raw args. Returns parsed mission + world. NO DB operations, NO cache resets, NO callbacks.

func (*Parser) ParsePlacedObject

func (p *Parser) ParsePlacedObject(data []string) (core.PlacedObject, error)

ParsePlacedObject parses placed object data into a core PlacedObject. Args: [frame, id, className, displayName, "x,y,z", ownerOcapId, side, weapon, magazineIcon]

func (*Parser) ParsePlacedObjectEvent

func (p *Parser) ParsePlacedObjectEvent(data []string) (core.PlacedObjectEvent, error)

ParsePlacedObjectEvent parses placed object event data into a core PlacedObjectEvent. Args: [frame, id, eventType, "x,y,z", hitEntityOcapId?]

func (*Parser) ParseProjectileEvent

func (p *Parser) ParseProjectileEvent(data []string) (ProjectileEvent, error)

ParseProjectileEvent parses projectile event data into a ProjectileEvent. Hit parts are returned as HitPart for the worker to classify as soldier/vehicle.

func (*Parser) ParseRadioEvent

func (p *Parser) ParseRadioEvent(data []string) (core.RadioEvent, error)

ParseRadioEvent parses radio event data and returns a core RadioEvent. SoldierID is set directly (no cache validation - worker validates).

func (*Parser) ParseSoldier

func (p *Parser) ParseSoldier(data []string) (core.Soldier, error)

ParseSoldier parses soldier data and returns a core Soldier

func (*Parser) ParseSoldierState

func (p *Parser) ParseSoldierState(data []string) (core.SoldierState, error)

ParseSoldierState parses soldier state data and returns a core SoldierState. Sets SoldierID directly from the parsed ocapID (no cache lookup). If groupID/side fields are not in the data (len < 17), they are left empty for the worker layer to fill from cache.

func (*Parser) ParseTelemetryEvent

func (p *Parser) ParseTelemetryEvent(data []string) (core.TelemetryEvent, error)

ParseTelemetryEvent parses a unified telemetry snapshot sent every ~10 seconds. Replaces the old :FPS: and :METRIC: commands.

ArmA's callExtension flattens the top-level SQF array into 7 separate string args:

data[0] — Frame number (OCAP_recorder_captureFrameNo). Plain integer string.
           Example: "134"

data[1] — Server FPS: [diag_fps, diag_fpsmin].
           Example: "[43.3604,4.36681]"

data[2] — Per-side entity counts. Array[4] in order [east, west, independent, civilian].
           Each side: [[server_local], [remote]].
           Each locality: [units_total, units_alive, units_dead, groups_total,
                           vehicles_total, vehicles_weaponholder].
           Note: units_total ≈ units_alive (allUnits typically only contains living units;
           they may diverge with ACE unconscious units).
           Example: "[[[1,1,0,1,0,0],[0,0,0,0,0,0]],[[10,10,0,8,0,0],[0,0,0,0,0,0]],...]"

data[3] — Global entity counts: [units_alive, units_dead, groups_total, vehicles_total,
           vehicles_weaponholder, players_alive, players_dead, players_connected].
           Example: "[22,12,15,28,0,1,0,1]"

data[4] — Running scripts: [spawn, execVM, exec, execFSM, pfh].
           Indices 0–3 from diag_activeScripts; index 4 is CBA per-frame handler count.
           Example: "[28,4,0,4,2]"

data[5] — Weather snapshot (12 floats): [fog, overcast, rain, humidity, waves,
           windDir (0–360°), windStr, gusts, lightnings, moonIntensity,
           moonPhase (0=new, 0.5=full, 1=new), sunOrMoon (0=night, 1=day)].
           Example: "[0.2,0.25,0,0,0.1,160.864,0.25,0.175,0.003153,0.441581,0.421672,1]"

data[6] — Player network data. Variable-length array, one entry per connected human player
           (excludes headless clients). Each entry: [playerUID, playerName, avgPing,
           avgBandwidth, desync]. Empty when no players: "[]".
           Note: avgBandwidth may use scientific notation (e.g. 1.67772e+07).
           Example: "[["76561198000074241","info",100,28,0]]"

func (*Parser) ParseTimeState

func (p *Parser) ParseTimeState(data []string) (core.TimeState, error)

ParseTimeState parses time state data and returns a core TimeState Args: [frameNo, systemTimeUTC, missionDateTime, timeMultiplier, missionTime]

func (*Parser) ParseVehicle

func (p *Parser) ParseVehicle(data []string) (core.Vehicle, error)

ParseVehicle parses vehicle data and returns a core Vehicle

func (*Parser) ParseVehicleState

func (p *Parser) ParseVehicleState(data []string) (core.VehicleState, error)

ParseVehicleState parses vehicle state data and returns a core VehicleState. Sets VehicleID directly from the parsed ocapID (no cache lookup).

type ProjectileEvent

type ProjectileEvent struct {
	CaptureFrame    core.Frame
	FirerObjectID   uint16
	VehicleObjectID *uint16

	WeaponDisplay   string
	MagazineDisplay string
	MuzzleDisplay   string

	SimulationType string
	MagazineIcon   string

	Trajectory []core.TrajectoryPoint
	HitParts   []HitPart
}

ProjectileEvent represents a projectile event as parsed from ArmA data. HitParts contain raw entity IDs that need classification by the worker.

type Service

type Service interface {
	ParseMission(args []string) (core.Mission, core.World, error)
	ParseSoldier(args []string) (core.Soldier, error)
	ParseVehicle(args []string) (core.Vehicle, error)
	ParseSoldierState(args []string) (core.SoldierState, error)
	ParseVehicleState(args []string) (core.VehicleState, error)
	ParseProjectileEvent(args []string) (ProjectileEvent, error)
	ParseGeneralEvent(args []string) (core.GeneralEvent, error)
	ParseKillEvent(args []string) (KillEvent, error)
	ParseChatEvent(args []string) (core.ChatEvent, error)
	ParseRadioEvent(args []string) (core.RadioEvent, error)
	ParseTimeState(args []string) (core.TimeState, error)
	ParseAce3DeathEvent(args []string) (core.Ace3DeathEvent, error)
	ParseAce3UnconsciousEvent(args []string) (core.Ace3UnconsciousEvent, error)
	ParseMarkerCreate(args []string) (core.Marker, error)
	ParseMarkerMove(args []string) (MarkerMove, error)
	ParseMarkerDelete(args []string) (*core.DeleteMarker, error)
	ParseTelemetryEvent(args []string) (core.TelemetryEvent, error)
	ParsePlacedObject(args []string) (core.PlacedObject, error)
	ParsePlacedObjectEvent(args []string) (core.PlacedObjectEvent, error)
}

Service defines the interface for parsing ArmA 3 extension arguments into model structs.

Jump to

Keyboard shortcuts

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