@rezless/vm 0.7.0 → 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/dist/builtins/agents.d.ts +14 -0
- package/dist/builtins/agents.d.ts.map +1 -0
- package/dist/builtins/agents.js +117 -0
- package/dist/builtins/agents.js.map +1 -0
- package/dist/builtins/animation.d.ts +46 -0
- package/dist/builtins/animation.d.ts.map +1 -0
- package/dist/builtins/animation.js +316 -0
- package/dist/builtins/animation.js.map +1 -0
- package/dist/builtins/attachments.d.ts +9 -0
- package/dist/builtins/attachments.d.ts.map +1 -0
- package/dist/builtins/attachments.js +127 -0
- package/dist/builtins/attachments.js.map +1 -0
- package/dist/builtins/base64.d.ts +8 -0
- package/dist/builtins/base64.d.ts.map +1 -1
- package/dist/builtins/base64.js +1 -1
- package/dist/builtins/base64.js.map +1 -1
- package/dist/builtins/camera.d.ts +35 -0
- package/dist/builtins/camera.d.ts.map +1 -0
- package/dist/builtins/camera.js +104 -0
- package/dist/builtins/camera.js.map +1 -0
- package/dist/builtins/collision.d.ts +21 -0
- package/dist/builtins/collision.d.ts.map +1 -0
- package/dist/builtins/collision.js +44 -0
- package/dist/builtins/collision.js.map +1 -0
- package/dist/builtins/controls.d.ts +19 -0
- package/dist/builtins/controls.d.ts.map +1 -0
- package/dist/builtins/controls.js +27 -0
- package/dist/builtins/controls.js.map +1 -0
- package/dist/builtins/damage.d.ts +24 -0
- package/dist/builtins/damage.d.ts.map +1 -0
- package/dist/builtins/damage.js +166 -0
- package/dist/builtins/damage.js.map +1 -0
- package/dist/builtins/detected.d.ts +22 -1
- package/dist/builtins/detected.d.ts.map +1 -1
- package/dist/builtins/detected.js +27 -1
- package/dist/builtins/detected.js.map +1 -1
- package/dist/builtins/dialog.d.ts +23 -0
- package/dist/builtins/dialog.d.ts.map +1 -0
- package/dist/builtins/dialog.js +69 -0
- package/dist/builtins/dialog.js.map +1 -0
- package/dist/builtins/email.d.ts +61 -0
- package/dist/builtins/email.d.ts.map +1 -0
- package/dist/builtins/email.js +121 -0
- package/dist/builtins/email.js.map +1 -0
- package/dist/builtins/environment.d.ts +27 -0
- package/dist/builtins/environment.d.ts.map +1 -0
- package/dist/builtins/environment.js +126 -0
- package/dist/builtins/environment.js.map +1 -0
- package/dist/builtins/experience.d.ts +51 -0
- package/dist/builtins/experience.d.ts.map +1 -0
- package/dist/builtins/experience.js +202 -0
- package/dist/builtins/experience.js.map +1 -0
- package/dist/builtins/game-control.d.ts +17 -0
- package/dist/builtins/game-control.d.ts.map +1 -0
- package/dist/builtins/game-control.js +21 -0
- package/dist/builtins/game-control.js.map +1 -0
- package/dist/builtins/give.d.ts +16 -0
- package/dist/builtins/give.d.ts.map +1 -0
- package/dist/builtins/give.js +137 -0
- package/dist/builtins/give.js.map +1 -0
- package/dist/builtins/ground.d.ts +18 -0
- package/dist/builtins/ground.d.ts.map +1 -0
- package/dist/builtins/ground.js +83 -0
- package/dist/builtins/ground.js.map +1 -0
- package/dist/builtins/http.d.ts +99 -4
- package/dist/builtins/http.d.ts.map +1 -1
- package/dist/builtins/http.js +216 -6
- package/dist/builtins/http.js.map +1 -1
- package/dist/builtins/index.d.ts.map +1 -1
- package/dist/builtins/index.js +235 -10
- package/dist/builtins/index.js.map +1 -1
- package/dist/builtins/inventory.d.ts +1 -0
- package/dist/builtins/inventory.d.ts.map +1 -1
- package/dist/builtins/inventory.js +1 -1
- package/dist/builtins/inventory.js.map +1 -1
- package/dist/builtins/land.d.ts +29 -0
- package/dist/builtins/land.d.ts.map +1 -0
- package/dist/builtins/land.js +339 -0
- package/dist/builtins/land.js.map +1 -0
- package/dist/builtins/links.d.ts +20 -0
- package/dist/builtins/links.d.ts.map +1 -0
- package/dist/builtins/links.js +53 -0
- package/dist/builtins/links.js.map +1 -0
- package/dist/builtins/linksetdata.d.ts +5 -0
- package/dist/builtins/linksetdata.d.ts.map +1 -1
- package/dist/builtins/linksetdata.js +16 -0
- package/dist/builtins/linksetdata.js.map +1 -1
- package/dist/builtins/lists.d.ts +6 -0
- package/dist/builtins/lists.d.ts.map +1 -1
- package/dist/builtins/lists.js +19 -6
- package/dist/builtins/lists.js.map +1 -1
- package/dist/builtins/math.d.ts +16 -0
- package/dist/builtins/math.d.ts.map +1 -1
- package/dist/builtins/math.js +74 -0
- package/dist/builtins/math.js.map +1 -1
- package/dist/builtins/media.d.ts +8 -0
- package/dist/builtins/media.d.ts.map +1 -0
- package/dist/builtins/media.js +167 -0
- package/dist/builtins/media.js.map +1 -0
- package/dist/builtins/motion.d.ts +79 -0
- package/dist/builtins/motion.d.ts.map +1 -0
- package/dist/builtins/motion.js +396 -0
- package/dist/builtins/motion.js.map +1 -0
- package/dist/builtins/notecard-search.d.ts +15 -0
- package/dist/builtins/notecard-search.d.ts.map +1 -0
- package/dist/builtins/notecard-search.js +374 -0
- package/dist/builtins/notecard-search.js.map +1 -0
- package/dist/builtins/object-animation.d.ts +21 -0
- package/dist/builtins/object-animation.d.ts.map +1 -0
- package/dist/builtins/object-animation.js +193 -0
- package/dist/builtins/object-animation.js.map +1 -0
- package/dist/builtins/object-reads.d.ts +39 -0
- package/dist/builtins/object-reads.d.ts.map +1 -0
- package/dist/builtins/object-reads.js +332 -0
- package/dist/builtins/object-reads.js.map +1 -0
- package/dist/builtins/object.d.ts +6 -0
- package/dist/builtins/object.d.ts.map +1 -1
- package/dist/builtins/object.js +19 -3
- package/dist/builtins/object.js.map +1 -1
- package/dist/builtins/particles.d.ts +4 -0
- package/dist/builtins/particles.d.ts.map +1 -0
- package/dist/builtins/particles.js +65 -0
- package/dist/builtins/particles.js.map +1 -0
- package/dist/builtins/pathfinding.d.ts +39 -0
- package/dist/builtins/pathfinding.d.ts.map +1 -0
- package/dist/builtins/pathfinding.js +83 -0
- package/dist/builtins/pathfinding.js.map +1 -0
- package/dist/builtins/permissions.d.ts.map +1 -1
- package/dist/builtins/permissions.js +6 -0
- package/dist/builtins/permissions.js.map +1 -1
- package/dist/builtins/physics.d.ts +49 -0
- package/dist/builtins/physics.d.ts.map +1 -0
- package/dist/builtins/physics.js +47 -0
- package/dist/builtins/physics.js.map +1 -0
- package/dist/builtins/prim-accessors.d.ts +3 -0
- package/dist/builtins/prim-accessors.d.ts.map +1 -1
- package/dist/builtins/prim-accessors.js +27 -7
- package/dist/builtins/prim-accessors.js.map +1 -1
- package/dist/builtins/raycast.d.ts +3 -0
- package/dist/builtins/raycast.d.ts.map +1 -0
- package/dist/builtins/raycast.js +65 -0
- package/dist/builtins/raycast.js.map +1 -0
- package/dist/builtins/region.d.ts +31 -0
- package/dist/builtins/region.d.ts.map +1 -0
- package/dist/builtins/region.js +125 -0
- package/dist/builtins/region.js.map +1 -0
- package/dist/builtins/remote-load.d.ts +3 -0
- package/dist/builtins/remote-load.d.ts.map +1 -0
- package/dist/builtins/remote-load.js +53 -0
- package/dist/builtins/remote-load.js.map +1 -0
- package/dist/builtins/rez.d.ts +10 -0
- package/dist/builtins/rez.d.ts.map +1 -0
- package/dist/builtins/rez.js +255 -0
- package/dist/builtins/rez.js.map +1 -0
- package/dist/builtins/rsa.d.ts +4 -0
- package/dist/builtins/rsa.d.ts.map +1 -0
- package/dist/builtins/rsa.js +44 -0
- package/dist/builtins/rsa.js.map +1 -0
- package/dist/builtins/script-control.d.ts +6 -2
- package/dist/builtins/script-control.d.ts.map +1 -1
- package/dist/builtins/script-control.js +9 -4
- package/dist/builtins/script-control.js.map +1 -1
- package/dist/builtins/sensor.d.ts +11 -0
- package/dist/builtins/sensor.d.ts.map +1 -0
- package/dist/builtins/sensor.js +145 -0
- package/dist/builtins/sensor.js.map +1 -0
- package/dist/builtins/sit.d.ts +23 -0
- package/dist/builtins/sit.d.ts.map +1 -0
- package/dist/builtins/sit.js +150 -0
- package/dist/builtins/sit.js.map +1 -0
- package/dist/builtins/sound.d.ts +19 -0
- package/dist/builtins/sound.d.ts.map +1 -0
- package/dist/builtins/sound.js +113 -0
- package/dist/builtins/sound.js.map +1 -0
- package/dist/builtins/targets.d.ts +12 -0
- package/dist/builtins/targets.d.ts.map +1 -0
- package/dist/builtins/targets.js +121 -0
- package/dist/builtins/targets.js.map +1 -0
- package/dist/builtins/time.d.ts +12 -0
- package/dist/builtins/time.d.ts.map +1 -1
- package/dist/builtins/time.js +32 -4
- package/dist/builtins/time.js.map +1 -1
- package/dist/builtins/vehicles.d.ts +22 -0
- package/dist/builtins/vehicles.d.ts.map +1 -0
- package/dist/builtins/vehicles.js +78 -0
- package/dist/builtins/vehicles.js.map +1 -0
- package/dist/builtins/viewer.d.ts +39 -0
- package/dist/builtins/viewer.d.ts.map +1 -0
- package/dist/builtins/viewer.js +74 -0
- package/dist/builtins/viewer.js.map +1 -0
- package/dist/clock.d.ts +29 -1
- package/dist/clock.d.ts.map +1 -1
- package/dist/clock.js +89 -5
- package/dist/clock.js.map +1 -1
- package/dist/experience.d.ts +39 -0
- package/dist/experience.d.ts.map +1 -0
- package/dist/experience.js +38 -0
- package/dist/experience.js.map +1 -0
- package/dist/index.d.ts +20 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interpreter.d.ts +0 -1
- package/dist/interpreter.d.ts.map +1 -1
- package/dist/interpreter.js.map +1 -1
- package/dist/inventory.d.ts +2 -0
- package/dist/inventory.d.ts.map +1 -1
- package/dist/inventory.js +2 -0
- package/dist/inventory.js.map +1 -1
- package/dist/linkset.d.ts +139 -11
- package/dist/linkset.d.ts.map +1 -1
- package/dist/linkset.js +376 -24
- package/dist/linkset.js.map +1 -1
- package/dist/prim-params.d.ts.map +1 -1
- package/dist/prim-params.js +11 -3
- package/dist/prim-params.js.map +1 -1
- package/dist/prim.d.ts +94 -4
- package/dist/prim.d.ts.map +1 -1
- package/dist/prim.js +94 -5
- package/dist/prim.js.map +1 -1
- package/dist/runtime.d.ts +41 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/script.d.ts +147 -2
- package/dist/script.d.ts.map +1 -1
- package/dist/script.js +373 -19
- package/dist/script.js.map +1 -1
- package/dist/values/ops.d.ts +3 -0
- package/dist/values/ops.d.ts.map +1 -1
- package/dist/values/ops.js +2 -2
- package/dist/values/ops.js.map +1 -1
- package/dist/world.d.ts +247 -1
- package/dist/world.d.ts.map +1 -1
- package/dist/world.js +318 -6
- package/dist/world.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { rot, toFloat32, toFloat32Value, vec } from '../values/types.js';
|
|
2
|
+
import { rotateVector } from '../values/ops.js';
|
|
3
|
+
import { typedList, listElementType } from '../values/list-types.js';
|
|
4
|
+
import { ENV_NO_PERMISSIONS } from '../generated/constants.js';
|
|
5
|
+
// Measured in SLua Tombolo and SLua Tideland on Aditi (2026-10-31).
|
|
6
|
+
const DEFAULT_DAY_LENGTH = 14_400;
|
|
7
|
+
const DEFAULT_DAY_OFFSET = 57_600;
|
|
8
|
+
function settings(ctx) {
|
|
9
|
+
const { world, region } = ctx.linkset;
|
|
10
|
+
return world ? world.region(region) : {};
|
|
11
|
+
}
|
|
12
|
+
// The sun and moon in SLua Tombolo at llGetRegionTimeOfDay 2290.531 (Aditi,
|
|
13
|
+
// 2026-10-31). Real regions put them wherever their environment says.
|
|
14
|
+
const DEFAULT_SUN = rot(0, -0.04711, 0, 0.99889);
|
|
15
|
+
const DEFAULT_MOON = rot(0, 0.99889, 0, 0.04711);
|
|
16
|
+
const dayLength = (r) => r.dayLength ?? DEFAULT_DAY_LENGTH;
|
|
17
|
+
const dayOffset = (r) => r.dayOffset ?? DEFAULT_DAY_OFFSET;
|
|
18
|
+
/** llGetRegionDayLength() */
|
|
19
|
+
export const llGetRegionDayLength = (ctx) => dayLength(settings(ctx));
|
|
20
|
+
/** llGetRegionDayOffset() */
|
|
21
|
+
export const llGetRegionDayOffset = (ctx) => dayOffset(settings(ctx));
|
|
22
|
+
/** llGetRegionTimeOfDay() — seconds into the region's day cycle: Unix time plus the offset, modulo the length. */
|
|
23
|
+
export const llGetRegionTimeOfDay = (ctx) => toFloat32(secondsIntoDay(ctx, settings(ctx)));
|
|
24
|
+
function secondsIntoDay(ctx, r) {
|
|
25
|
+
const micros = ctx.linkset.clock.unixMicros() + dayOffset(r) * 1e6;
|
|
26
|
+
return (micros % (dayLength(r) * 1e6)) / 1e6;
|
|
27
|
+
}
|
|
28
|
+
function skyRotation(ctx, pick, fallback) {
|
|
29
|
+
const r = settings(ctx);
|
|
30
|
+
const set = pick(r) ?? fallback;
|
|
31
|
+
const q = typeof set === 'function' ? set(secondsIntoDay(ctx, r) / dayLength(r)) : set;
|
|
32
|
+
return rot(q.x, q.y, q.z, q.s);
|
|
33
|
+
}
|
|
34
|
+
const sun = (ctx) => skyRotation(ctx, (r) => r.sunRotation, DEFAULT_SUN);
|
|
35
|
+
const moon = (ctx) => skyRotation(ctx, (r) => r.moonRotation, DEFAULT_MOON);
|
|
36
|
+
const X_AXIS = vec(1, 0, 0);
|
|
37
|
+
/** llGetRegionSunRotation() */
|
|
38
|
+
export const llGetRegionSunRotation = (ctx) => sun(ctx);
|
|
39
|
+
/** llGetRegionSunDirection() — the sun's rotation applied to <1, 0, 0>. */
|
|
40
|
+
export const llGetRegionSunDirection = (ctx) => rotateVector(X_AXIS, sun(ctx));
|
|
41
|
+
/** llGetRegionMoonRotation() */
|
|
42
|
+
export const llGetRegionMoonRotation = (ctx) => moon(ctx);
|
|
43
|
+
/** llGetRegionMoonDirection() — the moon's rotation applied to <1, 0, 0>. */
|
|
44
|
+
export const llGetRegionMoonDirection = (ctx) => rotateVector(X_AXIS, moon(ctx));
|
|
45
|
+
// Parcels have no environment of their own here, so the parcel reads give the region's.
|
|
46
|
+
export const llGetDayLength = llGetRegionDayLength;
|
|
47
|
+
export const llGetDayOffset = llGetRegionDayOffset;
|
|
48
|
+
export const llGetTimeOfDay = llGetRegionTimeOfDay;
|
|
49
|
+
export const llGetSunRotation = llGetRegionSunRotation;
|
|
50
|
+
export const llGetSunDirection = llGetRegionSunDirection;
|
|
51
|
+
export const llGetMoonRotation = llGetRegionMoonRotation;
|
|
52
|
+
export const llGetMoonDirection = llGetRegionMoonDirection;
|
|
53
|
+
// One SLua Tideland snapshot, Aditi, 2026-10-31. Lighting and cloud values
|
|
54
|
+
// change in a real day cycle; these defaults are held fixed like the sky
|
|
55
|
+
// rotations above. Tests may supply another snapshot in region.environment.
|
|
56
|
+
const ENVIRONMENT_DEFAULTS = {
|
|
57
|
+
0: [vec(0.343241, 0.295929, 0.295929)],
|
|
58
|
+
1: [1, 1, 1],
|
|
59
|
+
2: [vec(0.285051, 0.285051, 0.285051), 0.27, 0.42, 0,
|
|
60
|
+
vec(0.403484, 0.011, 0), vec(1, 0.526097, 0.918443), vec(1, 0.526097, 0.125), 1],
|
|
61
|
+
4: [0.96, 15000, 896.475098],
|
|
62
|
+
5: [1],
|
|
63
|
+
6: [1.75, 0.096],
|
|
64
|
+
8: [vec(-0.955281, 0, 0.295699), vec(1.500222, 1.264277, 1.137315), vec(1, 0.878872, 0.878751)],
|
|
65
|
+
9: [DEFAULT_MOON, 1, 0.5, 1, vec(0, 0, 0), vec(0.008247, 0.008247, 0.014992), vec(0.000445, 0.000340, 0.000679)],
|
|
66
|
+
10: [6360, 6360, 6420],
|
|
67
|
+
11: [0, 800, 0],
|
|
68
|
+
13: [0],
|
|
69
|
+
14: [DEFAULT_SUN, 1, vec(0.726739, 0.731679, 0.744028), 1, vec(0, 0, 0), vec(1, 0.878196, 0.878074), vec(1, 0.768759, 0.513451)],
|
|
70
|
+
15: [1000, 2000, 3000],
|
|
71
|
+
22: [vec(0.086688, 0.206889, 0.394344), vec(0.108678, 0.146621, 0.180150)],
|
|
72
|
+
23: [0.07, 0.168485, 0.380810, 0.943436],
|
|
73
|
+
24: [0],
|
|
74
|
+
100: [0.04],
|
|
75
|
+
101: [vec(0.015686, 0.149020, 0.250980), 16, 0.25],
|
|
76
|
+
102: [0.5, 0.4],
|
|
77
|
+
103: [1, 0],
|
|
78
|
+
104: [vec(2, 2, 2)],
|
|
79
|
+
105: [0.03, 0.2],
|
|
80
|
+
106: [vec(1.05, -0.42, 0), vec(1.11, -1.16, 0)],
|
|
81
|
+
};
|
|
82
|
+
const ENVIRONMENT_TYPES = {
|
|
83
|
+
0: ['vector'], 1: ['integer', 'integer', 'integer'],
|
|
84
|
+
2: ['vector', 'float', 'float', 'float', 'vector', 'vector', 'vector', 'integer'],
|
|
85
|
+
4: ['float', 'float', 'float'], 5: ['float'], 6: ['float', 'float'],
|
|
86
|
+
8: ['vector', 'vector', 'vector'],
|
|
87
|
+
9: ['rotation', 'float', 'float', 'integer', 'vector', 'vector', 'vector'],
|
|
88
|
+
10: ['float', 'float', 'float'], 11: ['float', 'float', 'float'], 13: ['float'],
|
|
89
|
+
14: ['rotation', 'float', 'vector', 'integer', 'vector', 'vector', 'vector'],
|
|
90
|
+
15: ['float', 'float', 'float'], 22: ['vector', 'vector'],
|
|
91
|
+
23: ['float', 'float', 'float', 'float'], 24: ['float'],
|
|
92
|
+
100: ['float'], 101: ['vector', 'float', 'float'], 102: ['float', 'float'],
|
|
93
|
+
103: ['integer', 'integer'], 104: ['vector'], 105: ['float', 'float'],
|
|
94
|
+
106: ['vector', 'vector'], 200: ['integer', 'integer', 'float'],
|
|
95
|
+
};
|
|
96
|
+
/** llGetEnvironment(vector pos, list params). Parcels share the region environment. */
|
|
97
|
+
export const llGetEnvironment = (ctx, args) => {
|
|
98
|
+
const requested = args[1];
|
|
99
|
+
// A bad rule invalidates the entire request, including earlier valid rules.
|
|
100
|
+
// Measured float and string IDs are rejected rather than coerced.
|
|
101
|
+
if (requested.some((rule, i) => typeof rule !== 'number' ||
|
|
102
|
+
(listElementType(requested, i) ?? 'integer') !== 'integer' || !Object.hasOwn(ENVIRONMENT_TYPES, rule)))
|
|
103
|
+
return [];
|
|
104
|
+
const region = settings(ctx);
|
|
105
|
+
const values = [];
|
|
106
|
+
const types = [];
|
|
107
|
+
for (const rule of requested) {
|
|
108
|
+
let tuple = [...(region.environment?.[rule] ?? ENVIRONMENT_DEFAULTS[rule] ?? [])];
|
|
109
|
+
if (rule === 200)
|
|
110
|
+
tuple = [dayLength(region), dayOffset(region), secondsIntoDay(ctx, region)];
|
|
111
|
+
if (rule === 9 || rule === 14) {
|
|
112
|
+
const rotation = rule === 9 ? moon(ctx) : sun(ctx);
|
|
113
|
+
tuple[0] = rotation;
|
|
114
|
+
tuple[4] = rotateVector(X_AXIS, rotation);
|
|
115
|
+
}
|
|
116
|
+
const tupleTypes = ENVIRONMENT_TYPES[rule];
|
|
117
|
+
values.push(...tuple.map((value, i) => toFloat32Value(value, tupleTypes[i])));
|
|
118
|
+
types.push(...tupleTypes);
|
|
119
|
+
}
|
|
120
|
+
return typedList(values, types);
|
|
121
|
+
};
|
|
122
|
+
// Land ownership, parcel environments and estate permissions are not modelled
|
|
123
|
+
// yet. These are the measured refusal paths, not successful environment edits.
|
|
124
|
+
export const llSetEnvironment = () => ENV_NO_PERMISSIONS;
|
|
125
|
+
export const llReplaceEnvironment = () => ENV_NO_PERMISSIONS;
|
|
126
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/builtins/environment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { BuiltinImpl, ScriptState } from '../runtime.js';
|
|
2
|
+
/** A llRequestExperiencePermissions call waiting for the test to answer it. */
|
|
3
|
+
export interface ExperienceRequestEntry {
|
|
4
|
+
readonly agent: string;
|
|
5
|
+
answered: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function experienceErrorMessage(error: number): string;
|
|
8
|
+
/** llGetExperienceErrorMessage(integer error) — the text for an XP_ERROR_* code. */
|
|
9
|
+
export declare const llGetExperienceErrorMessage: BuiltinImpl;
|
|
10
|
+
/**
|
|
11
|
+
* llGetExperienceDetails(key experience_id) — [name, owner, id, state,
|
|
12
|
+
* state message, group] for the script's own experience (NULL_KEY or its
|
|
13
|
+
* key); an empty list for any other key or a script without one.
|
|
14
|
+
*/
|
|
15
|
+
export declare const llGetExperienceDetails: BuiltinImpl;
|
|
16
|
+
/** llAgentInExperience(key agent) — TRUE once the agent accepted the experience, where the land allows it. */
|
|
17
|
+
export declare const llAgentInExperience: BuiltinImpl;
|
|
18
|
+
/** Grant the experience permissions for `agent` and schedule `experience_permissions`. */
|
|
19
|
+
export declare function grantExperience(state: ScriptState, agent: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* llRequestExperiencePermissions(key agent, string name) — an agent who
|
|
22
|
+
* already accepted is granted at once; otherwise the request waits for
|
|
23
|
+
* Script.grantExperiencePermissions or Script.denyExperiencePermissions.
|
|
24
|
+
* Without an experience, or where the land doesn't allow it, the request
|
|
25
|
+
* is denied with XP_ERROR_NO_EXPERIENCE or XP_ERROR_NOT_PERMITTED_LAND.
|
|
26
|
+
*/
|
|
27
|
+
export declare const llRequestExperiencePermissions: BuiltinImpl;
|
|
28
|
+
/** llCreateKeyValue(string k, string v) — adds a key that doesn't exist yet. */
|
|
29
|
+
export declare const llCreateKeyValue: BuiltinImpl;
|
|
30
|
+
/** llReadKeyValue(string k) — the stored value. */
|
|
31
|
+
export declare const llReadKeyValue: BuiltinImpl;
|
|
32
|
+
/**
|
|
33
|
+
* llUpdateKeyValue(string k, string v, integer checked, string original_value)
|
|
34
|
+
* — sets the key, creating it unless `checked`; a checked update needs the
|
|
35
|
+
* key to hold `original_value`.
|
|
36
|
+
*/
|
|
37
|
+
export declare const llUpdateKeyValue: BuiltinImpl;
|
|
38
|
+
/** llDeleteKeyValue(string k) — removes the key; answers "1,delete". */
|
|
39
|
+
export declare const llDeleteKeyValue: BuiltinImpl;
|
|
40
|
+
/** llKeyCountKeyValue() — the number of keys in the store. */
|
|
41
|
+
export declare const llKeyCountKeyValue: BuiltinImpl;
|
|
42
|
+
/**
|
|
43
|
+
* llKeysKeyValue(integer first, integer count) — `count` keys from index
|
|
44
|
+
* `first` in the order they were added, comma-separated; a count of 0
|
|
45
|
+
* lists every key from `first`. The listing stops before the first key that
|
|
46
|
+
* would take the answer past 4097 UTF-8 bytes.
|
|
47
|
+
*/
|
|
48
|
+
export declare const llKeysKeyValue: BuiltinImpl;
|
|
49
|
+
/** llDataSizeKeyValue() — "used,quota" in bytes. */
|
|
50
|
+
export declare const llDataSizeKeyValue: BuiltinImpl;
|
|
51
|
+
//# sourceMappingURL=experience.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"experience.d.ts","sourceRoot":"","sources":["../../src/builtins/experience.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,WAAW,EAAE,MAAM,eAAe,CAAA;AAsB1E,+EAA+E;AAC/E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAwBD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D;AAQD,oFAAoF;AACpF,eAAO,MAAM,2BAA2B,EAAE,WACoB,CAAA;AAE9D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,WASpC,CAAA;AAED,8GAA8G;AAC9G,eAAO,MAAM,mBAAmB,EAAE,WAIjC,CAAA;AAUD,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAKvE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,8BAA8B,EAAE,WAa5C,CAAA;AAoCD,gFAAgF;AAChF,eAAO,MAAM,gBAAgB,EAAE,WAQ9B,CAAA;AAED,mDAAmD;AACnD,eAAO,MAAM,cAAc,EAAE,WAM5B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAW9B,CAAA;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAE,WAM9B,CAAA;AAED,8DAA8D;AAC9D,eAAO,MAAM,kBAAkB,EAAE,WAC+C,CAAA;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,WAiB5B,CAAA;AAED,oDAAoD;AACpD,eAAO,MAAM,kBAAkB,EAAE,WAC6D,CAAA"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { typedList } from '../values/list-types.js';
|
|
2
|
+
import { NULL_KEY } from '../values/types.js';
|
|
3
|
+
import { entrySize } from '../experience.js';
|
|
4
|
+
import { nextDataserverKey } from './dataserver.js';
|
|
5
|
+
import { XP_ERROR_INVALID_PARAMETERS, XP_ERROR_KEY_NOT_FOUND, XP_ERROR_NO_EXPERIENCE, XP_ERROR_NONE, XP_ERROR_NOT_PERMITTED_LAND, XP_ERROR_QUOTA_EXCEEDED, XP_ERROR_RETRY_UPDATE, XP_ERROR_STORAGE_EXCEPTION, PERMISSION_ATTACH, PERMISSION_CONTROL_CAMERA, PERMISSION_TAKE_CONTROLS, PERMISSION_TELEPORT, PERMISSION_TRACK_CAMERA, PERMISSION_TRIGGER_ANIMATION, } from '../generated/constants.js';
|
|
6
|
+
const ERROR_MESSAGES = [
|
|
7
|
+
'no error',
|
|
8
|
+
'exceeded throttle',
|
|
9
|
+
'experiences are disabled',
|
|
10
|
+
'invalid parameters',
|
|
11
|
+
'operation not permitted',
|
|
12
|
+
'script not associated with an experience',
|
|
13
|
+
'not found',
|
|
14
|
+
'invalid experience',
|
|
15
|
+
'experience is disabled',
|
|
16
|
+
'experience is suspended',
|
|
17
|
+
'unknown error',
|
|
18
|
+
'experience data quota exceeded',
|
|
19
|
+
'key-value store is disabled',
|
|
20
|
+
'key-value store communication failed',
|
|
21
|
+
"key doesn't exist",
|
|
22
|
+
'retry update',
|
|
23
|
+
'experience content rating too high',
|
|
24
|
+
'not allowed to run in current location',
|
|
25
|
+
'experience permissions request timed out',
|
|
26
|
+
];
|
|
27
|
+
export function experienceErrorMessage(error) {
|
|
28
|
+
return ERROR_MESSAGES[error] ?? 'unknown error id';
|
|
29
|
+
}
|
|
30
|
+
const MAX_KEY_BYTES = 1011;
|
|
31
|
+
const MAX_VALUE_BYTES = 4095;
|
|
32
|
+
const MAX_KEYS_RESPONSE_BYTES = 4097;
|
|
33
|
+
const bytes = (s) => Buffer.byteLength(s, 'utf8');
|
|
34
|
+
/** llGetExperienceErrorMessage(integer error) — the text for an XP_ERROR_* code. */
|
|
35
|
+
export const llGetExperienceErrorMessage = (_ctx, args) => experienceErrorMessage(args[0] ?? 0);
|
|
36
|
+
/**
|
|
37
|
+
* llGetExperienceDetails(key experience_id) — [name, owner, id, state,
|
|
38
|
+
* state message, group] for the script's own experience (NULL_KEY or its
|
|
39
|
+
* key); an empty list for any other key or a script without one.
|
|
40
|
+
*/
|
|
41
|
+
export const llGetExperienceDetails = (ctx, args) => {
|
|
42
|
+
const xp = ctx.state.experience;
|
|
43
|
+
const id = args[0] ?? NULL_KEY;
|
|
44
|
+
if (!xp || (id !== NULL_KEY && id !== '' && id !== xp.id))
|
|
45
|
+
return [];
|
|
46
|
+
const state = xp.allowedHere ? XP_ERROR_NONE : XP_ERROR_NOT_PERMITTED_LAND;
|
|
47
|
+
return typedList([xp.name, xp.owner, xp.id, state, experienceErrorMessage(state), xp.group], ['string', 'key', 'key', 'integer', 'string', 'key']);
|
|
48
|
+
};
|
|
49
|
+
/** llAgentInExperience(key agent) — TRUE once the agent accepted the experience, where the land allows it. */
|
|
50
|
+
export const llAgentInExperience = (ctx, args) => {
|
|
51
|
+
const xp = ctx.state.experience;
|
|
52
|
+
const agent = args[0] ?? NULL_KEY;
|
|
53
|
+
return xp && xp.allowedHere && xp.agents.has(agent) ? 1 : 0;
|
|
54
|
+
};
|
|
55
|
+
const EXPERIENCE_PERMISSIONS = PERMISSION_TAKE_CONTROLS |
|
|
56
|
+
PERMISSION_TRIGGER_ANIMATION |
|
|
57
|
+
PERMISSION_ATTACH |
|
|
58
|
+
PERMISSION_TRACK_CAMERA |
|
|
59
|
+
PERMISSION_CONTROL_CAMERA |
|
|
60
|
+
PERMISSION_TELEPORT;
|
|
61
|
+
/** Grant the experience permissions for `agent` and schedule `experience_permissions`. */
|
|
62
|
+
export function grantExperience(state, agent) {
|
|
63
|
+
state.experience.agents.add(agent);
|
|
64
|
+
state.permissions.granted = EXPERIENCE_PERMISSIONS;
|
|
65
|
+
state.permissions.agent = agent;
|
|
66
|
+
state.clock.schedule(state.clock.now, 'experience_permissions', { agent_id: agent });
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* llRequestExperiencePermissions(key agent, string name) — an agent who
|
|
70
|
+
* already accepted is granted at once; otherwise the request waits for
|
|
71
|
+
* Script.grantExperiencePermissions or Script.denyExperiencePermissions.
|
|
72
|
+
* Without an experience, or where the land doesn't allow it, the request
|
|
73
|
+
* is denied with XP_ERROR_NO_EXPERIENCE or XP_ERROR_NOT_PERMITTED_LAND.
|
|
74
|
+
*/
|
|
75
|
+
export const llRequestExperiencePermissions = (ctx, args) => {
|
|
76
|
+
const agent = args[0] ?? NULL_KEY;
|
|
77
|
+
const xp = ctx.state.experience;
|
|
78
|
+
const now = ctx.state.clock.now;
|
|
79
|
+
if (!xp || !xp.allowedHere) {
|
|
80
|
+
const reason = xp ? XP_ERROR_NOT_PERMITTED_LAND : XP_ERROR_NO_EXPERIENCE;
|
|
81
|
+
ctx.state.clock.schedule(now, 'experience_permissions_denied', { agent_id: agent, reason });
|
|
82
|
+
}
|
|
83
|
+
else if (xp.agents.has(agent)) {
|
|
84
|
+
grantExperience(ctx.state, agent);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
ctx.state.experienceRequests.push({ agent, answered: false });
|
|
88
|
+
}
|
|
89
|
+
return undefined;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Record a key-value request and schedule its dataserver answer, "1,…" on
|
|
93
|
+
* success or "0,<XP_ERROR_*>" on failure, for every script in the prim.
|
|
94
|
+
*/
|
|
95
|
+
function keyValueRequest(ctx, source, args, answer) {
|
|
96
|
+
const key = nextDataserverKey(ctx);
|
|
97
|
+
ctx.state.dataserverRequests.push({ key, source, args, fulfilled: true });
|
|
98
|
+
const xp = ctx.state.experience;
|
|
99
|
+
const result = xp ? answer(xp.store, xp.quota) : XP_ERROR_NO_EXPERIENCE;
|
|
100
|
+
const data = typeof result === 'number' ? `0,${result}` : `1,${result}`;
|
|
101
|
+
const payload = { queryid: key, data };
|
|
102
|
+
for (const s of ctx.prim.scripts)
|
|
103
|
+
ctx.state.clock.scheduleOn(s, ctx.state.clock.now, 'dataserver', payload);
|
|
104
|
+
return key;
|
|
105
|
+
}
|
|
106
|
+
function used(store) {
|
|
107
|
+
let total = 0;
|
|
108
|
+
for (const [k, v] of store)
|
|
109
|
+
total += entrySize(k, v);
|
|
110
|
+
return total;
|
|
111
|
+
}
|
|
112
|
+
function write(store, quota, k, v) {
|
|
113
|
+
const old = store.get(k);
|
|
114
|
+
const grow = entrySize(k, v) - (old === undefined ? 0 : entrySize(k, old));
|
|
115
|
+
if (used(store) + grow > quota)
|
|
116
|
+
return XP_ERROR_QUOTA_EXCEEDED;
|
|
117
|
+
store.set(k, v);
|
|
118
|
+
return v;
|
|
119
|
+
}
|
|
120
|
+
/** llCreateKeyValue(string k, string v) — adds a key that doesn't exist yet. */
|
|
121
|
+
export const llCreateKeyValue = (ctx, args) => {
|
|
122
|
+
const k = args[0] ?? '';
|
|
123
|
+
const v = args[1] ?? '';
|
|
124
|
+
return keyValueRequest(ctx, 'create_key_value', [k, v], (store, quota) => {
|
|
125
|
+
if (k === '' || bytes(v) > MAX_VALUE_BYTES)
|
|
126
|
+
return XP_ERROR_INVALID_PARAMETERS;
|
|
127
|
+
if (bytes(k) > MAX_KEY_BYTES || store.has(k))
|
|
128
|
+
return XP_ERROR_STORAGE_EXCEPTION;
|
|
129
|
+
return write(store, quota, k, v);
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
/** llReadKeyValue(string k) — the stored value. */
|
|
133
|
+
export const llReadKeyValue = (ctx, args) => {
|
|
134
|
+
const k = args[0] ?? '';
|
|
135
|
+
return keyValueRequest(ctx, 'read_key_value', [k], (store) => {
|
|
136
|
+
if (k === '')
|
|
137
|
+
return XP_ERROR_INVALID_PARAMETERS;
|
|
138
|
+
return store.get(k) ?? XP_ERROR_KEY_NOT_FOUND;
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
/**
|
|
142
|
+
* llUpdateKeyValue(string k, string v, integer checked, string original_value)
|
|
143
|
+
* — sets the key, creating it unless `checked`; a checked update needs the
|
|
144
|
+
* key to hold `original_value`.
|
|
145
|
+
*/
|
|
146
|
+
export const llUpdateKeyValue = (ctx, args) => {
|
|
147
|
+
const k = args[0] ?? '';
|
|
148
|
+
const v = args[1] ?? '';
|
|
149
|
+
const checked = (args[2] ?? 0) !== 0;
|
|
150
|
+
const original = args[3] ?? '';
|
|
151
|
+
return keyValueRequest(ctx, 'update_key_value', [k, v, checked ? 1 : 0, original], (store, quota) => {
|
|
152
|
+
if (k === '' || bytes(v) > MAX_VALUE_BYTES)
|
|
153
|
+
return XP_ERROR_INVALID_PARAMETERS;
|
|
154
|
+
if (checked && store.get(k) !== original)
|
|
155
|
+
return XP_ERROR_RETRY_UPDATE;
|
|
156
|
+
if (bytes(k) > MAX_KEY_BYTES)
|
|
157
|
+
return XP_ERROR_STORAGE_EXCEPTION;
|
|
158
|
+
return write(store, quota, k, v);
|
|
159
|
+
});
|
|
160
|
+
};
|
|
161
|
+
/** llDeleteKeyValue(string k) — removes the key; answers "1,delete". */
|
|
162
|
+
export const llDeleteKeyValue = (ctx, args) => {
|
|
163
|
+
const k = args[0] ?? '';
|
|
164
|
+
return keyValueRequest(ctx, 'delete_key_value', [k], (store) => {
|
|
165
|
+
if (k === '')
|
|
166
|
+
return XP_ERROR_INVALID_PARAMETERS;
|
|
167
|
+
return store.delete(k) ? 'delete' : XP_ERROR_STORAGE_EXCEPTION;
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
/** llKeyCountKeyValue() — the number of keys in the store. */
|
|
171
|
+
export const llKeyCountKeyValue = (ctx) => keyValueRequest(ctx, 'key_count_key_value', [], (store) => String(store.size));
|
|
172
|
+
/**
|
|
173
|
+
* llKeysKeyValue(integer first, integer count) — `count` keys from index
|
|
174
|
+
* `first` in the order they were added, comma-separated; a count of 0
|
|
175
|
+
* lists every key from `first`. The listing stops before the first key that
|
|
176
|
+
* would take the answer past 4097 UTF-8 bytes.
|
|
177
|
+
*/
|
|
178
|
+
export const llKeysKeyValue = (ctx, args) => {
|
|
179
|
+
const first = args[0] ?? 0;
|
|
180
|
+
const count = args[1] ?? 0;
|
|
181
|
+
return keyValueRequest(ctx, 'keys_key_value', [first, count], (store) => {
|
|
182
|
+
if (count < 0)
|
|
183
|
+
return XP_ERROR_KEY_NOT_FOUND;
|
|
184
|
+
if (first < 0)
|
|
185
|
+
return '';
|
|
186
|
+
const keys = [...store.keys()];
|
|
187
|
+
if (first >= keys.length)
|
|
188
|
+
return XP_ERROR_KEY_NOT_FOUND;
|
|
189
|
+
const listed = [];
|
|
190
|
+
let size = 1;
|
|
191
|
+
for (const k of keys.slice(first, count === 0 ? undefined : first + count)) {
|
|
192
|
+
size += 1 + bytes(k);
|
|
193
|
+
if (size > MAX_KEYS_RESPONSE_BYTES)
|
|
194
|
+
break;
|
|
195
|
+
listed.push(k);
|
|
196
|
+
}
|
|
197
|
+
return listed.join(',');
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
/** llDataSizeKeyValue() — "used,quota" in bytes. */
|
|
201
|
+
export const llDataSizeKeyValue = (ctx) => keyValueRequest(ctx, 'data_size_key_value', [], (store, quota) => `${used(store)},${quota}`);
|
|
202
|
+
//# sourceMappingURL=experience.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"experience.js","sourceRoot":"","sources":["../../src/builtins/experience.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { BuiltinImpl } from '../runtime.js';
|
|
2
|
+
import type { Linkset } from '../linkset.js';
|
|
3
|
+
/** Viewer-derived semantic input. Axes retain their mode-dependent shape. */
|
|
4
|
+
export interface GameControlState {
|
|
5
|
+
readonly mode: number;
|
|
6
|
+
readonly axes: readonly number[];
|
|
7
|
+
readonly buttons: number;
|
|
8
|
+
}
|
|
9
|
+
export interface GameControlSnapshot extends GameControlState {
|
|
10
|
+
readonly agent: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function gameControlAvatars(linkset: Linkset): Map<string, GameControlState>;
|
|
13
|
+
export declare function copyGameControl(state: GameControlState): GameControlState;
|
|
14
|
+
export declare const llGetGameControlMode: BuiltinImpl;
|
|
15
|
+
export declare const llGetGameControlModeButtons: BuiltinImpl;
|
|
16
|
+
export declare const llGetGameControlModeAxes: BuiltinImpl;
|
|
17
|
+
//# sourceMappingURL=game-control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game-control.d.ts","sourceRoot":"","sources":["../../src/builtins/game-control.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAA;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAG5C,6EAA6E;AAC7E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAID,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAKlF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAEzE;AAOD,eAAO,MAAM,oBAAoB,EAAE,WACW,CAAA;AAC9C,eAAO,MAAM,2BAA2B,EAAE,WACM,CAAA;AAChD,eAAO,MAAM,wBAAwB,EAAE,WACoC,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { uniformList } from '../values/list-types.js';
|
|
2
|
+
// Avatar fixture state belongs to the World, or the standalone linkset.
|
|
3
|
+
const fixtures = new WeakMap();
|
|
4
|
+
export function gameControlAvatars(linkset) {
|
|
5
|
+
const scope = linkset.world ?? linkset;
|
|
6
|
+
let avatars = fixtures.get(scope);
|
|
7
|
+
if (!avatars)
|
|
8
|
+
fixtures.set(scope, avatars = new Map());
|
|
9
|
+
return avatars;
|
|
10
|
+
}
|
|
11
|
+
export function copyGameControl(state) {
|
|
12
|
+
return { mode: state.mode | 0, buttons: state.buttons | 0, axes: state.axes.map(Math.fround) };
|
|
13
|
+
}
|
|
14
|
+
function snapshot(ctx, id) {
|
|
15
|
+
const current = ctx.state.gameControlSnapshot;
|
|
16
|
+
return current?.agent === id.toLowerCase() ? current : null;
|
|
17
|
+
}
|
|
18
|
+
export const llGetGameControlMode = (ctx, args) => snapshot(ctx, args[0])?.mode ?? -1;
|
|
19
|
+
export const llGetGameControlModeButtons = (ctx, args) => snapshot(ctx, args[0])?.buttons ?? 0;
|
|
20
|
+
export const llGetGameControlModeAxes = (ctx, args) => uniformList([...(snapshot(ctx, args[0])?.axes ?? [])], 'float');
|
|
21
|
+
//# sourceMappingURL=game-control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game-control.js","sourceRoot":"","sources":["../../src/builtins/game-control.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAarD,wEAAwE;AACxE,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAyC,CAAA;AACrE,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAA;IACtC,IAAI,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACjC,IAAI,CAAC,OAAO;QAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC,CAAA;IACtD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAuB;IACrD,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAA;AAChG,CAAC;AAED,SAAS,QAAQ,CAAC,GAAgB,EAAE,EAAU;IAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAA;IAC7C,OAAO,OAAO,EAAE,KAAK,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;AAC7D,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAC7D,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAW,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAA;AAC9C,MAAM,CAAC,MAAM,2BAA2B,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CACpE,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAW,CAAC,EAAE,OAAO,IAAI,CAAC,CAAA;AAChD,MAAM,CAAC,MAAM,wBAAwB,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CACjE,WAAW,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAW,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { BuiltinImpl } from '../runtime.js';
|
|
2
|
+
import type { InventoryItem } from '../inventory.js';
|
|
3
|
+
/** An avatar offer or completed prim delivery. Items are snapshots of the transferred inventory. */
|
|
4
|
+
export interface InventoryOffer {
|
|
5
|
+
readonly kind: 'inventory' | 'inventoryList' | 'agentInventory';
|
|
6
|
+
readonly target: string;
|
|
7
|
+
/** Avatar folder name; null for a single item or a prim destination. */
|
|
8
|
+
readonly folder: string | null;
|
|
9
|
+
readonly rootPath: ReadonlyArray<string>;
|
|
10
|
+
readonly items: ReadonlyArray<InventoryItem>;
|
|
11
|
+
}
|
|
12
|
+
export { llAllowInventoryDrop } from './collision.js';
|
|
13
|
+
export declare const llGiveInventory: BuiltinImpl;
|
|
14
|
+
export declare const llGiveInventoryList: BuiltinImpl;
|
|
15
|
+
export declare const llGiveAgentInventory: BuiltinImpl;
|
|
16
|
+
//# sourceMappingURL=give.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"give.d.ts","sourceRoot":"","sources":["../../src/builtins/give.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAYpD,oGAAoG;AACpG,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,GAAG,gBAAgB,CAAA;IAC/D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACxC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;CAC7C;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAyCrD,eAAO,MAAM,eAAe,EAAE,WAmB7B,CAAA;AAYD,eAAO,MAAM,mBAAmB,EAAE,WAYjC,CAAA;AAqBD,eAAO,MAAM,oBAAoB,EAAE,WASlC,CAAA"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { InventoryType } from '../inventory.js';
|
|
2
|
+
import { NULL_KEY } from '../values/types.js';
|
|
3
|
+
import { formatListElement } from '../values/format.js';
|
|
4
|
+
import { listElementType } from '../values/list-types.js';
|
|
5
|
+
import { PERM_COPY, PERM_TRANSFER, CHANGED_INVENTORY, CHANGED_ALLOWED_DROP, TRANSFER_DEST, TRANSFER_FLAGS } from '../generated/constants.js';
|
|
6
|
+
import { sayError } from './debug.js';
|
|
7
|
+
import { isAgentInRegion, isKey } from './viewer.js';
|
|
8
|
+
import { llRemoveInventory } from './inventory.js';
|
|
9
|
+
export { llAllowInventoryDrop } from './collision.js';
|
|
10
|
+
function findPrim(ctx, key) {
|
|
11
|
+
return ctx.linkset.peers.flatMap(l => l.dead ? [] : l.prims).find(p => p.key.toLowerCase() === key.toLowerCase());
|
|
12
|
+
}
|
|
13
|
+
function snapshot(item, foreign) {
|
|
14
|
+
const { script: _script, ...copy } = item;
|
|
15
|
+
return { ...copy, permMask: { ...item.permMask,
|
|
16
|
+
...(foreign ? { base: item.permMask.base & item.permMask.next, owner: item.permMask.owner & item.permMask.next } : {}),
|
|
17
|
+
}, ...(item.notecardLines ? { notecardLines: [...item.notecardLines] } : {}) };
|
|
18
|
+
}
|
|
19
|
+
function deliver(ctx, kind, target, items, prim, folder, rootPath = []) {
|
|
20
|
+
const foreign = (prim?.linkset?.owner ?? target).toLowerCase() !== ctx.linkset.owner.toLowerCase();
|
|
21
|
+
if (prim && foreign && !prim.linkset.prims[0].allowInventoryDrop) {
|
|
22
|
+
sayError(ctx, "Unable to give inventory: 'Blocked by permissions'.");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (prim && foreign && items.some(i => i.type === InventoryType.SCRIPT)) {
|
|
26
|
+
sayError(ctx, "Unable to give inventory: 'Blocked by permissions'.");
|
|
27
|
+
items = items.filter(i => i.type !== InventoryType.SCRIPT);
|
|
28
|
+
if (!items.length)
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const copies = items.map(i => snapshot(i, foreign));
|
|
32
|
+
if (prim) {
|
|
33
|
+
for (const item of copies) {
|
|
34
|
+
let name = item.name;
|
|
35
|
+
let suffix = 0;
|
|
36
|
+
while (prim.inventory.some(i => i.name === name))
|
|
37
|
+
name = `${item.name} ${++suffix}`;
|
|
38
|
+
prim.addInventory({ ...item, name, acquireTimeMs: ctx.state.clock.now });
|
|
39
|
+
}
|
|
40
|
+
const changed = foreign ? CHANGED_ALLOWED_DROP : CHANGED_INVENTORY;
|
|
41
|
+
for (const script of prim.scripts)
|
|
42
|
+
ctx.state.clock.scheduleOn(script, ctx.state.clock.now, 'changed', { changes: changed });
|
|
43
|
+
}
|
|
44
|
+
ctx.state.inventoryOffers.push({ kind, target, folder: prim ? null : folder, rootPath: [...rootPath], items: copies });
|
|
45
|
+
if (kind === 'inventory')
|
|
46
|
+
for (const item of items) {
|
|
47
|
+
if (!(item.permMask.owner & PERM_COPY))
|
|
48
|
+
llRemoveInventory(ctx, [item.name]);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export const llGiveInventory = (ctx, args) => {
|
|
52
|
+
const target = args[0].toLowerCase();
|
|
53
|
+
const name = args[1];
|
|
54
|
+
const item = ctx.prim.inventory.find(i => i.name === name);
|
|
55
|
+
if (!item) {
|
|
56
|
+
sayError(ctx, `Unable to give inventory: 'No item named '${name}'.'.`);
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
if (!isKey(target) || target === NULL_KEY)
|
|
60
|
+
return undefined;
|
|
61
|
+
const prim = findPrim(ctx, target);
|
|
62
|
+
if (prim && prim.linkset.region !== ctx.linkset.region)
|
|
63
|
+
return undefined;
|
|
64
|
+
const foreign = (prim?.linkset?.owner ?? target).toLowerCase() !== ctx.linkset.owner.toLowerCase();
|
|
65
|
+
if (foreign && !(item.permMask.owner & PERM_TRANSFER)) {
|
|
66
|
+
sayError(ctx, "Unable to give inventory: 'Permissions do not allow transfer'.");
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
deliver(ctx, 'inventory', target, [item], prim, null);
|
|
70
|
+
if (!prim)
|
|
71
|
+
ctx.sleep(2000);
|
|
72
|
+
return undefined;
|
|
73
|
+
};
|
|
74
|
+
function listItems(ctx, values, foreign) {
|
|
75
|
+
const items = [];
|
|
76
|
+
for (let i = 0; i < values.length; i++) {
|
|
77
|
+
const name = formatListElement(values[i], listElementType(values, i));
|
|
78
|
+
const item = ctx.prim.inventory.find(it => it.name === name);
|
|
79
|
+
if (item && (item.permMask.owner & PERM_COPY) && (!foreign || (item.permMask.owner & PERM_TRANSFER)))
|
|
80
|
+
items.push(item);
|
|
81
|
+
}
|
|
82
|
+
return items;
|
|
83
|
+
}
|
|
84
|
+
export const llGiveInventoryList = (ctx, args) => {
|
|
85
|
+
const target = args[0].toLowerCase();
|
|
86
|
+
const prim = findPrim(ctx, target);
|
|
87
|
+
if (prim ? prim.linkset.region !== ctx.linkset.region : !isAgentInRegion(ctx, target)) {
|
|
88
|
+
sayError(ctx, 'Unable to give inventory list: Cannot find destination');
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
const foreign = (prim?.linkset?.owner ?? target).toLowerCase() !== ctx.linkset.owner.toLowerCase();
|
|
92
|
+
const items = listItems(ctx, args[2], foreign);
|
|
93
|
+
if (!items.length)
|
|
94
|
+
sayError(ctx, 'Unable to give inventory list: No items passed filter');
|
|
95
|
+
else
|
|
96
|
+
deliver(ctx, 'inventoryList', target, items, prim, args[1] || 'New Inventory');
|
|
97
|
+
return undefined;
|
|
98
|
+
};
|
|
99
|
+
function rootPath(options) {
|
|
100
|
+
let path = [];
|
|
101
|
+
for (let i = 0; i < options.length; i += 2) {
|
|
102
|
+
const rule = options[i];
|
|
103
|
+
const ruleType = listElementType(options, i);
|
|
104
|
+
if (typeof rule !== 'number' || !Number.isInteger(rule) || (ruleType !== undefined && ruleType !== 'integer'))
|
|
105
|
+
return -1;
|
|
106
|
+
const value = options[i + 1];
|
|
107
|
+
const type = listElementType(options, i + 1);
|
|
108
|
+
if (rule === TRANSFER_DEST) {
|
|
109
|
+
if (typeof value !== 'string' || (type !== undefined && type !== 'string'))
|
|
110
|
+
return -1;
|
|
111
|
+
path = value.split('|').filter(Boolean);
|
|
112
|
+
if (path.length > 4 || path.some(p => ['trash', 'lost and found', 'current outfit', 'inbox', 'outbox'].includes(p.trim().toLowerCase())))
|
|
113
|
+
return -5;
|
|
114
|
+
}
|
|
115
|
+
else if (rule === TRANSFER_FLAGS) {
|
|
116
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || (type !== undefined && type !== 'integer'))
|
|
117
|
+
return -1;
|
|
118
|
+
}
|
|
119
|
+
else
|
|
120
|
+
return -1;
|
|
121
|
+
}
|
|
122
|
+
return path;
|
|
123
|
+
}
|
|
124
|
+
export const llGiveAgentInventory = (ctx, args) => {
|
|
125
|
+
const path = rootPath(args[3]);
|
|
126
|
+
if (typeof path === 'number')
|
|
127
|
+
return path;
|
|
128
|
+
const target = args[0].toLowerCase();
|
|
129
|
+
if (findPrim(ctx, target) || !isAgentInRegion(ctx, target))
|
|
130
|
+
return -2;
|
|
131
|
+
const items = listItems(ctx, args[2], target !== ctx.linkset.owner.toLowerCase());
|
|
132
|
+
if (!items.length)
|
|
133
|
+
return -4;
|
|
134
|
+
deliver(ctx, 'agentInventory', target, items, undefined, args[1] || 'New Inventory', path);
|
|
135
|
+
return 0;
|
|
136
|
+
};
|
|
137
|
+
//# sourceMappingURL=give.js.map
|