Configure HCP VBS
HCP VBS reads four JSON files from the same folder as the DLL (VBS4’s mycomponents/HCPVBS/) at
startup. A missing or malformed file falls back to the compiled defaults shown below - the plugin
never fails to load because of a bad configuration file.
HEAT Capture has no named-pipe listener. HCP VBS’s own committed HCPVBSConfig.json sets
communication.type to "namedpipe", targeting \\.\pipe\HEATCollector - a leftover from an
earlier “HEAT Collector” service that named pipes predate. Current HEAT Capture’s plugin
interface is REST plus WebSocket only (see the
HEAT Capture web API). With "namedpipe" selected, HCP VBS creates the
pipe and waits for a client; nothing ever connects, so every publish attempt fails, and because
autoReconnect is unconditionally forced on at startup regardless of what the file says, the
plugin logs Write failed, attempting reconnection and recreates the pipe on every collection
tick, indefinitely, without ever raising an error a log filtered to warnings or above would show.
Set communication.type to "websocket" to use the interface HEAT Capture actually exposes.
HCPVBSConfig.json
Communication
| Setting | Type | Default | Effect | When to change |
|---|---|---|---|---|
communication.type | string | "namedpipe" as shipped; "websocket" if the key is absent or the file is missing | Selects the transport | Always set to "websocket" against current HEAT Capture; see above |
WebSocket
| Setting | Type | Default | Effect | When to change |
|---|---|---|---|---|
websocket.hostname | string | "localhost" | Host for the session HTTP calls (start-session, stop-session, current-session) | HEAT Capture runs on a different machine |
websocket.port | string | "50001" | Port for the session HTTP calls | Must match HEAT Capture’s configured port - see below |
websocket.address | string | "ws://localhost:50001/ws" | Base WebSocket URL. Built independently of hostname/port above - changing one does not change the other | Must match HEAT Capture’s configured host and port |
websocket.publishEndpoint | string | "/publish" | Appended to address to form the publish URL | Leave as /publish |
The shipped port is wrong for current HEAT Capture. HEAT Capture’s own default HTTP/WebSocket
port is 5005 (see Configure HEAT Capture), not 50001. Set
websocket.port to 5005 (or whatever WebSettings:Port is set to on the target workstation),
and update websocket.address to match, for example "ws://localhost:5005/ws". The resulting
publish URL is address + publishEndpoint - here, ws://localhost:5005/ws/publish - which
must equal the /ws/publish endpoint HEAT Capture documents.
Named pipe
Present for completeness; do not use this transport against current HEAT Capture (see above).
| Setting | Type | Default | Effect |
|---|---|---|---|
namedpipe.pipeName | string | "\\\\.\\pipe\\HEATCollector" | Win32 named-pipe path HCP VBS creates and serves |
namedpipe.bufferSize | integer | 65536 | Pipe I/O buffer size in bytes |
namedpipe.timeoutMs | integer | 5000 | Pipe connection timeout in milliseconds |
namedpipe.autoReconnect | boolean | true in the file; has no effect | See below |
namedpipe.autoReconnect cannot be turned off. The plugin overwrites it to true unconditionally
right after loading the file, regardless of what the JSON says.
Session
| Setting | Type | Default | Effect | When to change |
|---|---|---|---|---|
session.startEndpoint | string | "/api/session/start-session" | Appended to hostname:port for the session-start HTTP POST | Leave as shipped |
session.stopEndpoint | string | "/api/session/stop-session" | Appended to hostname:port for the session-stop HTTP POST | Leave as shipped |
session.sessionEndpoint (the current-session GET) is not read from this file - it is fixed in
the plugin at /api/session/current-session regardless of what a JSON file sets.
Collection
| Setting | Type | Default | Effect | When to change |
|---|---|---|---|---|
collection.intervalSeconds | number | 0 | Documented as the seconds between data collections; has no effect - see below | Not applicable |
collection.captureEnabled | boolean | true | Master switch: false stops all frame preparation, transmission and event recording | To pause capture without unloading the component |
collection.intervalSeconds does nothing. The value is parsed from the file, but the code
path that would apply it (HCPVBSEventManager::SetCollectionInterval) is never called from
anywhere in the plugin. The actual collection cadence is a separate, hardcoded 0.1 second (10 Hz)
interval inside the event manager that this setting cannot reach. There is currently no way to
change how often HCP VBS collects entity data from HCPVBSConfig.json.
captureEnabled does work: it gates OnTick at the call site, so setting it to false stops
frame preparation, transmission, and all tracking-event recording. It cannot be re-enabled while
VBS4 is running - the plugin only reads it once, at Component_OnStart, before the mission is
loaded.
DISMappings.json
Fallback mapping from a VBS ObjectType_v1 name to a DIS entity type pattern, used only when
DISConfigNameMappings.json (below) has no entry for the entity’s config class name.
{
"mappings": [
{
"vbsType": "tank",
"disType": "1.1.*.1.*.*.*",
"description": "Tank: Kind=1 (Platform), Domain=1 (Land), Category=1"
}
]
}vbsType- a VBSObjectType_v1name, for exampletank,car,human.disType-kind.domain.country.category.subcategory.specific.extra;*resolves to0. A string with fewer than seven parts has the remaining parts set to0.description- informational only.
DISConfigNameMappings.json
Primary lookup, keyed by the entity’s VBS model config class name. Checked before
DISMappings.json; if no entry matches here, HCP VBS falls back to the type-based mapping above,
then to "0.0.0.0.0.0.0" if neither matches.
[
{
"disType": "1.1.0.7.0.0.0",
"vbsModel": "vbs_civ_truck_light_transport_wht_x"
}
]Entries are typically generated with the scraper tool in build/vs2022/scraper/, which reads the
VBS Gateway DIS mappings table.
EntityDenyList.json
Excludes entities from tracking entirely - they never generate a creation event, never appear in
a SimulationFrame, and never generate tracking events.
{
"denyList": [
{ "type": "ammunition", "configClassName": "" },
{ "type": "", "configClassName": "Land_Cargo20_military_F" }
]
}An entity is denied if it matches any rule in the list. Within a rule, both fields must match for that rule to apply; an empty string in either field matches anything for that field.
| Field | Empty means | Non-empty means |
|---|---|---|
type | Match any VBS object type | Entity must have this VBS object type |
configClassName | Match any config class | Entity’s config class name must equal this string exactly |