EntityRefA host-liveness-gated handle to a live entity. id is a HOST-MINTED monotonic liveness
id — liveness is decided by the host's books (fed by engine create/delete notifications,
cleared at map transition), NEVER by reading the entity's own memory. Every access
re-resolves: books first, then identity-slot validation, instance last. A stale ref
degrades to null/false — including across a changelevel.
The framework mints every EntityRef; plugin code never constructs one (the constructor
is intentionally not part of the public surface — a hand-built ref is the "raw ref across
time" footgun). Obtain refs from the engine (events, findByClass, readHandle, …).
readonly index: numberreadonly id: numberreadonly name: string | nullCEntityIdentity::m_name) — e.g. a map trigger's "map_start". "" if
the entity has no targetname; null if the ref is stale/invalid.isValid(): booleanreadInt32(offset: number): number | nulloffset bytes into the entity, or null if the ref is stale.writeInt32(offset: number, value: number): booleanoffset bytes into the entity. Returns true on success, false if stale.readFloat32(offset: number): number | nulloffset bytes into the entity, or null if the ref is stale.writeFloat32(offset: number, value: number): booleanoffset. Returns true on success, false if stale.readBool(offset: number): boolean | nulloffset, or null if the ref is stale.writeBool(offset: number, value: boolean): booleanoffset. Returns true on success, false if stale.readInt8(offset: number): number | nulloffset, or null if the ref is stale.readInt16(offset: number): number | nulloffset, or null if the ref is stale.readUInt8(offset: number): number | nulloffset, or null if the ref is stale.readUInt16(offset: number): number | nulloffset, or null if the ref is stale.readUInt32(offset: number): number | nulloffset, or null if the ref is stale.writeInt8(offset: number, value: number): booleanoffset. Returns true on success, false if stale.writeInt16(offset: number, value: number): booleanoffset. Returns true on success, false if stale.writeUInt8(offset: number, value: number): booleanoffset. Returns true on success, false if stale.writeUInt16(offset: number, value: number): booleanoffset. Returns true on success, false if stale.writeUInt32(offset: number, value: number): booleanoffset. Returns true on success, false if stale.readUInt64(offset: number): bigint | nulloffset as a BigInt, or null if the ref is stale.readInt64(offset: number): bigint | nulloffset as a BigInt, or null if the ref is stale.readFloat64(offset: number): number | nulloffset, or null if the ref is stale.readString(offset: number, maxLen: number): string | nullmaxLen bytes) at offset, or null if the ref is stale.writeString(offset: number, maxLen: number, value: string): booleanchar[maxLen] field at offset (truncated to
maxLen-1 bytes + always NUL-terminated). Returns true on success, false if the ref is stale.readFloats(offset: number, count: number): number[] | nullcount (1..4) contiguous float32s at offset into a number[], or null if the ref is stale.readFloatsChain(ptrOffs: number[], finalOff: number, count: number): number[] | nullcount (1..4) floats
at finalOff into a number[]. All in-core (raw pointers never cross); null if the root is stale or any hop
is null.readInt32Via(pathOffs: number[], finalOff: number): number | nullfinalOff. null if the root is stale or any
hop is null. readHandleVia decodes a handle field → a liveness-gated EntityRef; vectors use readFloatsChain.writeInt32Via(pathOffs: number[], finalOff: number, value: number): booleanreadInt8Via(pathOffs: number[], finalOff: number): number | nullreadInt16Via(pathOffs: number[], finalOff: number): number | nullreadUInt8Via(pathOffs: number[], finalOff: number): number | nullreadUInt16Via(pathOffs: number[], finalOff: number): number | nullreadUInt32Via(pathOffs: number[], finalOff: number): number | nullreadFloat32Via(pathOffs: number[], finalOff: number): number | nullreadBoolVia(pathOffs: number[], finalOff: number): boolean | nullreadUInt64Via(pathOffs: number[], finalOff: number): bigint | nullreadInt64Via(pathOffs: number[], finalOff: number): bigint | nullreadHandleVia(pathOffs: number[], finalOff: number): EntityRef | nullCEntityHandle at the end of a pointer chain into a liveness-gated EntityRef; null if the root is stale, any hop is null, or the handle is dead.writeFloat32Via(pathOffs: number[], finalOff: number, value: number): booleanread*Via). Liveness-gated at the root;
returns false on a stale ref, an unresolved hop, or a bad offset/kind. Does NOT notifyStateChanged —
the caller decides (many sub-object fields, e.g. the fire gate, are server-authoritative).
(writeInt32Via is declared above alongside readInt32Via.)writeBoolVia(pathOffs: number[], finalOff: number, value: boolean): booleanreadHandle(offset: number): EntityRef | nullCEntityHandle at offset, decode it, and return a live EntityRef — or null if stale/invalid.notifyStateChanged(offset: number): voidoffset changed (triggers network replication). No-op if stale.identityFlags(): number | nullspawn(keyvalues?: EntityKeyValueMap): booleanteleport(origin: number[] | null, angles?: number[] | null, velocity?: number[] | null): booleanremove(): booleanactivateCollision(): booleansetModel(name: string): booleanCBaseEntity::SetModel. A runtime
trigger_multiple needs a model to build the physics volume that fires touch. Returns false
if the op is unavailable or the ref is stale.readHandleVector(ptrOffs: number[], vectorOff: number, maxCount?: number): EntityRef[]acceptInput(input: string, value?: string, activator?: EntityRef, caller?: EntityRef, delay?: number): booleanAddEntityIOEvent — the game's own input-firing path (map I/O and FireOutputInternal route
through it). value is the input's string argument (Source parses it per the input's field type;
omit for a value-less input). activator/caller are optional entities threaded through to any
output the input triggers. delay queues the event on the engine's same-tick I/O pump (0 = fires
this same tick — NOT synchronous-within-the-call). Returns false with no op / a stale ref.