PawnA CS2 player pawn (the in-world body): the generated CCSPlayerPawn schema fields + the liveness-gated ref.
controller is the typed reverse hop (shadows the raw generated m_hController handle).
Nav props (sceneNode, weaponServices, movementServices, aimPunchServices) are generated from nav-targets.json.
readonly ref: EntityRefreadonly isValid: booleanref.isValid() for any pawn WRITE — a staged-but-live
pawn passes ref.isValid() yet segfaults on SetModel/SetParent. Falls back to liveness if the
staging-flag read is unavailable.readonly controller: Player | nullreadonly origin: Vector | nullreadonly angles: QAngle | nulleyeAngles.readonly sceneNode: SceneNode | nullreadonly weaponServices: WeaponServices | nullreadonly movementServices: MovementServices | nullreadonly aimPunchServices: AimPunchServices | nullsetVelocity(x: number, y: number, z: number): booleanmoveType: number | nullslay(): voidreadonly maxSpeed: number | nullCCSPlayerPawn::GetPlayerMaxSpeed).
A getter rather than a field because the engine computes it — there is no m_flMaxSpeed on
CCSPlayerPawn in the schema, so there is nothing to read. null (never 0) when the descriptor
is unavailable or the ref is stale: 0 is a legitimate speed for a frozen player, so it must not
double as "unavailable".giveNamedItem(name: string): Weapon | nullreadonly activeWeapon: Weapon | nullreadonly weapons: Weapon[]removeWeapon(weapon: Weapon): booleanstripWeapons(): booleandisarm(): booleandropActiveWeapon(): booleanreadonly nextAttack: number | nullblockFiring(seconds?: number): booleanseconds (default effectively-indefinite) by writing m_flNextAttack. The
gate is server-authoritative and time-based: a durable block needs a large value or a per-frame refresh.
Returns false if unresolved/stale.allowFiring(): booleanaimTrace(opts?: { distance?: number; mask?: number; ignoreEntity?: EntityRef }): TraceHit | nulleyeAngles. Ignores
this pawn's own entity unless ignoreEntity is given. Returns null if the transform/angles are
unreadable (stale ref). distance defaults to 8192.emitSound(name: string, opts?: { recipients?: number[]; volume?: number }): numberstopSound(name: string): booleanrecipients/volume: the engine stops it for everyone hearing it. False if the ref is
stale or the op is unavailable.setGravityScale(scale: number): booleanm_flGravityScale, which the engine ignores — see EntityRef.setGravityScale. False if the
ref is stale, the op is unavailable, or scale is not finite.applyAbsVelocityImpulse(impulse: number[]): booleanteleport(null, null, velocity) which sets velocity absolutely. impulse is an [x,y,z] triple.
False if the ref is stale, the op is unavailable, or any component is not finite.setModelScale(scale: number): boolean