@rezless/vitest 0.6.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +293 -10
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/loadLinkset.d.ts +3 -0
- package/dist/loadLinkset.d.ts.map +1 -1
- package/dist/loadLinkset.js +14 -1
- package/dist/loadLinkset.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -88,6 +88,8 @@ await loadScript({
|
|
|
88
88
|
randomSeed: 42, // optional, default 1
|
|
89
89
|
owner: 'aaaa-bbbb-...', // optional, NULL_KEY default
|
|
90
90
|
startUnixTime: 1700000000, // optional, Unix time when the virtual clock starts, default 0
|
|
91
|
+
startParameter: 42, // optional, the start parameter the object was rezzed with, default 0
|
|
92
|
+
startString: 'hello', // optional, the start string the object was rezzed with, default ""
|
|
91
93
|
objectKey: 'cccc-dddd-...', // optional, derived from filename
|
|
92
94
|
objectName: 'StarterCube', // optional, "Object" default
|
|
93
95
|
scriptName: 'greeter', // optional, derived from filename
|
|
@@ -96,6 +98,7 @@ await loadScript({
|
|
|
96
98
|
},
|
|
97
99
|
stubs: 'warn', // optional: 'allow' (default), 'warn' or 'throw' when the script calls a stubbed function
|
|
98
100
|
memoryLimit: true, // optional, default false: true crashes the script with a Stack-Heap Collision when rezless's rough memory estimate passes the limit
|
|
101
|
+
experience: new Experience({ name: 'Quest' }), // optional: compile the script with an experience; scripts given the same one share its key-value store
|
|
99
102
|
})
|
|
100
103
|
```
|
|
101
104
|
|
|
@@ -109,14 +112,25 @@ Calls to functions that aren't built in or defined by the script fail to load, a
|
|
|
109
112
|
// Drive events
|
|
110
113
|
s.start() // run state_entry of default
|
|
111
114
|
s.fire(eventName, payload) // payload binds to handler params by spec name
|
|
112
|
-
s.advanceTime(ms) // advance virtual clock;
|
|
115
|
+
s.advanceTime(ms) // advance virtual clock by exactly ms; runs everything due by then
|
|
113
116
|
s.deliverChat({ channel, name, key, message }) // fire `listen` on matching active listens
|
|
114
117
|
s.respondToHttp(key, { status, body }) // fire `http_response` for a captured llHTTPRequest
|
|
115
118
|
s.respondToLastHttp({ status, body }) // same, for the most recent
|
|
119
|
+
s.sendHttpRequest(url, { method, headers, body }) // fire `http_request` on a URL from llRequestURL; returns { key, response }
|
|
120
|
+
s.grantUrls() / s.denyUrls() // grant (default) or deny later llRequestURL / llRequestSecureURL calls
|
|
121
|
+
s.deliverEmail({ from, subject, message }) // queue mail on the prim for llGetNextEmail; false when the queue is full
|
|
116
122
|
s.respondToDataserver(key, value) // fire `dataserver` for a captured llRequest*
|
|
117
123
|
s.respondToLastDataserver(value) // same, for the most recent
|
|
118
124
|
s.grantPermissions(perms?) // answer the latest llRequestPermissions; fires `run_time_permissions`
|
|
119
125
|
s.denyPermissions() // answer it with No
|
|
126
|
+
s.grantExperiencePermissions() // accept the latest llRequestExperiencePermissions; fires `experience_permissions`
|
|
127
|
+
s.denyExperiencePermissions(reason?) // decline it; fires `experience_permissions_denied` (XP_ERROR_NOT_PERMITTED by default)
|
|
128
|
+
s.answerDialog(text, { name? }) // answer the latest llDialog / llTextBox as its avatar; fires `listen`
|
|
129
|
+
s.sendControl(level) // the permission agent holds exactly these CONTROL_* bits; fires `control`
|
|
130
|
+
s.setGameControl(agent, { mode, axes, buttons }) // set semantic input shared by scripts in the World; null clears it
|
|
131
|
+
s.sendGameControl(agent, { buttons?, axes? }) // deliver raw input plus a semantic snapshot, with permission
|
|
132
|
+
s.setCamera({ pos?, rot?, fov?, aspect? }) // set the camera llGetCameraPos / Rot / FOV / Aspect report
|
|
133
|
+
s.setAnimationState(avatar, "Standing") // register an avatar in this region and set its locomotion state
|
|
120
134
|
s.mock(name, impl) // override any ll* function (real or stubbed) per-test
|
|
121
135
|
s.reset() // re-init globals + return to default + state_entry
|
|
122
136
|
|
|
@@ -131,8 +145,19 @@ s.chat // [{ channel, text, type, to? }
|
|
|
131
145
|
s.calls // [{ name, args, returned }, ...]
|
|
132
146
|
s.callsOf(name) // filter call log by ll* name
|
|
133
147
|
s.httpRequests // [{ key, url, method, body, headers, mimetype, ... }]
|
|
148
|
+
s.urls // URLs the script holds from llRequestURL / llRequestSecureURL
|
|
149
|
+
s.emails // [{ address, subject, message, time }] sent with llEmail
|
|
150
|
+
s.targetedEmails // [{ target, subject, message, time }] sent with llTargetedEmail
|
|
151
|
+
s.inbox // mail queued on the prim, oldest first
|
|
134
152
|
s.dataserverRequests // [{ key, source, args, fulfilled }]
|
|
135
153
|
s.permissionRequests // [{ agent, permissions, answered }]
|
|
154
|
+
s.experience // the Experience the script was given, or null
|
|
155
|
+
s.experienceRequests // [{ agent, answered }] from llRequestExperiencePermissions
|
|
156
|
+
s.teleportRequests // teleport attempts, including denials, with time and destination
|
|
157
|
+
s.dialogs // [{ kind, agent, message, buttons, channel, objectKey, answered }]
|
|
158
|
+
s.controls // llTakeControls arguments: { controls, accept, passOn } or null
|
|
159
|
+
s.cameraParams // ReadonlyMap of llSetCameraParams rule -> value
|
|
160
|
+
s.getPlayingAnimations(avatar) // snapshot of playing animation UUIDs, sorted by UUID
|
|
136
161
|
s.listens // [{ handle, channel, name, key, message, active }]
|
|
137
162
|
s.linkedMessages // [{ target, num, str, id }] sent by THIS script
|
|
138
163
|
s.clearLinkedMessages() // drop captured llMessageLinked entries
|
|
@@ -140,14 +165,28 @@ s.linksetData // ReadonlyMap<string, { value,
|
|
|
140
165
|
s.seedLinksetData(entries) // pre-populate LSD without firing events
|
|
141
166
|
s.text // current llSetText: { text, color, alpha } or null
|
|
142
167
|
s.objectDesc // current llSetObjectDesc value
|
|
168
|
+
s.touchText, s.sitText // current llSetTouchText / llSetSitText text, "" if unset
|
|
169
|
+
s.payPrice // llSetPayPrice arguments: { price, buttons } or null
|
|
143
170
|
s.dead // true once llDie has run
|
|
171
|
+
s.wakeAt // virtual ms a sleeping handler wakes at, or undefined when idle
|
|
144
172
|
|
|
145
173
|
// Multi-script context (auto-allocated for single-script tests)
|
|
146
174
|
s.host // the Prim instance hosting this script
|
|
147
175
|
s.linkset // the Linkset (shared clock, LSD, link_message bus)
|
|
148
176
|
s.scriptName // inventory name; backs llGetScriptName
|
|
177
|
+
s.inventoryOffers // item snapshots, targets, folder names and root paths
|
|
178
|
+
s.viewerRequests // URL/map arguments and floater rejection results
|
|
179
|
+
s.setAgentInRegion(key, present = true) // region-presence override, shared across its scripts
|
|
149
180
|
```
|
|
150
181
|
|
|
182
|
+
`start`, `fire`, `reset`, `deliverChat`, `grantPermissions` and the `respondTo*` calls return only after the handlers they started have finished; if one sleeps, the clock moves to its wake time while the other scripts keep running.
|
|
183
|
+
|
|
184
|
+
Recurring events created during those handlers do not extend the synchronous call forever. Use `advanceTime` to continue their handlers.
|
|
185
|
+
|
|
186
|
+
`advanceTime(ms)` stops the clock exactly `ms` later, so a handler still sleeping at that point stays asleep and carries on during a later `advanceTime`. This is a breaking change: before, one call ran the whole sleep.
|
|
187
|
+
|
|
188
|
+
A mock can take time like a builtin delay by calling `ctx.sleep(ms)`; the script pauses for that long after the mock returns.
|
|
189
|
+
|
|
151
190
|
### `loadLinkset(input)` → `Promise<LoadedLinkset>`
|
|
152
191
|
|
|
153
192
|
For tests that exercise more than one script — sibling scripts in the same
|
|
@@ -183,6 +222,9 @@ expect(scripts['display'].text?.text).toBe('count: 1')
|
|
|
183
222
|
// Linkset-wide helpers
|
|
184
223
|
linkset.advanceTime(1_000) // shared clock; every script's timers advance together
|
|
185
224
|
linkset.deliverChat({ channel: 0, name: 'Alice', key: 'k', message: 'hi' })
|
|
225
|
+
linkset.touch(2, { face: 0, st: { x: 0.5, y: 0.5, z: 0 }, hold: 1_500, avatar: { key: 'k', name: 'Alice' } })
|
|
226
|
+
// click link 2; reaches the scripts Second Life would
|
|
227
|
+
// deliver it to, honouring llPassTouches
|
|
186
228
|
linkset.linkedMessages // every llMessageLinked across the linkset
|
|
187
229
|
linkset.clearLinkedMessages()
|
|
188
230
|
linkset.clock.now // current virtual time in ms
|
|
@@ -202,6 +244,53 @@ prims within 10, 20 and 100 m of the sending prim, and so do its
|
|
|
202
244
|
region, and `llRegionSayTo` only the prim with that key. A prim never hears its
|
|
203
245
|
own chat, and `llOwnerSay` and `llInstantMessage` never trigger a `listen`.
|
|
204
246
|
|
|
247
|
+
#### Rezzing inventory objects
|
|
248
|
+
|
|
249
|
+
Give a prim named object definitions through `objects`, then inspect the new
|
|
250
|
+
linksets in its World:
|
|
251
|
+
|
|
252
|
+
```ts
|
|
253
|
+
const world = new World()
|
|
254
|
+
world.addRegion('Test', { x: 0, y: 0 })
|
|
255
|
+
const rezzer = await loadLinkset({
|
|
256
|
+
world, region: 'Test',
|
|
257
|
+
prims: [{
|
|
258
|
+
objects: {
|
|
259
|
+
payload: { prims: [{ name: 'Payload', scripts: [{
|
|
260
|
+
name: 'receiver', source: './receiver.lsl',
|
|
261
|
+
}] }] },
|
|
262
|
+
},
|
|
263
|
+
scripts: [{ name: 'rezzer', source: './rezzer.lsl' }],
|
|
264
|
+
}],
|
|
265
|
+
})
|
|
266
|
+
rezzer.scripts['rezzer'].start()
|
|
267
|
+
const rezzed = world.linksets.filter(object => object !== rezzer.linkset)
|
|
268
|
+
expect(rezzed[0].allScripts()[0].global('start')).toBe(42)
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
Here `rezzer.lsl` calls `llRezAtRoot("payload", llGetPos() + <0,0,2>,
|
|
272
|
+
ZERO_VECTOR, ZERO_ROTATION, 42)` and `receiver.lsl` stores
|
|
273
|
+
`llGetStartParameter()` in its `on_rez` handler. Each rez gets fresh prim keys,
|
|
274
|
+
and the rezzing prim receives `object_rez` with the new root key. An inventory
|
|
275
|
+
item made with `makeInventoryItem({ name, type: InventoryType.OBJECT, object:
|
|
276
|
+
savedLinkset })` supplies an existing linkset instead of an inline definition.
|
|
277
|
+
|
|
278
|
+
`llRezObject`, `llRezAtRoot` and `llRezObjectWithParams` apply the measured
|
|
279
|
+
size-dependent reach, placement and parameter rules. `llDerezObject` removes an
|
|
280
|
+
object, marks it temporary, or saves it back into its source inventory item.
|
|
281
|
+
Only the original rezzer can derez its copyable objects. Saved objects retain
|
|
282
|
+
script globals, LSL state, listeners and timers. Save objects between handlers;
|
|
283
|
+
suspended handler continuations are not restored.
|
|
284
|
+
|
|
285
|
+
`llGetVel` reads initial velocity unless a physics fixture overrides it;
|
|
286
|
+
`OBJECT_VELOCITY` reads initial velocity. `llGetForce` defaults to the
|
|
287
|
+
force requested through `REZ_ACCEL`. Force, sound, collision and no-entry flags
|
|
288
|
+
are captured requests; physical motion, contacts and audio are not simulated.
|
|
289
|
+
Temporary objects expire after exactly 60 seconds of virtual time, without
|
|
290
|
+
simulator cleanup jitter. Clearing temporary status cancels expiry; re-enabling
|
|
291
|
+
it starts a new countdown. Setting it true again keeps the current deadline.
|
|
292
|
+
Derez and `llDie` remove objects from `world.linksets`.
|
|
293
|
+
|
|
205
294
|
#### Several objects in a world
|
|
206
295
|
|
|
207
296
|
To test chat between separate objects, put their linksets in a `World`. Each
|
|
@@ -227,6 +316,43 @@ script or linkset runs every script's events in time order. Whisper, say and
|
|
|
227
316
|
shout cross region borders; `llRegionSay` and `llRegionSayTo` stay in the
|
|
228
317
|
sender's region.
|
|
229
318
|
|
|
319
|
+
A third argument to `addRegion` sets what scripts read about the region:
|
|
320
|
+
`flags`, `agentCount`, `fps`, `simStats` (by `SIM_STAT_*` number), `env`
|
|
321
|
+
(by `llGetEnv` name), `dayLength` and `dayOffset` in seconds (default a
|
|
322
|
+
four-hour day offset by 57600 s), and `sunRotation` and `moonRotation`, each a
|
|
323
|
+
rotation or a function of the fraction of the day gone (default a morning
|
|
324
|
+
sun with the moon opposite), `ground` (a height, or a function giving the
|
|
325
|
+
height at each whole-metre grid point from -1 to 256; default 22 m), `water` (default 20 m) and
|
|
326
|
+
`wind` (a vector, or a function of x and y) and `scriptDanger` (a boolean, or a function of x and y; default false). `llEdgeOfWorld` treats the world's other regions as
|
|
327
|
+
the neighbours. A linkset outside a world is alone in a region named
|
|
328
|
+
`Rezless`.
|
|
329
|
+
|
|
330
|
+
```ts
|
|
331
|
+
world.addRegion('Sandbox', { x: 256000, y: 256000 }, { flags: REGION_FLAG_SANDBOX, agentCount: 3 })
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
`environment` supplies `llGetEnvironment` result tuples by parameter number:
|
|
335
|
+
|
|
336
|
+
```ts
|
|
337
|
+
world.addRegion('Sandbox', { x: 0, y: 0 }, {
|
|
338
|
+
environment: { [SKY_GAMMA]: [2.5], [WATER_FOG]: [{ x: 0, y: 0.1, z: 0.2 }, 16, 0.25] },
|
|
339
|
+
})
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
Unspecified parameters use fixed samples measured on Aditi. Sun and moon
|
|
343
|
+
rotations and directions come from `sunRotation` and `moonRotation`, including
|
|
344
|
+
when their other tuple values are supplied through `environment`.
|
|
345
|
+
`ENVIRONMENT_DAYINFO` follows `dayLength`, `dayOffset` and the virtual clock.
|
|
346
|
+
Each region has one environment, with no parcel or altitude-specific settings.
|
|
347
|
+
Lighting and cloud samples stay fixed as time advances.
|
|
348
|
+
|
|
349
|
+
Land edit rights are not modelled. `llSetEnvironment` and
|
|
350
|
+
`llReplaceEnvironment` return `ENV_NO_PERMISSIONS`; `llModifyLand` leaves the
|
|
351
|
+
terrain unchanged; `llSetGroundTexture` returns 0 and reports the missing
|
|
352
|
+
estate permission on `DEBUG_CHANNEL`. Attempts remain in `script.calls`.
|
|
353
|
+
Successful land edits and both agent environment functions remain unfinished
|
|
354
|
+
under [#157](https://github.com/i-doll/rezless/issues/157).
|
|
355
|
+
|
|
230
356
|
`loadScript` continues to work for single-script tests; under the hood it
|
|
231
357
|
auto-allocates a 1-prim/1-script linkset, so existing tests are unaffected.
|
|
232
358
|
|
|
@@ -240,6 +366,121 @@ expect(s).toHaveSentHTTP({ url: '...', method: 'POST', body: '...' })
|
|
|
240
366
|
expect(s).toHaveListened(7, { key: ownerKey })
|
|
241
367
|
```
|
|
242
368
|
|
|
369
|
+
### Avatar names and info
|
|
370
|
+
|
|
371
|
+
Add an avatar with `world.addAvatar({ region, key, username, displayName, name,
|
|
372
|
+
size, info, language, position, group, friends, visualParams })`. Only `region`
|
|
373
|
+
and `username` are required. `name` is the legacy sensor name. Returned avatars
|
|
374
|
+
are mutable, so a test can move them or change an `AGENT_*` mask between events.
|
|
375
|
+
`friends` accepts UUIDs and becomes a mutable `Set`. `visualParams` maps supported
|
|
376
|
+
numeric parameter IDs to values in `[0, 1]`; unset supported parameters read 0.
|
|
377
|
+
Size defaults to `<0.45, 0.6, 1.9>`, flags to 0, and shared language to empty.
|
|
378
|
+
Display name defaults to `name`, then `username`.
|
|
379
|
+
|
|
380
|
+
`llGetDisplayName`, `llGetUsername`, `llName2Key`, `llGetAgentInfo`,
|
|
381
|
+
`llGetAgentLanguage`, `llGetAgentSize` and `llGetVisualParams` query avatars in
|
|
382
|
+
the script's region. `llRequestUserKey` searches all World avatar usernames and
|
|
383
|
+
answers every script in the prim through `dataserver`, with a UUID string or
|
|
384
|
+
`NULL_KEY`. `llGetAgentList` uses parcel fixtures for parcel scopes and rejects
|
|
385
|
+
nonempty options. `llIsFriend` reads fixture friendships; `llSameGroup` compares
|
|
386
|
+
active avatar groups, prim groups from `world.sensorProperties`, World object
|
|
387
|
+
groups, or a literal group UUID.
|
|
388
|
+
|
|
389
|
+
These fixtures do not simulate name caches, child agents, historical usernames,
|
|
390
|
+
lookup throttles, or physics and animation changes to info flags beyond seating. Positive
|
|
391
|
+
friendship, foreign-avatar groups, successful Resident-name lookup and
|
|
392
|
+
multi-avatar parcel filtering follow the wiki and need another avatar for
|
|
393
|
+
in-world validation. The single-avatar queries, name parsing, dataserver replies,
|
|
394
|
+
visual parameters, group changes and standing/sitting/flying/type/away/busy flags
|
|
395
|
+
were measured on Aditi in SLua Tideland on 2026-11-01.
|
|
396
|
+
|
|
397
|
+
### Sitting and teleporting
|
|
398
|
+
|
|
399
|
+
Use `world.sitAvatar(avatar, prim)` and `world.standAvatar(avatar)` to simulate
|
|
400
|
+
viewer seating. `avatar.sittingOn` identifies the occupied prim. Seated poses
|
|
401
|
+
follow the current prim transform with the offset captured at seating; editing
|
|
402
|
+
the target affects future sits. Deleting the object clears occupancy. Seating updates
|
|
403
|
+
`AGENT_SITTING` and `AGENT_ON_OBJECT`, clears movement bits, and fires
|
|
404
|
+
`changed(CHANGED_LINK)` throughout the object. The sit-target readers return
|
|
405
|
+
its sitter only while the target is enabled. `llSitOnLink` requires an allowed
|
|
406
|
+
experience and an accepted avatar; `llUnSit` needs no runtime permission for a
|
|
407
|
+
sitter on its own object. Land ownership also permits unsitting other sitters.
|
|
408
|
+
|
|
409
|
+
`llSetAgentRot` requires animation permission and changes yaw. A rotation
|
|
410
|
+
requested while sitting applies when standing. `llTeleportAgent` and
|
|
411
|
+
`llTeleportAgentGlobalCoords` require teleport permission from the owner, or
|
|
412
|
+
an accepted experience. Temporary attachments reject teleport calls and new
|
|
413
|
+
teleport-permission requests. Accepted teleports stand a sitter and move the avatar fixture.
|
|
414
|
+
Read attempts, including denials, through `s.teleportRequests`; `accepted`
|
|
415
|
+
means script checks passed, not confirmation from a remote simulator. Local
|
|
416
|
+
look-at vectors denote positions; cross-region vectors denote directions.
|
|
417
|
+
Map landmark asset UUIDs to `{ region, position }` in `world.landmarks`.
|
|
418
|
+
`llTeleportAgentHome` requires parcel ownership under both the script and target avatar and sleeps
|
|
419
|
+
five seconds. Supply `avatar.home` or the `addAvatar` option `home` to move to
|
|
420
|
+
a virtual destination; without it an authorized home request is recorded only.
|
|
421
|
+
|
|
422
|
+
The model does not simulate avatar skeleton offsets, occupied avatar links in
|
|
423
|
+
prim counts, parcel access/routing, group land powers, teleport throttles,
|
|
424
|
+
viewer smoothing, or network failures. Sitting does not choose animations.
|
|
425
|
+
Successful forced seating needs an experience-enabled parcel for in-world
|
|
426
|
+
validation. Foreign-avatar cases need a second avatar. Cross-region and real
|
|
427
|
+
home success were not probed because i Doll must stay in SLua Tideland.
|
|
428
|
+
|
|
429
|
+
### Avatar animations
|
|
430
|
+
|
|
431
|
+
Use `s.setAnimationState(avatar, "Standing")` to register an avatar and choose its locomotion state. `s.getPlayingAnimations(avatar)` returns the same UUIDs as `llGetAnimationList`. Animation state is shared by scripts in the same region of a `World`, or the same linkset when no world is supplied. It survives script reset and removal. Permission-granted animation calls also register their target avatar, initially standing.
|
|
432
|
+
|
|
433
|
+
`llGetAnimation` reports locomotion, even while a script plays another animation. Overrides change the animation used for that state. Playback records animation UUIDs; it does not simulate asset duration, blending or priorities. Tests drive locomotion changes explicitly with `setAnimationState`.
|
|
434
|
+
|
|
435
|
+
Use `world.addParcel({ region, bounds, owner, ...settings })` to configure parcel
|
|
436
|
+
reads. Bounds use region coordinates with `min` inclusive and `max` exclusive;
|
|
437
|
+
omitting bounds covers the region. Later parcels take precedence in overlaps.
|
|
438
|
+
Queries clamp x/y to the region edges and ignore z. Parcel details include
|
|
439
|
+
`name`, `description`, `group`, `area`, `flags`, `seeAvatars`, `landingPoint`,
|
|
440
|
+
`landingLookAt` and `tpRouting`. `maxPrims` and `primCounts` by `PARCEL_COUNT_*`
|
|
441
|
+
category are explicit fixture values; VM objects do not change land impact.
|
|
442
|
+
Capacity budgets may include fractions; queries truncate after aggregation.
|
|
443
|
+
Same-owner totals include only parcels in the caller's region. `primOwners`
|
|
444
|
+
maps owner UUIDs to land impact. Only the parcel owner can read it or `musicURL`;
|
|
445
|
+
group return powers are not modeled. Without a parcel fixture, land is unowned
|
|
446
|
+
with empty strings and zero land impact.
|
|
447
|
+
|
|
448
|
+
Each configured parcel has an `effects` log. Entries contain `function`, `args`,
|
|
449
|
+
`source` prim key, `owner`, virtual `time` in milliseconds, `accepted`, and any
|
|
450
|
+
immediate `result`. Both refused and accepted requests are recorded. Acceptance
|
|
451
|
+
means the fixture's permission and argument checks passed, not that an external
|
|
452
|
+
transaction completed. Requests without a parcel fixture have no persistent log.
|
|
453
|
+
|
|
454
|
+
`llSetParcelMusicURL` updates `musicURL` for the land owner; subsequent reads see
|
|
455
|
+
it. `llParcelMediaCommandList` updates shared `media` settings for owner calls,
|
|
456
|
+
and `llParcelMediaQuery` reads them with LSL types. Agent-targeted media commands
|
|
457
|
+
stay in the log without changing shared settings. Playback has no renderer.
|
|
458
|
+
Ban/pass list edits and ejections are recorded without simulating access or
|
|
459
|
+
moving avatars. Object returns are recorded without deleting objects or changing
|
|
460
|
+
fixture land-impact counts; accepted return requests report zero objects returned.
|
|
461
|
+
|
|
462
|
+
`llSetParcelForSale` requires owner-granted `PERMISSION_PRIVILEGED_LAND_ACCESS`
|
|
463
|
+
and stores validated options in `parcel.sale`. Set `inEscrow: true` on a parcel
|
|
464
|
+
fixture to refuse a sale. Region `estateManagers` lists the UUIDs allowed to
|
|
465
|
+
submit `llManageEstateAccess` requests. These requests do not model estate-wide
|
|
466
|
+
list propagation or throttling. `llTransferOwnership` records an offer to an
|
|
467
|
+
avatar fixture in the same region without changing ownership or inventory.
|
|
468
|
+
Attachment and object transfer/copy permissions are not modeled.
|
|
469
|
+
|
|
470
|
+
Both money functions require `PERMISSION_DEBIT` granted by the object owner.
|
|
471
|
+
They only record requests and never pay. `llGiveMoney` always returns zero;
|
|
472
|
+
missing debit permission also produces the measured debug error.
|
|
473
|
+
`llTransferLindenDollars` returns a request key and queues `transaction_result`
|
|
474
|
+
for missing debit or locally invalid arguments. Valid authorized requests remain
|
|
475
|
+
pending. Tests can supply their result with
|
|
476
|
+
`s.fire('transaction_result', { id, success, data })`.
|
|
477
|
+
|
|
478
|
+
Refusals, errors, return codes and forced delays were measured on Aditi in
|
|
479
|
+
SLua Tideland on 2026-11-01. Successful mutations and offers follow the wiki;
|
|
480
|
+
land/estate rights were unavailable, and actual parcel edits, returns, ejections,
|
|
481
|
+
payments and ownership transfers were prohibited. No debit permission was
|
|
482
|
+
requested in-world. Group return powers remain unimplemented.
|
|
483
|
+
|
|
243
484
|
### Implemented `ll*` functions
|
|
244
485
|
|
|
245
486
|
The real-impl set covers the most common use cases. Anything outside it
|
|
@@ -252,27 +493,66 @@ honored centrally in the dispatcher. Pass `stubs: 'warn'` or
|
|
|
252
493
|
|
|
253
494
|
* **chat**: `llSay`, `llShout`, `llWhisper`, `llOwnerSay`
|
|
254
495
|
* **listen**: `llListen`, `llListenRemove`, `llListenControl`
|
|
255
|
-
* **
|
|
256
|
-
* **
|
|
496
|
+
* **dialogs**: `llDialog`, `llTextBox` — answer them with `s.answerDialog`; the answer reaches listens within 20 m of the prim that showed it
|
|
497
|
+
* **time**: `llSetTimerEvent`, `llSleep` (other scripts keep running while one sleeps), `llGetTime`, `llGetAndResetTime`, `llResetTime`, `llGetUnixTime`, `llGetTimestamp`, `llGetDate`, `llGetGMTclock`, `llGetWallclock` (US Pacific time), `llGetTimeOfDay` (seconds into the region's day) (start at `startUnixTime` and move with the virtual clock), `llGetRegionTimeDilation` (always 1.0), `llMinEventDelay` (spaces out timer and touch events; one waiting click is kept and later clicks are dropped)
|
|
498
|
+
* **region**: `llGetRegionName`, `llGetRegionCorner`, `llGetRegionFlags`, `llGetRegionFPS`, `llGetRegionAgentCount`, `llGetSimStats`, `llGetEnv`, `llGetSimulatorHostname`, `llEdgeOfWorld`, `llScriptDanger`
|
|
499
|
+
* **parcel effects and payments**: `llSetParcelMusicURL`, the six land ban/pass list functions, `llEjectFromLand`, `llReturnObjectsByID`, `llReturnObjectsByOwner`, `llSetParcelForSale`, `llManageEstateAccess`, `llParcelMediaCommandList`, `llParcelMediaQuery`, `llGiveMoney`, `llTransferLindenDollars`, `llTransferOwnership`. See the fixture and record-only limits above.
|
|
500
|
+
* **parcels**: `llGetParcelDetails`, `llGetParcelFlags`, `llGetParcelMaxPrims`, `llGetParcelPrimCount`, `llGetParcelPrimOwners`, `llGetParcelMusicURL`, `llGetLandOwnerAt`, `llOverMyLand`
|
|
501
|
+
* **object reads**: `llKey2Name`, `llGetObjectDetails`, `llGetObjectLinkKey`, `llGetObjectPrimCount`, `llGetObjectMass`, `llGetBoundingBox`, `llGetGeometricCenter` (any prim in the caller's region; avatar keys still read like unknown keys in these object queries), `llGetObjectPermMask`
|
|
502
|
+
* **environment**: `llGetEnvironment` (region values configured by parameter number), `llSetEnvironment` and `llReplaceEnvironment` (permission refusal only), `llGetDayLength`, `llGetDayOffset`, `llGetRegionDayLength`, `llGetRegionDayOffset`, `llGetRegionTimeOfDay` (seconds into the region's day, moving with the virtual clock), `llGetSunRotation`, `llGetSunDirection`, `llGetMoonRotation`, `llGetMoonDirection` and their `llGetRegion*` forms
|
|
503
|
+
* **ground, water and wind**: `llModifyLand` and `llSetGroundTexture` (permission refusal only), `llGround` (interpolated between whole-metre heights), `llGroundNormal`, `llGroundSlope`, `llGroundContour`, `llWater` and `llWind`, read from the region's `ground`, `water` and `wind` settings
|
|
504
|
+
* **HTTP**: `llHTTPRequest`, `llHTTPResponse`, `llRequestURL`, `llRequestSecureURL`, `llReleaseURL`, `llGetFreeURLs` (20000 per region), `llGetHTTPHeader`, `llSetContentType` — send requests to a script's URL with `s.sendHttpRequest`; one it doesn't answer gets a 504 after 25 seconds
|
|
505
|
+
* **email**: `llEmail`, `llGetNextEmail`, `llTargetedEmail` (each send sleeps 20 seconds) — mail to `<key>@lsl.secondlife.com` reaches that prim's queue, which holds 101 mails; queue a test's mail with `s.deliverEmail`
|
|
506
|
+
* **pathfinding**: `llCreateCharacter`, `llUpdateCharacter`, `llDeleteCharacter`, `llEvade`, `llExecCharacterCmd`, `llFleeFrom`, `llNavigateTo`, `llPatrolPoints`, `llPursue`, `llWanderWithin`, `llGetClosestNavPoint`, `llGetStaticPath`. Inspect `s.character.options` for explicit requested configuration and `s.character.commands` for command history. The character belongs to the object and survives script resets. `s.pathUpdate(type)` sends an event with an empty reserved list to the root prim's scripts. Movement, capsule fitting, option clamping and navmesh baking are not simulated. Set fixed query answers with `s.setNavigationResults({ closestNavPoint: [point], staticPath: [start, end, 0] })`, or use `s.mock` for answers that depend on query arguments. Without fixtures, closest-point queries return `[]` and static-path queries return `[PU_FAILURE_INVALID_GOAL]`; an out-of-range static-path radius returns `[]`.
|
|
507
|
+
* **sound**: `llPlaySound`, `llLoopSound`, `llLoopSoundMaster`, `llLoopSoundSlave`, `llPlaySoundSlave`, `llTriggerSound`, `llTriggerSoundLimited`, `llStopSound`, `llPreloadSound`, `llAdjustSoundVolume`, `llSetSoundQueueing`, `llSetSoundRadius`, and the `llLinkPlaySound`, `llLinkStopSound`, `llLinkAdjustSoundVolume`, `llLinkSetSoundQueueing`, `llLinkSetSoundRadius` variants. Inspect `prims[i].sound` from `loadLinkset`: `current` holds the last attached request or `null` after stop, `queueing` and `radius` hold settings, and `triggers` and `preloads` record one-shot requests. Names resolve in the calling prim's sound inventory; UUIDs work without inventory. Volume records the documented 0–1 range, while radius records the requested value. Audio playback, duration, queue progression, synchronization and effective audibility limits are not simulated.
|
|
508
|
+
* **prim media**: `llSetPrimMediaParams`, `llGetPrimMediaParams`, `llClearPrimMedia`, `llSetLinkMedia`, `llGetLinkMedia`, and `llClearLinkMedia`. Inspect `prims[i].media`, a map from face number to values indexed by `PRIM_MEDIA_*` constants. Setters validate atomically and return simulator status codes. Getters return values in requested order; clearing removes the face entry. Permission masks and URL whitelists are stored and validated, but browser rendering and avatar interaction are not simulated. Media link calls select one prim, including the measured first-other-prim behavior of negative selectors other than `LINK_THIS`.
|
|
509
|
+
* **particles**: `llParticleSystem` and `llLinkParticleSystem`. Inspect `prims[i].particles` for the last accepted request, with its raw `rules` and resolved `texture` UUID. Empty lists and wrong value types clear it. Unknown rule ids, noninteger ids and trailing unpaired rules are silent. Texture names resolve in each target prim's inventory; missing names use the default particle texture. Numeric values retain their requested magnitude. Viewer clamping, quantization, particle motion and rendering are not simulated.
|
|
257
510
|
* **linked**: `llMessageLinked` (full `LINK_THIS` / `LINK_SET` / `LINK_ALL_OTHERS` / `LINK_ALL_CHILDREN` / `LINK_ROOT` / specific-link routing across the linkset, with correct `sender_num`)
|
|
258
511
|
* **link info**: `llGetLinkNumber`, `llGetNumberOfPrims`, `llGetLinkKey`, `llGetLinkName`
|
|
512
|
+
* **link changes**: `llCreateLink`, `llBreakLink`, `llBreakAllLinks` (need `PERMISSION_CHANGE_LINKS`; each raises `changed(CHANGED_LINK)` in the prims it touches; linked prims stay where they were, and the root keeps the linkset data)
|
|
513
|
+
* **object animations**: `llStartObjectAnimation`, `llStopObjectAnimation`, `llGetObjectAnimationNames` (each prim keeps its own list; animations play only when the linkset is loaded with `animesh: true`)
|
|
514
|
+
* **avatar names and info**: `llGetDisplayName`, `llGetUsername`, `llName2Key`, `llRequestUserKey`, `llGetAgentInfo`, `llGetAgentLanguage`, `llGetAgentList`, `llGetAgentSize`, `llGetVisualParams`, `llIsFriend`, `llSameGroup`. Configure avatars with `world.addAvatar` as described above.
|
|
259
515
|
* **dataserver**: `llRequestAgentData`, `llRequestInventoryData`, `llRequestSimulatorData`, `llRequestUsername`, `llRequestDisplayName`
|
|
260
|
-
* **
|
|
261
|
-
* **
|
|
516
|
+
* **combat**: `llDamage`, `llAdjustDamage`, `llSetDamage`, `llGetHealth`. Set `linkset.damageEnabled` for the object's parcel; it defaults to the region's damage flag. `s.setCombatAvatar(id, { health, damageEnabled, scripts })` supplies an avatar and its attachment scripts. Damage waits for all `on_damage` handlers, including sleepers, before applying avatar health changes and queuing `final_damage`. `on_death` notifies attachments when avatar health reaches zero. Object health stays under script control through `PRIM_HEALTH`. Set `linkset.damageThrottleExempt` for a parcel-owner or land-group source. Physics contacts, seated-avatar redistribution, regeneration and death teleports are not simulated.
|
|
517
|
+
* **rezzing**: `llRezObject`, `llRezAtRoot`, `llRezObjectWithParams`, `llDerezObject`, `llGetVel`, `llGetForce`. Supply inventory objects through a prim fixture's `objects` definitions and inspect rezzed linksets in `world.linksets`, as described above.
|
|
518
|
+
* **sensors**: `llSensor`, `llSensorRepeat`, `llSensorRemove` fire `sensor` / `no_sensor` with detected data. Sensors find other loaded linksets and targets placed with `world.addObject({ region, name, position, scripted, active, physical })` or `world.addAvatar({ region, key, name, username, position })`. Targets also accept `owner`, `group`, `rotation` and `velocity`; returned targets can be moved between scans. `world.sensorProperties.set(linkset, { group, velocity, active })` supplies these properties for loaded linksets. Without an activity override, a loaded script with a timer, active listener or sleeping handler counts as active. Scans use exact name/key filters, a strict radius capped at 96 m, and the nearest 32 results. Positive repeats use virtual time at the requested interval; simulator frame cadence and lag are not modeled. The measured Aditi simulator returned no matches for `DAMAGEABLE`, including targets with damage handlers and health 100, so this VM does the same. Attachment and seated-avatar sensor geometry are not simulated.
|
|
519
|
+
* **raycasts**: `llCastRay` queries loaded prims and `world.addObject` / `world.addAvatar` fixtures in the same region. Prims and avatars use oriented boxes; object fixtures accept `size` and `phantom`. Hits are nearest first, with the requested cap, rejection mask, phantom detection and data flags. Linked roots report link 0 and children their link number. Rays starting inside a box miss it; entry-face starts hit, and the endpoint is excluded. Terrain uses the region's bilinear `ground` grid. Supply a measured terrain index with `groundLinkNumber`, a number or `(x, y) => number`; its fixture default is 0. Actual prim/mesh shapes, avatar capsules, simulator load errors and raycast quotas are not simulated.
|
|
520
|
+
* **detected**: `llDetectedKey`/`Name`/`Owner`/`Group`/`Pos`/`Rot`/`Vel`/`Type`/`LinkNumber`/`Grab`/`TouchPos`/`TouchFace`/`TouchST`/`TouchUV`/`TouchNormal`/`TouchBinormal`/`Rezzer`/`Damage`
|
|
521
|
+
* **math**: `llAbs`, `llFabs`, `llRound` (banker's), `llCeil`, `llFloor`, `llPow`, `llSqrt`, `llSin`/`Cos`/`Tan`/`Asin`/`Acos`/`Atan2`, `llLog`/`Log10`, seeded `llFrand`, `llVecMag`/`Norm`/`Dist`, `llRot2Euler`/`Euler2Rot`, `llRot2Fwd`/`Left`/`Up`, `llRot2Axis`/`Angle`, `llAxisAngle2Rot`, `llRotBetween`, `llAngleBetween`, `llAxes2Rot`, `llLinear2sRGB`/`llsRGB2Linear`
|
|
262
522
|
* **string**: `llStringLength`, `llSubStringIndex`, `llGetSubString`, `llDeleteSubString`, `llInsertString`, `llStringTrim`, `llToLower`/`Upper`, `llReplaceSubString`, `llEscapeURL`/`UnescapeURL`
|
|
263
|
-
* **list**: `llGetListLength`, `llList2Integer`/`Float`/`String`/`Key`/`Vector`/`Rot`, `llList2List`, `llList2ListStrided`, `llList2ListSlice`, `llListRandomize` (seeded), `llDeleteSubList`, `llListInsertList`, `llListReplaceList`, `llListFindList`, `llListSort`, `llDumpList2String`, `llList2CSV`, `llCSV2List`, `llParseString2List`, `llParseStringKeepNulls`
|
|
523
|
+
* **list**: `llGetListLength`, `llList2Integer`/`Float`/`String`/`Key`/`Vector`/`Rot`, `llList2List`, `llList2ListStrided`, `llList2ListSlice`, `llListRandomize` (seeded), `llDeleteSubList`, `llListInsertList`, `llListReplaceList`, `llListFindList`, `llListSort`, `llListSortStrided`, `llDumpList2String`, `llList2CSV`, `llCSV2List`, `llParseString2List`, `llParseStringKeepNulls`
|
|
264
524
|
* **json**: `llJson2List`, `llJsonGetValue`, `llJsonSetValue`, `llJsonValueType`, `llList2Json` — full LSL JSON semantics including the FDDx-range type-tag sentinels (`JSON_OBJECT`/`ARRAY`/`NUMBER`/`STRING`/`NULL`/`TRUE`/`FALSE`/`INVALID`/`DELETE`), `JSON_APPEND`, the empty-value short-circuit (`{"k":,}` → `JSON_NULL`) on `Get`/`Type`, duplicate-key collapse on `Set`, force-fit auto-creation of nested objects/arrays through deep specifier paths, and the kept-as-is rule for nested JSON-shaped strings in `llList2Json`.
|
|
265
525
|
* **identity**: `llGetOwner`, `llGetOwnerKey`, `llGetCreator`, `llGetKey`, `llGetObjectName`, `llSetObjectName`, `llGetScriptName`, seeded `llGenerateKey`
|
|
266
526
|
* **hash**: `llMD5String`, `llSHA1String`, `llSHA256String`, `llHMAC`
|
|
527
|
+
* **RSA**: `llSignRSA`, `llVerifyRSA` (sha1, sha224, sha256, sha384 or sha512; RSA keys only)
|
|
267
528
|
* **base64**: `llStringToBase64`/`Base64ToString`, `llIntegerToBase64`/`Base64ToInteger`, `llXorBase64`
|
|
268
|
-
* **object**: `llSetText`, `llSetObjectDesc`, `llGetObjectDesc`, `llDie` (kills every script in the linkset), `llResetScript`
|
|
269
|
-
* **inventory**: `llGetInventoryNumber`/`Name`/`Type`/`Key`/`Creator`/`Desc`/`AcquireTime`/`PermMask` against the host prim's inventory; notecards via `llGetNotecardLine` / `llGetNumberOfNotecardLines` (correct EOF / NAK semantics, ISO 8601 UTC acquire-time strings); `llRemoveInventory` (a script that removes itself
|
|
529
|
+
* **object**: `llSetText`, `llSetObjectDesc`, `llGetObjectDesc`, `llSetTouchText`, `llSetSitText`, `llSetPayPrice` (stored on the prim for tests to read), `llDie` (kills every script in the linkset), `llResetScript`
|
|
530
|
+
* **inventory**: `llGetInventoryNumber`/`Name`/`Type`/`Key`/`Creator`/`Desc`/`AcquireTime`/`PermMask` against the host prim's inventory; notecards via `llGetNotecardLine` / `llGetNumberOfNotecardLines` (correct EOF / NAK semantics, ISO 8601 UTC acquire-time strings); regex search in notecards via `llFindNotecardTextSync` / `llFindNotecardTextCount`; `llRemoveInventory` (a script that removes itself halts at once)
|
|
531
|
+
* **giving inventory**: `llGiveInventory`, `llGiveInventoryList`, `llGiveAgentInventory`; inspect `s.inventoryOffers`. World prim recipients receive items and `changed`; `llAllowInventoryDrop` lets the root enable foreign-owner drops, excluding scripts. List variants omit missing/no-copy items. Avatar offers are recorded without simulating acceptance or throttles. Foreign permissions and no-copy moves follow the wiki and need a second avatar for in-world validation. Attachment inventory restrictions and automatic child/recent avatar presence are not modeled.
|
|
532
|
+
* **remote script loading**: `llRemoteLoadScriptPin` copies an executable inventory script into a same-owner prim with a matching nonzero PIN, including negative PINs. It replaces the same inventory name, discards saved state, starts running or stopped with the supplied start parameter, and sleeps three seconds. Existing receiver scripts get `CHANGED_INVENTORY`; the fresh copy starts with `state_entry`, without `on_rez`. Reset clears its start parameter. Missing/wrong-type names, mismatched PINs and self-loads report the measured errors. Unknown targets are silent. Cross-owner modification grants are unsupported and denied. No-copy sources are refused with a generic error; exact no-copy errors and foreign-owner permission behavior need a second owner for in-world measurement. Passive script assets without an executable `Script` instance cannot be loaded.
|
|
533
|
+
* **viewer requests**: `llLoadURL`, `llMapDestination`, `llMapBeacon`; inspect `s.viewerRequests`. Region presence reads World avatar fixtures, with the owner or current detected avatar as defaults; override it with `s.setAgentInRegion`. `llOpenFloater` records arguments and returns `-1`: the fixture cannot represent a Linden-owned privileged experience. Requests record viewer instructions; they do not open UI.
|
|
270
534
|
* **permissions**: `llRequestPermissions`, `llGetPermissions`, `llGetPermissionsKey` — answer requests with `s.grantPermissions` / `s.denyPermissions`
|
|
535
|
+
* **experiences**: `llGetExperienceDetails`, `llGetExperienceErrorMessage`, `llAgentInExperience`, `llRequestExperiencePermissions` (an agent who already accepted is granted at once; answer others with `s.grantExperiencePermissions` / `s.denyExperiencePermissions`), and the key-value store: `llCreateKeyValue`, `llReadKeyValue`, `llUpdateKeyValue`, `llDeleteKeyValue`, `llKeyCountKeyValue`, `llKeysKeyValue`, `llDataSizeKeyValue`, which answer through `dataserver` on every script in the prim with `1,<result>` or `0,<XP_ERROR_*>`. Without an experience they answer `0,5`. Seed or inspect the store with `experience.seed([['k', 'v']])` and `experience.store`; pass `allowedHere: false` for land that doesn't allow the experience.
|
|
536
|
+
* **game control**: `llGetGameControlMode`, `llGetGameControlModeAxes`, `llGetGameControlModeButtons`. Set an avatar's viewer-derived values with `s.setGameControl(agent, { mode, axes, buttons })`, then use `s.sendGameControl(agent, { buttons, axes })` to supply separate raw event input. Delivery requires `PERMISSION_GAME_CONTROL` from that agent. Each event retains its own semantic snapshot across sleeps and later fixture updates. Outside the event, queries return `-1`, `[]` and `0`. Axes are floats with the supplied mode-dependent length, including cursor pixel coordinates. Fixtures share state within a World and can be cleared with `s.setGameControl(agent, null)`. Controller mapping and automatic viewer mode changes are not simulated.
|
|
537
|
+
* **controls**: `llTakeControls`, `llReleaseControls` (also drops `PERMISSION_TAKE_CONTROLS`) — send input with `s.sendControl(level)` to fire `control`
|
|
538
|
+
* **attachments**: `llAttachToAvatar`, `llAttachToAvatarTemp`, `llDetachFromAvatar`, `llGetAttached`, `llGetAttachedList`, `llGetAttachedListFiltered`, `llWorldPosToHUD`. Attach calls require `PERMISSION_ATTACH`; detach requires an avatar permission key but does not require the ATTACH bit. `linkset.attachToAvatar(avatar, point, temporary)` supplies a viewer-worn fixture without granting script permissions; inspect `linkset.attachment` for avatar, point and temporary status. Detach removes the object from region queries, preserves normal attachment script state, and destroys temporary attachments after their final event. Sleeping detach handlers and recurring sensor/target work pause in inventory until fixture rewear. Lists return root keys in attachment order and hide HUDs unless the caller and HUD share an allowed, accepted experience. Set projection camera settings with `s.setCamera`. Bone transforms, avatar inventory persistence and viewer attachment limits are not simulated; other-region avatar fixtures represent child agents for list errors.
|
|
539
|
+
* **camera**: `llGetCameraPos`, `llGetCameraRot`, `llGetCameraFOV`, `llGetCameraAspect` require `PERMISSION_TRACK_CAMERA`. Supply viewer camera values with `s.setCamera`. `llSetCameraParams` and `llClearCameraParams` record rules in `s.cameraParams`. `llSetCameraEyeOffset`, `llSetCameraAtOffset`, `llSetLinkCamera` and `llForceMouselook` store settings on each prim as `cameraEyeOffset`, `cameraAtOffset` and `forceMouselook`, without runtime permissions. `World.sitAvatar` snapshots the offsets for subsequent camera position/rotation reads; later setting changes apply on the next sit. `llWorldPosToHUD` uses the same effective camera pose. Camera offsets follow the seated prim transform and survive script reset and inventory copies. Forcing mouselook sets `AGENT_MOUSELOOK` on the next sit; clearing the prim flag leaves the viewer mode alone. Negative link selectors other than `LINK_THIS` select the first other prim, matching the measured simulator behavior. Mouselook eye positions, viewer smoothing, camera collision and viewer distance limits are outside this model; `s.setCamera` supplies the fallback viewer pose. There is no camera-offset PRIM_* getter.
|
|
540
|
+
* **sitting and teleporting**: `llSitOnLink`, `llUnSit`, `llSetAgentRot`, `llTeleportAgent`, `llTeleportAgentGlobalCoords`, `llTeleportAgentHome`, plus the sit-target readers. Configure World avatar fixtures and inspect `s.teleportRequests` as described above.
|
|
541
|
+
|
|
542
|
+
* **avatar animations**: `llStartAnimation`, `llStopAnimation`, `llGetAnimation`, `llGetAnimationList`, `llGetAnimationOverride`, `llSetAnimationOverride`, `llResetAnimationOverride`. Start/stop require `PERMISSION_TRIGGER_ANIMATION`; set/reset overrides require `PERMISSION_OVERRIDE_ANIMATIONS`; reading overrides accepts either. Inventory animation names take priority over built-ins. Raw UUIDs work for stop only.
|
|
271
543
|
* **script memory**: `llGetUsedMemory`, `llGetFreeMemory`, `llGetMemoryLimit`, `llSetMemoryLimit`, `llScriptProfiler`, `llGetSPMaxMemory` — rough numbers, not Second Life's. rezless guesses at code, globals, locals and the call stack, and the guess can be far off: in one comparison, real scripts used 1.7 to 2.8 times more memory in-world than rezless reported. The `memoryLimit` crash uses the same guess. Don't rely on either to tell you whether a script fits in its memory limit; check that in-world.
|
|
272
|
-
* **script control**: `llResetOtherScript`, `llSetScriptState`, `llGetScriptState` — pausing parks events for replay on resume, and the timer cadence realigns on resume so paused scripts don't get a flood of catch-up timer events
|
|
544
|
+
* **script control**: `llGetStartParameter` (0 after a reset), `llGetStartString`, `llResetOtherScript`, `llSetScriptState`, `llGetScriptState` — pausing parks events for replay on resume, and the timer cadence realigns on resume so paused scripts don't get a flood of catch-up timer events
|
|
273
545
|
* **linkset data**: `llLinksetDataWrite`/`Read`/`Delete`/`WriteProtected`/`ReadProtected`/`DeleteProtected`/`DeleteFound`, `llLinksetDataReset`, `llLinksetDataAvailable`, `llLinksetDataCountKeys`/`CountFound`, `llLinksetDataListKeys`/`FindKeys` — fires the `linkset_data` event on every script in the linkset with `LINKSETDATA_UPDATE` / `DELETE` / `RESET` / `MULTIDELETE`. The store survives `llResetScript`. Inspect via `s.linksetData` (a `ReadonlyMap<string, { value, password }>`); pre-populate via `s.seedLinksetData([['k', { value: 'v' }]])`.
|
|
274
546
|
* **primitive params**: `llSetPrimitiveParams`, `llSetLinkPrimitiveParams`, `llSetLinkPrimitiveParamsFast`, `llGetPrimitiveParams`, `llGetLinkPrimitiveParams` — full `PRIM_*` rule surface (position / rotation / size / colour / alpha / texture / glow / fullbright / material / physics / flexible / point light / projector / sculpt / GLTF PBR / sit target / click action / text / name / desc / omega / damage / temp-on-rez / cast shadows / …). Honors `PRIM_LINK_TARGET` mid-rule redirects, `ALL_SIDES` expansion, multi-prim get concatenation, unknown-rule termination on get, and the 0.2 s delay on the slow link variant.
|
|
275
|
-
* **
|
|
547
|
+
* **targets**: `llTarget`, `llTargetRemove`, `llRotTarget`, `llRotTargetRemove`. Each script keeps eight position and eight rotation targets with a shared handle counter. Checks use the current root transform every 44.444 virtual milliseconds, including changes through link parameters. Thresholds are strict; state changes keep targets, resets clear them. Sleeping handlers keep one pending event per target. Simulator frame jitter and script execution throttling are not modeled.
|
|
548
|
+
* **collision settings**: `llCollisionFilter`, `llVolumeDetect`, `llCollisionSound`, `llAllowInventoryDrop`, `llSetRemoteScriptAccessPin`. Inspect `s.host.collisionFilter`, `volumeDetect`, `collisionSound`, `allowInventoryDrop`, and `remoteScriptAccessPin`. Tests raise collisions with `s.fire('collision_start', { num_detected: 1, detected: [{ key, name }] })`; filters apply to supplied detected entries, and volume detection suppresses continuous `collision` events. Volume detection updates the linkset's phantom read-back. No physics or overlap detection runs. Collision sounds record the requested sound and gain; audio playback, sound asset resolution and collision particles are not simulated. Inventory drops default to disabled and only a root script can enable them. Remote pins default to zero; setting one stores it and sleeps 0.2 seconds.
|
|
549
|
+
* **physics requests**: `llApplyImpulse`, `llApplyRotationalImpulse`, `llSetForce`, `llSetTorque`, `llSetForceAndTorque`, `llSetVelocity`, `llSetAngularVelocity`, `llPushObject`. Calls append `{ name, args }` to the caller's `prim.physics.requests`, preserving call order, vector magnitudes, target keys and local flags, even on nonphysical objects. They do not move objects or change read fixtures.
|
|
550
|
+
* **buoyancy and hover requests**: `llSetBuoyancy`, `llSetHoverHeight`, `llGroundRepel`, `llStopHover`. Calls append to the caller's `physics.requests`. Inspect `prim.buoyancy`, `prim.hover` and `prim.groundRepel` for the last requested values. A new request replaces that function's settings; `llStopHover` clears `hover` and leaves ground repel alone. Values retain the requested heights, tau and water argument, including negative and extreme inputs. These are capture records, preserved across script resets and copied independently into inventory snapshots. In Second Life, resetting the setter script cancels its effects; these records do not represent active simulator controllers. No buoyancy, hover or ground-repel motion runs.
|
|
551
|
+
* **vehicle requests**: `llSetVehicleType`, `llSetVehicleFlags`, `llRemoveVehicleFlags`, `llSetVehicleFloatParam`, `llSetVehicleVectorParam`, `llSetVehicleRotationParam`. Inspect `prim.vehicle.type`, `flags`, `params` by VEHICLE_* parameter ID, and the ordered `requests` history. Setting a type loads its full documented preset, including friction, motor directions and offset, all float parameters, reference frame and flags. Repeating a type replaces the settings. NONE clears the configuration. Undocumented type values are retained with an empty preset, and later parameter requests are still recorded. Flag calls add/remove bits. Float setters also accept linear/angular friction as a uniform vector; wrong parameter categories leave settings unchanged and emit the measured DEBUG_CHANNEL diagnostic when a vehicle type is set. Calls are recorded per caller even when nonphysical or disabled. Explicit parameter values retain requested magnitudes rather than simulator saturation. LSL has no vehicle parameter getter; exact preset values follow the Second Life wiki, including its unusual SLED hover efficiency 10; an in-world comparison differed from explicitly setting efficiency 1. Records survive resets and copy independently into inventory snapshots. No vehicle dynamics, energy use or active-controller lifecycle runs.
|
|
552
|
+
* **physics reads**: Set fields on the root's `physics` fixture to supply `llGetForce`, `llGetTorque`, `llGetVel`, `llGetAccel`, `llGetOmega`, `llGetMass`, `llGetMassMKS`, `llGetCenterOfMass` and `llGetEnergy`. Defaults describe a resting 0.5 m box: zero vectors, mass 1.25 lindograms, massMKS 125 kg, energy 1, center of mass at the current root region position. Null force and velocity fixtures preserve the existing rez-force and initial rez/sensor-velocity fallbacks. The mass fields are independent; Second Life normally returns kilograms at 100 times lindograms. Fixtures and request history survive script resets and copy with inventory snapshots. Supply force/torque read-back in the requested frame. Other shapes, linked physical centers, child-specific acceleration and energy depletion/recovery also need fixtures. No force integration, gravity, collision response, mass calculation, push-permission evaluation or energy simulation runs.
|
|
553
|
+
* **move and look targets**: `llMoveToTarget`, `llStopMoveToTarget`, `llLookAt`, `llRotLookAt`, `llStopLookAt`. `advanceTime` applies nominal exponential convergence to physical objects, using the requested tau or strength/damping. Coupled movement and positional look-at use a fixed simulation cadence, so timers and clock partitions do not change the result. Position changes feed `llTarget` events. Move requests wait while physics is off; both look functions snap immediately on nonphysical prims. Child llLookAt callers must compensate for root rotation, matching the simulator convention. Moves over the measured 64 m limit or with tau below .044444 seconds cancel the previous move. Physical look-at strength must be at least .044444; damping is capped at 1. The initiating script owns stop/reset control; sibling scripts can retarget it without taking ownership. Stops hold the current transform. State changes preserve requests; reset of the initiator clears them. Scripted inventory snapshots retain the region target on a fresh clock. Target data lives in `prims[0].targetMotion`. This kinematic model omits gravity, contacts, post-stop inertia, angular wobble, energy use and simulator frame drift; velocity/acceleration reads are not derived from it.
|
|
554
|
+
* **kinematic motion**: `llSetKeyframedMotion`, `llSetRegionPos`. Advance virtual time to interpolate translation and rotation through keyframes, with forward, loop, reverse and ping-pong playback, and play/pause/stop commands shared by the object's scripts. KFM requires a nonphysical linkset with a convex or no-physics prim. Region moves enforce coordinate and altitude limits, snap to the configured terrain, and have no forced delay. Simulator drift, selection pauses, region crossings, movement events, parcel-entry restrictions and attachment motion are not simulated. Invalid requests leave existing motion unchanged; diagnostic text is not synthesized.
|
|
555
|
+
* **prim accessors** (alternative single-rule shortcuts that read/write the same backing store): `llSetPos`/`llGetPos`/`llGetLocalPos`/`llGetRootPosition`, `llSetRot`/`llSetLocalRot`/`llGetRot`/`llGetLocalRot`/`llGetRootRotation`, `llSetScale`/`llGetScale`/`llScaleByFactor`/`llGetMaxScaleFactor`/`llGetMinScaleFactor`, `llGetLinkNumberOfSides`, `llSetColor`/`llGetColor`/`llSetAlpha`/`llGetAlpha`, `llSetTexture`/`llGetTexture`/`llGetTextureOffset`/`llGetTextureScale`/`llGetTextureRot`/`llScaleTexture`/`llOffsetTexture`/`llRotateTexture`, `llSetLinkColor`/`llSetLinkAlpha`/`llSetLinkTexture`, `llSetTextureAnim`/`llSetLinkTextureAnim`/`llSetLinkTextureAnimOverrideMe`, `llSetRenderMaterial`/`llGetRenderMaterial`/`llSetLinkRenderMaterial`/`llIsLinkGLTFMaterial`/`llSetLinkGLTFOverrides`, `llSetStatus`/`llGetStatus`/`llSetLinkStatus`, `llSetClickAction`, `llTargetOmega`, `llSetPhysicsMaterial`/`llGetPhysicsMaterial`, `llPassCollisions`/`llPassTouches`, `llSitTarget`/`llLinkSitTarget`/`llAvatarOnSitTarget`/`llAvatarOnLinkSitTarget`/`llSetLinkSitFlags`/`llGetLinkSitFlags`.
|
|
276
556
|
|
|
277
557
|
The full LSL constant surface (every `PRIM_*`, `STATUS_*`, `LINK_*`,
|
|
278
558
|
`INVENTORY_*`, `MASK_*`, `LINKSETDATA_*`, …) is re-exported from
|
|
@@ -339,6 +619,9 @@ CLI, or `{ includeFixtures: true }` to the reporter, to keep them.
|
|
|
339
619
|
|
|
340
620
|
* **hello** — minimal `state_entry { llSay(...) }` + matchers.
|
|
341
621
|
* **greeter** — touch + name greeting + state transition + reminder timer.
|
|
622
|
+
* **long-press** — a lamp that tells a short tap from a long press with `linkset.touch`'s `hold`.
|
|
623
|
+
* **keypad** — a door keypad that reads which key was clicked from `llDetectedTouchST`.
|
|
624
|
+
* **menu** — a lamp with a colour menu, answered with `s.answerDialog`.
|
|
342
625
|
* **remote** — owner-only listen on a custom channel + command dispatch.
|
|
343
626
|
* **fetcher** — `llHTTPRequest` + `http_response` + status handling.
|
|
344
627
|
* **nametag** — `llRequestAgentData` + `dataserver` + floating text.
|
package/dist/index.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ export * from '@rezless/vm';
|
|
|
3
3
|
export { loadScript } from './loadScript.js';
|
|
4
4
|
export type { LoadScriptInput, InlineScriptInput } from './loadScript.js';
|
|
5
5
|
export { loadLinkset } from './loadLinkset.js';
|
|
6
|
-
export type { LinksetInput, PrimInput, ScriptInput, ScriptSource, InlineSource, LoadedLinkset, } from './loadLinkset.js';
|
|
6
|
+
export type { LinksetInput, PrimInput, ObjectInput, ScriptInput, ScriptSource, InlineSource, LoadedLinkset, } from './loadLinkset.js';
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAEtB,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,YAAY,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,kBAAkB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAEtB,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,YAAY,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,kBAAkB,CAAA"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAEtB,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAEtB,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAW9C,2EAA2E;AAC3E,6EAA6E;AAC7E,2EAA2E;AAC3E,uDAAuD;AACvD,mEAAmE"}
|
package/dist/loadLinkset.d.ts
CHANGED
|
@@ -17,7 +17,10 @@ export interface PrimInput extends PrimOptions {
|
|
|
17
17
|
readonly scripts?: ReadonlyArray<ScriptInput>;
|
|
18
18
|
/** Non-script inventory items (notecards, textures, …). */
|
|
19
19
|
readonly inventory?: ReadonlyArray<InventoryItem>;
|
|
20
|
+
/** Named inventory objects, each described with the same prim/script fixture syntax. */
|
|
21
|
+
readonly objects?: Readonly<Record<string, ObjectInput>>;
|
|
20
22
|
}
|
|
23
|
+
export type ObjectInput = Omit<LinksetInput, 'world' | 'region' | 'owner' | 'startParameter' | 'startString'>;
|
|
21
24
|
export interface LinksetInput extends LinksetOptions {
|
|
22
25
|
readonly prims: ReadonlyArray<PrimInput>;
|
|
23
26
|
/** Region position of the root prim. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadLinkset.d.ts","sourceRoot":"","sources":["../src/loadLinkset.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,MAAM,EAEN,OAAO,EACP,IAAI,EACJ,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"loadLinkset.d.ts","sourceRoot":"","sources":["../src/loadLinkset.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,MAAM,EAEN,OAAO,EACP,IAAI,EACJ,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,MAAM,EAGZ,MAAM,aAAa,CAAA;AAIpB,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,YAAY,CAAA;AAEhD,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;IAChE,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,SAAU,SAAQ,WAAW;IAC5C,mCAAmC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;IAC7C,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;IACjD,wFAAwF;IACxF,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;CACzD;AAED,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,gBAAgB,GAAG,aAAa,CAAC,CAAA;AAE7G,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IACxC,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAA;IACnC,kDAAkD;IAClD,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACnD;AASD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAiE7E"}
|
package/dist/loadLinkset.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
2
|
import { parse, LslParseError } from '@rezless/parser';
|
|
3
|
-
import { Script, typecheck, Linkset, Prim, } from '@rezless/vm';
|
|
3
|
+
import { Script, typecheck, Linkset, Prim, makeInventoryItem, InventoryType, } from '@rezless/vm';
|
|
4
4
|
import { isCoverageEnabled } from './coverage-config.js';
|
|
5
5
|
import { registerScript } from './coverage-registry.js';
|
|
6
6
|
async function readScriptSource(src) {
|
|
@@ -26,6 +26,12 @@ export async function loadLinkset(input) {
|
|
|
26
26
|
linksetOpts.world = input.world;
|
|
27
27
|
if (input.region !== undefined)
|
|
28
28
|
linksetOpts.region = input.region;
|
|
29
|
+
if (input.startParameter !== undefined)
|
|
30
|
+
linksetOpts.startParameter = input.startParameter;
|
|
31
|
+
if (input.startString !== undefined)
|
|
32
|
+
linksetOpts.startString = input.startString;
|
|
33
|
+
if (input.animesh !== undefined)
|
|
34
|
+
linksetOpts.animesh = input.animesh;
|
|
29
35
|
const linkset = new Linkset(linksetOpts);
|
|
30
36
|
// Object.create(null) avoids prototype keys ('toString', 'constructor', …)
|
|
31
37
|
// false-positive-tripping the duplicate-name check below.
|
|
@@ -47,6 +53,13 @@ export async function loadLinkset(input) {
|
|
|
47
53
|
for (const item of primInput.inventory ?? []) {
|
|
48
54
|
prim.addInventory(item);
|
|
49
55
|
}
|
|
56
|
+
for (const [name, definition] of Object.entries(primInput.objects ?? {})) {
|
|
57
|
+
const object = (await loadLinkset(definition)).linkset;
|
|
58
|
+
if (!object.prims.length)
|
|
59
|
+
throw new Error(`loadLinkset: inventory object '${name}' has no prims`);
|
|
60
|
+
prim.addInventory(makeInventoryItem({ name, type: InventoryType.OBJECT,
|
|
61
|
+
key: object.prims[0].key, object }));
|
|
62
|
+
}
|
|
50
63
|
for (const sInput of primInput.scripts ?? []) {
|
|
51
64
|
const { source, filename } = await readScriptSource(sInput.source);
|
|
52
65
|
const { script: ast, diagnostics } = parse(source, filename);
|
package/dist/loadLinkset.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadLinkset.js","sourceRoot":"","sources":["../src/loadLinkset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EACL,MAAM,EACN,SAAS,EACT,OAAO,EACP,IAAI,
|
|
1
|
+
{"version":3,"file":"loadLinkset.js","sourceRoot":"","sources":["../src/loadLinkset.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rezless/vitest",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Vitest-style DSL for testing Linden Scripting Language (LSL) scripts.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "i-doll",
|
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
"access": "public"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@rezless/parser": "0.
|
|
56
|
-
"@rezless/vm": "0.
|
|
55
|
+
"@rezless/parser": "0.8.0",
|
|
56
|
+
"@rezless/vm": "0.8.0"
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
59
|
"vitest": "^5.0.5"
|