Ultra Sniper Pro 9001 — the whole game in one self-contained component (world-component pattern).
Attach to a "GameDirector" entity in the main scene. Runs per client: each
player gets their own contract session (NPCs are client-local entities).
clamp(v: number, lo: number, hi: number) → number
Utils
| arg | type | description |
|---|
| v | number | |
| lo | number | |
| hi | number | |
dist2D(ax: number, az: number, bx: number, bz: number) → number
| arg | type | description |
|---|
| ax | number | |
| az | number | |
| bx | number | |
| bz | number | |
wrapAngle(a: number) → number
| arg | type | description |
|---|
| a | number | |
yawQuat(yaw: number) → void
| arg | type | description |
|---|
| yaw | number | |
fmtTime(t: number) → string
| arg | type | description |
|---|
| t | number | |
starsAvailable( ) → number
hasUpgrade(id: string) → boolean
| arg | type | description |
|---|
| id | string | |
ensureHost(name: string, cfg: any) → string
| arg | type | description |
|---|
| name | string | |
| cfg | any | |
play(name: string, vol: number?, pitch: number?) → void
| arg | type | description |
|---|
| name | string | |
| vol | number? | |
| pitch | number? | |
setMusic(name: string) → void
| arg | type | description |
|---|
| name | string | |
update(dt: number) → void
called every frame: volumes react to state
| arg | type | description |
|---|
| dt | number | |
setVol(ent: string?, v: number) → void
| arg | type | description |
|---|
| ent | string? | |
| v | number | |
subtitle(text: string, dur: number?) → void
Subtitles / radio
| arg | type | description |
|---|
| text | string | |
| dur | number? | |
radio(text: string, kind: string?) → void
| arg | type | description |
|---|
| text | string | |
| kind | string? | |
makePerson(name: string, coat: any, hat: any, kind: string) → any
| arg | type | description |
|---|
| name | string | |
| coat | any | |
| hat | any | |
| kind | string | |
part(pname: string, pos: { number }, size: { number }, tint: { number }, model: string?) → void
| arg | type | description |
|---|
| pname | string | |
| pos | { number } | |
| size | { number } | |
| tint | { number } | |
| model | string? | |
npcBaseY(n: any) → number
npcHeadPos(n: any) → void
npcSegmentHit(n: any, px: number, py: number, pz: number, qx: number, qy: number, qz: number) → void
Analytic hit test against a segment (p->q). Returns nil | "head" | "body", t
| arg | type | description |
|---|
| n | any | |
| px | number | |
| py | number | |
| pz | number | |
| qx | number | |
| qy | number | |
| qz | number | |
closestT(cx: number, cy: number, cz: number) → number
| arg | type | description |
|---|
| cx | number | |
| cy | number | |
| cz | number | |
pickDistinct(list: any, count: number) → any
Dossier generation
| arg | type | description |
|---|
| list | any | |
| count | number | |
buildDossier(contract: any, civCount: number) → any
Build dossier + assign appearances so exactly ONE civ matches all tells.
| arg | type | description |
|---|
| contract | any | |
| civCount | number | |
despawnNpcs( ) → void
NPC spawning
randomWanderPoint( ) → any
placeNpc(n: any, x: number, z: number) → void
| arg | type | description |
|---|
| n | any | |
| x | number | |
| z | number | |
spawnCivilian(i: number, dossier: any, matchMask: number) → any
| arg | type | description |
|---|
| i | number | |
| dossier | any | |
| matchMask | number | |
spawnVip(idx: number, contract: any, dossier: any) → any
| arg | type | description |
|---|
| idx | number | |
| contract | any | |
| dossier | any | |
spawnBodyguard(i: number, vip: any) → any
| arg | type | description |
|---|
| i | number | |
| vip | any | |
spawnGuard(i: number) → any
| arg | type | description |
|---|
| i | number | |
spawnCounterSniper( ) → any
spawnPuff(x: number, y: number, z: number, size: number, tint: { number }, life: number) → void
Smoke puffs (smoker tell) + impact fx
| arg | type | description |
|---|
| x | number | |
| y | number | |
| z | number | |
| size | number | |
| tint | { number } | |
| life | number | |
updateFx(dt: number) → void
| arg | type | description |
|---|
| dt | number | |
setAlert(level: string) → void
Alert system
| arg | type | description |
|---|
| level | string | |
noiseEvent(x: number, z: number, radius: number) → void
| arg | type | description |
|---|
| x | number | |
| z | number | |
| radius | number | |
ensureNightGrade( ) → void
Contract flow
applySky(contract: any) → void
| arg | type | description |
|---|
| contract | any | |
endContract(win: boolean, reason: string) → void
| arg | type | description |
|---|
| win | boolean | |
| reason | string | |
cleanupContract( ) → void
startContract(idx: number, customOpts: any) → void
| arg | type | description |
|---|
| idx | number | |
| customOpts | any | |
nestMuzzle( ) → void
Shooting
killNpc(n: any, zone: string) → void
| arg | type | description |
|---|
| n | any | |
| zone | string | |
onNpcShot(n: any, zone: string, dist: number) → void
| arg | type | description |
|---|
| n | any | |
| zone | string | |
| dist | number | |
stepBullets(dt: number) → void
| arg | type | description |
|---|
| dt | number | |
moveToward(n: any, tx: number, tz: number, dt: number) → boolean
NPC behaviour tick
| arg | type | description |
|---|
| n | any | |
| tx | number | |
| tz | number | |
| dt | number | |
nearestExit(n: any) → void
losToNest(x: number, y: number, z: number) → boolean
| arg | type | description |
|---|
| x | number | |
| y | number | |
| z | number | |
checkBodyDiscovery(n: any) → void
living civs and guards raise the alarm when they stumble on a dead VIP
updateNpc(n: any, dt: number) → void
| arg | type | description |
|---|
| n | any | |
| dt | number | |
updateMotorcade(dt: number) → void
| arg | type | description |
|---|
| dt | number | |
scopeFovs( ) → any
Player update (scope, breath, sway, camera)
updatePlayer(dt: number) → void
| arg | type | description |
|---|
| dt | number | |
label(text: string, size: number, color: string, extra: any) → any
| arg | type | description |
|---|
| text | string | |
| size | number | |
| color | string | |
| extra | any | |
absPanel(x: number, y: number, w: number, h: number, bg: string?, children: any) → any
| arg | type | description |
|---|
| x | number | |
| y | number | |
| w | number | |
| h | number | |
| bg | string? | |
| children | any | |
btn(text: string, id: string, opts: any) → any
| arg | type | description |
|---|
| text | string | |
| id | string | |
| opts | any | |
menuFrame(title: string, subtitleText: string?, body: any) → any
| arg | type | description |
|---|
| title | string | |
| subtitleText | string? | |
| body | any | |
slider(id: string, value: number) → any
| arg | type | description |
|---|
| id | string | |
| value | number | |
settingRow(name: string, node: any) → any
| arg | type | description |
|---|
| name | string | |
| node | any | |
contractIndexById(cid: string) → number
Callbacks
| arg | type | description |
|---|
| cid | string | |
onCallback(id: string, data: any) → void
| arg | type | description |
|---|
| id | string | |
| data | any | |
aimAtNpc(n: any, headFrac: number?) → void
Debug harness
| arg | type | description |
|---|
| n | any | |
| headFrac | number? | |
debug(cmd: string, a: any, b: any) → any
| arg | type | description |
|---|
| cmd | string | |
| a | any | |
| b | any | |
ensureInit( ) → void
Lifecycle
update(dt: number) → void
| arg | type | description |
|---|
| dt | number | |