@rezless/vm 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.
Files changed (273) hide show
  1. package/dist/builtins/agents.d.ts +14 -0
  2. package/dist/builtins/agents.d.ts.map +1 -0
  3. package/dist/builtins/agents.js +117 -0
  4. package/dist/builtins/agents.js.map +1 -0
  5. package/dist/builtins/animation.d.ts +46 -0
  6. package/dist/builtins/animation.d.ts.map +1 -0
  7. package/dist/builtins/animation.js +316 -0
  8. package/dist/builtins/animation.js.map +1 -0
  9. package/dist/builtins/attachments.d.ts +9 -0
  10. package/dist/builtins/attachments.d.ts.map +1 -0
  11. package/dist/builtins/attachments.js +127 -0
  12. package/dist/builtins/attachments.js.map +1 -0
  13. package/dist/builtins/base64.d.ts +13 -2
  14. package/dist/builtins/base64.d.ts.map +1 -1
  15. package/dist/builtins/base64.js +8 -6
  16. package/dist/builtins/base64.js.map +1 -1
  17. package/dist/builtins/camera.d.ts +35 -0
  18. package/dist/builtins/camera.d.ts.map +1 -0
  19. package/dist/builtins/camera.js +104 -0
  20. package/dist/builtins/camera.js.map +1 -0
  21. package/dist/builtins/collision.d.ts +21 -0
  22. package/dist/builtins/collision.d.ts.map +1 -0
  23. package/dist/builtins/collision.js +44 -0
  24. package/dist/builtins/collision.js.map +1 -0
  25. package/dist/builtins/controls.d.ts +19 -0
  26. package/dist/builtins/controls.d.ts.map +1 -0
  27. package/dist/builtins/controls.js +27 -0
  28. package/dist/builtins/controls.js.map +1 -0
  29. package/dist/builtins/damage.d.ts +24 -0
  30. package/dist/builtins/damage.d.ts.map +1 -0
  31. package/dist/builtins/damage.js +166 -0
  32. package/dist/builtins/damage.js.map +1 -0
  33. package/dist/builtins/detected.d.ts +22 -1
  34. package/dist/builtins/detected.d.ts.map +1 -1
  35. package/dist/builtins/detected.js +28 -2
  36. package/dist/builtins/detected.js.map +1 -1
  37. package/dist/builtins/dialog.d.ts +23 -0
  38. package/dist/builtins/dialog.d.ts.map +1 -0
  39. package/dist/builtins/dialog.js +69 -0
  40. package/dist/builtins/dialog.js.map +1 -0
  41. package/dist/builtins/email.d.ts +61 -0
  42. package/dist/builtins/email.d.ts.map +1 -0
  43. package/dist/builtins/email.js +121 -0
  44. package/dist/builtins/email.js.map +1 -0
  45. package/dist/builtins/environment.d.ts +27 -0
  46. package/dist/builtins/environment.d.ts.map +1 -0
  47. package/dist/builtins/environment.js +126 -0
  48. package/dist/builtins/environment.js.map +1 -0
  49. package/dist/builtins/experience.d.ts +51 -0
  50. package/dist/builtins/experience.d.ts.map +1 -0
  51. package/dist/builtins/experience.js +202 -0
  52. package/dist/builtins/experience.js.map +1 -0
  53. package/dist/builtins/game-control.d.ts +17 -0
  54. package/dist/builtins/game-control.d.ts.map +1 -0
  55. package/dist/builtins/game-control.js +21 -0
  56. package/dist/builtins/game-control.js.map +1 -0
  57. package/dist/builtins/give.d.ts +16 -0
  58. package/dist/builtins/give.d.ts.map +1 -0
  59. package/dist/builtins/give.js +137 -0
  60. package/dist/builtins/give.js.map +1 -0
  61. package/dist/builtins/ground.d.ts +18 -0
  62. package/dist/builtins/ground.d.ts.map +1 -0
  63. package/dist/builtins/ground.js +83 -0
  64. package/dist/builtins/ground.js.map +1 -0
  65. package/dist/builtins/hash.d.ts +1 -0
  66. package/dist/builtins/hash.d.ts.map +1 -1
  67. package/dist/builtins/hash.js +12 -2
  68. package/dist/builtins/hash.js.map +1 -1
  69. package/dist/builtins/http.d.ts +99 -4
  70. package/dist/builtins/http.d.ts.map +1 -1
  71. package/dist/builtins/http.js +216 -6
  72. package/dist/builtins/http.js.map +1 -1
  73. package/dist/builtins/index.d.ts.map +1 -1
  74. package/dist/builtins/index.js +250 -14
  75. package/dist/builtins/index.js.map +1 -1
  76. package/dist/builtins/inventory.d.ts +8 -5
  77. package/dist/builtins/inventory.d.ts.map +1 -1
  78. package/dist/builtins/inventory.js +37 -15
  79. package/dist/builtins/inventory.js.map +1 -1
  80. package/dist/builtins/json.d.ts.map +1 -1
  81. package/dist/builtins/json.js +45 -34
  82. package/dist/builtins/json.js.map +1 -1
  83. package/dist/builtins/land.d.ts +29 -0
  84. package/dist/builtins/land.d.ts.map +1 -0
  85. package/dist/builtins/land.js +339 -0
  86. package/dist/builtins/land.js.map +1 -0
  87. package/dist/builtins/link-info.js +2 -2
  88. package/dist/builtins/link-info.js.map +1 -1
  89. package/dist/builtins/links.d.ts +20 -0
  90. package/dist/builtins/links.d.ts.map +1 -0
  91. package/dist/builtins/links.js +53 -0
  92. package/dist/builtins/links.js.map +1 -0
  93. package/dist/builtins/linksetdata.d.ts +5 -0
  94. package/dist/builtins/linksetdata.d.ts.map +1 -1
  95. package/dist/builtins/linksetdata.js +22 -9
  96. package/dist/builtins/linksetdata.js.map +1 -1
  97. package/dist/builtins/lists.d.ts +21 -0
  98. package/dist/builtins/lists.d.ts.map +1 -1
  99. package/dist/builtins/lists.js +137 -17
  100. package/dist/builtins/lists.js.map +1 -1
  101. package/dist/builtins/math.d.ts +18 -0
  102. package/dist/builtins/math.d.ts.map +1 -1
  103. package/dist/builtins/math.js +104 -5
  104. package/dist/builtins/math.js.map +1 -1
  105. package/dist/builtins/media.d.ts +8 -0
  106. package/dist/builtins/media.d.ts.map +1 -0
  107. package/dist/builtins/media.js +167 -0
  108. package/dist/builtins/media.js.map +1 -0
  109. package/dist/builtins/motion.d.ts +79 -0
  110. package/dist/builtins/motion.d.ts.map +1 -0
  111. package/dist/builtins/motion.js +396 -0
  112. package/dist/builtins/motion.js.map +1 -0
  113. package/dist/builtins/notecard-search.d.ts +15 -0
  114. package/dist/builtins/notecard-search.d.ts.map +1 -0
  115. package/dist/builtins/notecard-search.js +374 -0
  116. package/dist/builtins/notecard-search.js.map +1 -0
  117. package/dist/builtins/object-animation.d.ts +21 -0
  118. package/dist/builtins/object-animation.d.ts.map +1 -0
  119. package/dist/builtins/object-animation.js +193 -0
  120. package/dist/builtins/object-animation.js.map +1 -0
  121. package/dist/builtins/object-reads.d.ts +39 -0
  122. package/dist/builtins/object-reads.d.ts.map +1 -0
  123. package/dist/builtins/object-reads.js +332 -0
  124. package/dist/builtins/object-reads.js.map +1 -0
  125. package/dist/builtins/object.d.ts +11 -2
  126. package/dist/builtins/object.d.ts.map +1 -1
  127. package/dist/builtins/object.js +32 -8
  128. package/dist/builtins/object.js.map +1 -1
  129. package/dist/builtins/particles.d.ts +4 -0
  130. package/dist/builtins/particles.d.ts.map +1 -0
  131. package/dist/builtins/particles.js +65 -0
  132. package/dist/builtins/particles.js.map +1 -0
  133. package/dist/builtins/pathfinding.d.ts +39 -0
  134. package/dist/builtins/pathfinding.d.ts.map +1 -0
  135. package/dist/builtins/pathfinding.js +83 -0
  136. package/dist/builtins/pathfinding.js.map +1 -0
  137. package/dist/builtins/permissions.d.ts.map +1 -1
  138. package/dist/builtins/permissions.js +6 -0
  139. package/dist/builtins/permissions.js.map +1 -1
  140. package/dist/builtins/physics.d.ts +49 -0
  141. package/dist/builtins/physics.d.ts.map +1 -0
  142. package/dist/builtins/physics.js +47 -0
  143. package/dist/builtins/physics.js.map +1 -0
  144. package/dist/builtins/prim-accessors.d.ts +4 -0
  145. package/dist/builtins/prim-accessors.d.ts.map +1 -1
  146. package/dist/builtins/prim-accessors.js +75 -28
  147. package/dist/builtins/prim-accessors.js.map +1 -1
  148. package/dist/builtins/prim-params.d.ts.map +1 -1
  149. package/dist/builtins/prim-params.js +6 -2
  150. package/dist/builtins/prim-params.js.map +1 -1
  151. package/dist/builtins/raycast.d.ts +3 -0
  152. package/dist/builtins/raycast.d.ts.map +1 -0
  153. package/dist/builtins/raycast.js +65 -0
  154. package/dist/builtins/raycast.js.map +1 -0
  155. package/dist/builtins/region.d.ts +31 -0
  156. package/dist/builtins/region.d.ts.map +1 -0
  157. package/dist/builtins/region.js +125 -0
  158. package/dist/builtins/region.js.map +1 -0
  159. package/dist/builtins/remote-load.d.ts +3 -0
  160. package/dist/builtins/remote-load.d.ts.map +1 -0
  161. package/dist/builtins/remote-load.js +53 -0
  162. package/dist/builtins/remote-load.js.map +1 -0
  163. package/dist/builtins/rez.d.ts +10 -0
  164. package/dist/builtins/rez.d.ts.map +1 -0
  165. package/dist/builtins/rez.js +255 -0
  166. package/dist/builtins/rez.js.map +1 -0
  167. package/dist/builtins/rsa.d.ts +4 -0
  168. package/dist/builtins/rsa.d.ts.map +1 -0
  169. package/dist/builtins/rsa.js +44 -0
  170. package/dist/builtins/rsa.js.map +1 -0
  171. package/dist/builtins/script-control.d.ts +8 -3
  172. package/dist/builtins/script-control.d.ts.map +1 -1
  173. package/dist/builtins/script-control.js +27 -8
  174. package/dist/builtins/script-control.js.map +1 -1
  175. package/dist/builtins/sensor.d.ts +11 -0
  176. package/dist/builtins/sensor.d.ts.map +1 -0
  177. package/dist/builtins/sensor.js +145 -0
  178. package/dist/builtins/sensor.js.map +1 -0
  179. package/dist/builtins/sit.d.ts +23 -0
  180. package/dist/builtins/sit.d.ts.map +1 -0
  181. package/dist/builtins/sit.js +150 -0
  182. package/dist/builtins/sit.js.map +1 -0
  183. package/dist/builtins/sound.d.ts +19 -0
  184. package/dist/builtins/sound.d.ts.map +1 -0
  185. package/dist/builtins/sound.js +113 -0
  186. package/dist/builtins/sound.js.map +1 -0
  187. package/dist/builtins/strings.d.ts +6 -0
  188. package/dist/builtins/strings.d.ts.map +1 -1
  189. package/dist/builtins/strings.js +47 -6
  190. package/dist/builtins/strings.js.map +1 -1
  191. package/dist/builtins/targets.d.ts +12 -0
  192. package/dist/builtins/targets.d.ts.map +1 -0
  193. package/dist/builtins/targets.js +121 -0
  194. package/dist/builtins/targets.js.map +1 -0
  195. package/dist/builtins/time.d.ts +15 -5
  196. package/dist/builtins/time.d.ts.map +1 -1
  197. package/dist/builtins/time.js +36 -11
  198. package/dist/builtins/time.js.map +1 -1
  199. package/dist/builtins/vehicles.d.ts +22 -0
  200. package/dist/builtins/vehicles.d.ts.map +1 -0
  201. package/dist/builtins/vehicles.js +78 -0
  202. package/dist/builtins/vehicles.js.map +1 -0
  203. package/dist/builtins/viewer.d.ts +39 -0
  204. package/dist/builtins/viewer.d.ts.map +1 -0
  205. package/dist/builtins/viewer.js +74 -0
  206. package/dist/builtins/viewer.js.map +1 -0
  207. package/dist/clock.d.ts +45 -7
  208. package/dist/clock.d.ts.map +1 -1
  209. package/dist/clock.js +125 -14
  210. package/dist/clock.js.map +1 -1
  211. package/dist/dispatch.d.ts +3 -2
  212. package/dist/dispatch.d.ts.map +1 -1
  213. package/dist/dispatch.js +15 -10
  214. package/dist/dispatch.js.map +1 -1
  215. package/dist/experience.d.ts +39 -0
  216. package/dist/experience.d.ts.map +1 -0
  217. package/dist/experience.js +38 -0
  218. package/dist/experience.js.map +1 -0
  219. package/dist/index.d.ts +20 -3
  220. package/dist/index.d.ts.map +1 -1
  221. package/dist/index.js +1 -0
  222. package/dist/index.js.map +1 -1
  223. package/dist/interpreter.d.ts +5 -10
  224. package/dist/interpreter.d.ts.map +1 -1
  225. package/dist/interpreter.js +143 -70
  226. package/dist/interpreter.js.map +1 -1
  227. package/dist/inventory.d.ts +2 -0
  228. package/dist/inventory.d.ts.map +1 -1
  229. package/dist/inventory.js +2 -0
  230. package/dist/inventory.js.map +1 -1
  231. package/dist/linkset.d.ts +147 -11
  232. package/dist/linkset.d.ts.map +1 -1
  233. package/dist/linkset.js +401 -28
  234. package/dist/linkset.js.map +1 -1
  235. package/dist/memory.d.ts +5 -2
  236. package/dist/memory.d.ts.map +1 -1
  237. package/dist/memory.js +5 -2
  238. package/dist/memory.js.map +1 -1
  239. package/dist/prim-params.d.ts +27 -10
  240. package/dist/prim-params.d.ts.map +1 -1
  241. package/dist/prim-params.js +209 -125
  242. package/dist/prim-params.js.map +1 -1
  243. package/dist/prim.d.ts +95 -5
  244. package/dist/prim.d.ts.map +1 -1
  245. package/dist/prim.js +96 -7
  246. package/dist/prim.js.map +1 -1
  247. package/dist/runtime.d.ts +52 -3
  248. package/dist/runtime.d.ts.map +1 -1
  249. package/dist/script.d.ts +171 -12
  250. package/dist/script.d.ts.map +1 -1
  251. package/dist/script.js +480 -73
  252. package/dist/script.js.map +1 -1
  253. package/dist/typecheck.d.ts +3 -1
  254. package/dist/typecheck.d.ts.map +1 -1
  255. package/dist/typecheck.js +25 -5
  256. package/dist/typecheck.js.map +1 -1
  257. package/dist/values/coerce.d.ts +1 -1
  258. package/dist/values/coerce.d.ts.map +1 -1
  259. package/dist/values/coerce.js +10 -6
  260. package/dist/values/coerce.js.map +1 -1
  261. package/dist/values/format.d.ts +3 -1
  262. package/dist/values/format.d.ts.map +1 -1
  263. package/dist/values/format.js +10 -6
  264. package/dist/values/format.js.map +1 -1
  265. package/dist/values/ops.d.ts +3 -0
  266. package/dist/values/ops.d.ts.map +1 -1
  267. package/dist/values/ops.js +2 -2
  268. package/dist/values/ops.js.map +1 -1
  269. package/dist/world.d.ts +247 -1
  270. package/dist/world.d.ts.map +1 -1
  271. package/dist/world.js +318 -6
  272. package/dist/world.js.map +1 -1
  273. package/package.json +2 -2
@@ -0,0 +1,78 @@
1
+ import { sayError } from './debug.js';
2
+ const vector = (x = 0, y = x, z = x) => ({ x, y, z });
3
+ /**
4
+ * https://wiki.secondlife.com/wiki/VEHICLE_TYPE_{SLED,CAR,BOAT,AIRPLANE,BALLOON}
5
+ * No LSL vehicle parameter getters exist. These are the documented presets;
6
+ * observable motion comparisons are cited in vehicles.test.ts.
7
+ */
8
+ function defaults(type) {
9
+ if (type < 1 || type > 5)
10
+ return {};
11
+ const linearFriction = [vector(), vector(30, 1, 1000), vector(100, 2, 1000), vector(10, 3, 2), vector(200, 10, 5), vector(5)];
12
+ // Columns are vehicle types 1 through 5; rows use their public parameter IDs.
13
+ const floats = {
14
+ 24: [0, 0, 0, 0, 5], 25: [10, 0, .5, .5, .8], 26: [10, 1000, 2, 1000, 10],
15
+ 27: [0, 0, 1, 0, 1], 28: [1, 1, .5, .5, 0], 29: [1, 2, 3, .5, 5],
16
+ 30: [1000, 1, 5, 2, 5], 31: [120, 60, 60, 60, 60],
17
+ 32: [0, 0, .5, 1, 0], 33: [10, 10, 5, 2, 5],
18
+ 34: [1000, 1, 4, 4, 6], 35: [120, .8, 4, 8, 10],
19
+ 36: [1, 1, .5, .9, 1], 37: [1000, 10, 5, 2, 1000],
20
+ 38: [0, -.2, -.3, 1, 0], 39: [1, 1, .8, .7, .7], 40: [10, 1, 1, 2, 5],
21
+ };
22
+ return {
23
+ ...Object.fromEntries(Object.entries(floats).map(([id, values]) => [id, values[type - 1]])),
24
+ 16: linearFriction[type], 17: vector([0, 1000, 1000, 10, 20, 10][type]),
25
+ 18: vector(), 19: vector(), 20: vector(), 44: { x: 0, y: 0, z: 0, s: 1 },
26
+ };
27
+ }
28
+ function setter(name, apply) {
29
+ return (ctx, args) => {
30
+ const state = ctx.prim.vehicle;
31
+ state.requests.push({ name, args: structuredClone(args) });
32
+ apply(state, args, ctx);
33
+ return undefined;
34
+ };
35
+ }
36
+ export const llSetVehicleType = setter('llSetVehicleType', (state, args) => {
37
+ const requested = args[0];
38
+ state.type = requested;
39
+ state.flags = [0, 67, 99, 101, 2, 0][state.type] ?? 0;
40
+ state.params = defaults(state.type);
41
+ });
42
+ export const llSetVehicleFlags = setter('llSetVehicleFlags', (state, args) => {
43
+ if (state.type)
44
+ state.flags |= args[0];
45
+ });
46
+ export const llRemoveVehicleFlags = setter('llRemoveVehicleFlags', (state, args) => {
47
+ if (state.type)
48
+ state.flags &= ~args[0];
49
+ });
50
+ export const llSetVehicleFloatParam = setter('llSetVehicleFloatParam', (state, args, ctx) => {
51
+ if (!state.type)
52
+ return;
53
+ const id = args[0], value = args[1];
54
+ if (id === 16 || id === 17)
55
+ state.params[id] = vector(value);
56
+ else if (id >= 24 && id <= 40)
57
+ state.params[id] = value;
58
+ else
59
+ sayError(ctx, `Unknown vehicle float parameter ${id}`);
60
+ });
61
+ export const llSetVehicleVectorParam = setter('llSetVehicleVectorParam', (state, args, ctx) => {
62
+ if (!state.type)
63
+ return;
64
+ const id = args[0];
65
+ if (id >= 16 && id <= 20)
66
+ state.params[id] = { ...args[1] };
67
+ else
68
+ sayError(ctx, `Unknown vehicle vector parameter ${id}`);
69
+ });
70
+ export const llSetVehicleRotationParam = setter('llSetVehicleRotationParam', (state, args, ctx) => {
71
+ if (!state.type)
72
+ return;
73
+ if (args[0] === 44)
74
+ state.params[44] = { ...args[1] };
75
+ else
76
+ sayError(ctx, `Unknown vehicle rotation parameter ${args[0]}`);
77
+ });
78
+ //# sourceMappingURL=vehicles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vehicles.js","sourceRoot":"","sources":["../../src/builtins/vehicles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { BuiltinImpl, CallContext } from '../runtime.js';
2
+ import type { LslValue, Vector } from '../values/types.js';
3
+ import type { Linkset } from '../linkset.js';
4
+ /** Requests made by the script. Floater requests include the simulator's rejection code. */
5
+ export type ViewerRequest = {
6
+ readonly kind: 'loadURL';
7
+ readonly agent: string;
8
+ readonly message: string;
9
+ readonly url: string;
10
+ } | {
11
+ readonly kind: 'mapDestination';
12
+ readonly agent: string;
13
+ readonly region: string;
14
+ readonly position: Vector;
15
+ readonly lookAt: Vector;
16
+ } | {
17
+ readonly kind: 'mapBeacon';
18
+ readonly agent: string;
19
+ readonly region: string;
20
+ readonly position: Vector;
21
+ readonly options: ReadonlyArray<LslValue>;
22
+ } | {
23
+ readonly kind: 'openFloater';
24
+ readonly agent: string;
25
+ readonly floater: string;
26
+ readonly url: string;
27
+ readonly params: ReadonlyArray<LslValue>;
28
+ readonly result: number;
29
+ };
30
+ /** Region-presence overrides supplied by tests, shared by scripts in that region. */
31
+ export declare function agentPresence(linkset: Linkset): Map<string, boolean>;
32
+ export declare function isAgentInRegion(ctx: CallContext, agent: string): boolean;
33
+ export declare function isKey(key: string): boolean;
34
+ export declare const llLoadURL: BuiltinImpl;
35
+ export declare const llMapDestination: BuiltinImpl;
36
+ export declare const llMapBeacon: BuiltinImpl;
37
+ /** Linden-owned privileged experiences cannot be represented by the current Experience fixture. */
38
+ export declare const llOpenFloater: BuiltinImpl;
39
+ //# sourceMappingURL=viewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../../src/builtins/viewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAG1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAG5C,4FAA4F;AAC5F,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACpG;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxI;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;CAAE,GACrJ;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAI/K,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAMpE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CASxE;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1C;AAED,eAAO,MAAM,SAAS,EAAE,WAQvB,CAAA;AAOD,eAAO,MAAM,gBAAgB,EAAE,WAO9B,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,WAQzB,CAAA;AAED,mGAAmG;AACnG,eAAO,MAAM,aAAa,EAAE,WAK3B,CAAA"}
@@ -0,0 +1,74 @@
1
+ import { truncateUtf8 } from '../values/utf8.js';
2
+ import { NULL_KEY } from '../values/types.js';
3
+ import { sayError } from './debug.js';
4
+ const regions = new WeakMap();
5
+ /** Region-presence overrides supplied by tests, shared by scripts in that region. */
6
+ export function agentPresence(linkset) {
7
+ let regionsForClock = regions.get(linkset.clock);
8
+ if (!regionsForClock)
9
+ regions.set(linkset.clock, regionsForClock = new Map());
10
+ let agents = regionsForClock.get(linkset.region);
11
+ if (!agents)
12
+ regionsForClock.set(linkset.region, agents = new Map());
13
+ return agents;
14
+ }
15
+ export function isAgentInRegion(ctx, agent) {
16
+ agent = agent.toLowerCase();
17
+ if (agent === NULL_KEY || !isKey(agent))
18
+ return false;
19
+ const explicit = ctx.state.agentPresence.get(agent);
20
+ if (explicit !== undefined)
21
+ return explicit;
22
+ const avatar = ctx.linkset.world?.avatars.find(a => a.key.toLowerCase() === agent.toLowerCase());
23
+ if (avatar)
24
+ return avatar.region === ctx.linkset.region;
25
+ if (agent === ctx.linkset.owner.toLowerCase())
26
+ return true;
27
+ return ctx.state.detectedStack.at(-1)?.entries.some(e => e.key.toLowerCase() === agent && ((e.type ?? 1) & 1) !== 0) ?? false;
28
+ }
29
+ export function isKey(key) {
30
+ return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(key);
31
+ }
32
+ export const llLoadURL = (ctx, args) => {
33
+ const agent = args[0].toLowerCase();
34
+ const message = truncateUtf8(args[1], 255);
35
+ const url = truncateUtf8(args[2], 255);
36
+ if (!isAgentInRegion(ctx, agent))
37
+ sayError(ctx, 'llLoadURL - cannot find avatar');
38
+ else if (!url.startsWith('http://') && !url.startsWith('https://'))
39
+ sayError(ctx, 'llLoadURL - invalid or unsupported scheme.');
40
+ else
41
+ ctx.state.viewerRequests.push({ kind: 'loadURL', agent, message, url });
42
+ return undefined;
43
+ };
44
+ function mapAgent(ctx) {
45
+ const detected = ctx.state.detectedStack.at(-1);
46
+ return (detected?.event?.startsWith('touch') ? (detected.entries[0]?.key ?? ctx.linkset.owner) : ctx.linkset.owner).toLowerCase();
47
+ }
48
+ export const llMapDestination = (ctx, args) => {
49
+ const agent = mapAgent(ctx);
50
+ if (isAgentInRegion(ctx, agent))
51
+ ctx.state.viewerRequests.push({
52
+ kind: 'mapDestination', agent, region: args[0],
53
+ position: { ...args[1] }, lookAt: { ...args[2] },
54
+ });
55
+ return undefined;
56
+ };
57
+ export const llMapBeacon = (ctx, args) => {
58
+ const agent = mapAgent(ctx);
59
+ const options = args[2];
60
+ if (isAgentInRegion(ctx, agent))
61
+ ctx.state.viewerRequests.push({
62
+ kind: 'mapBeacon', agent, region: args[0],
63
+ position: { ...args[1] }, options: [...options],
64
+ });
65
+ return undefined;
66
+ };
67
+ /** Linden-owned privileged experiences cannot be represented by the current Experience fixture. */
68
+ export const llOpenFloater = (ctx, args) => {
69
+ const result = -1;
70
+ ctx.state.viewerRequests.push({ kind: 'openFloater', agent: ctx.linkset.owner,
71
+ floater: args[0], url: args[1], params: [...args[2]], result });
72
+ return result;
73
+ };
74
+ //# sourceMappingURL=viewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../src/builtins/viewer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AASrC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAyD,CAAA;AAEpF,qFAAqF;AACrF,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,IAAI,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAChD,IAAI,CAAC,eAAe;QAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC,CAAA;IAC7E,IAAI,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAChD,IAAI,CAAC,MAAM;QAAE,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC,CAAA;IACpE,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAgB,EAAE,KAAa;IAC7D,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;IAC3B,IAAI,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACrD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACnD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAA;IAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;IAChG,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,MAAM,CAAA;IACvD,IAAI,KAAK,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE;QAAE,OAAO,IAAI,CAAA;IAC1D,OAAO,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAA;AAC/H,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,OAAO,iEAAiE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACpF,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;IAClD,MAAM,KAAK,GAAI,IAAI,CAAC,CAAC,CAAY,CAAC,WAAW,EAAE,CAAA;IAC/C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAW,EAAE,GAAG,CAAC,CAAA;IACpD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAW,EAAE,GAAG,CAAC,CAAA;IAChD,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC;QAAE,QAAQ,CAAC,GAAG,EAAE,gCAAgC,CAAC,CAAA;SAC5E,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,QAAQ,CAAC,GAAG,EAAE,4CAA4C,CAAC,CAAA;;QAC1H,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;IAC5E,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,SAAS,QAAQ,CAAC,GAAgB;IAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/C,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;AACnI,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;IACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;IAC3B,IAAI,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC;QAAE,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC;YAC7D,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAW;YACxD,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAW,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAW,EAAE;SACrE,CAAC,CAAA;IACF,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAA4B,CAAA;IAClD,IAAI,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC;QAAE,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC;YAC7D,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAW;YACnD,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAW,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;SAC1D,CAAC,CAAA;IACF,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,mGAAmG;AACnG,MAAM,CAAC,MAAM,aAAa,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;IACtD,MAAM,MAAM,GAAG,CAAC,CAAC,CAAA;IACjB,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK;QAC3E,OAAO,EAAE,IAAI,CAAC,CAAC,CAAW,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAW,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAA4B,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAChH,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
package/dist/clock.d.ts CHANGED
@@ -2,9 +2,9 @@
2
2
  * Virtual clock + event queue.
3
3
  *
4
4
  * The clock is the only source of "time" in the VM. Tests advance it
5
- * explicitly (`vm.advanceTime` / `linkset.advanceTime`); LSL scripts advance
6
- * it by calling `llSleep` or `llSetTimerEvent`. Real wall-clock time is
7
- * never read.
5
+ * explicitly (`vm.advanceTime` / `linkset.advanceTime`); a script in
6
+ * `llSleep` or a builtin delay is suspended until its wake time while the
7
+ * clock runs other scripts' events. Real wall-clock time is never read.
8
8
  *
9
9
  * The queue is **linkset-wide**, or world-wide for linksets in a `World`:
10
10
  * every script shares one `now` and one event queue. Each queued event carries a `target: Script`
@@ -21,17 +21,27 @@ export interface QueuedEvent {
21
21
  readonly event: string;
22
22
  readonly payload: Record<string, unknown>;
23
23
  }
24
+ /** Events llMinEventDelay spaces out; other events are not delayed. */
25
+ export declare const DELAYED_EVENTS: ReadonlySet<string>;
24
26
  /** Events a script can hold in its queue; more are dropped, as in Second Life. */
25
27
  export declare const MAX_PENDING_EVENTS = 64;
26
28
  /** Linkset-wide clock. One instance per Linkset. */
27
29
  export declare class LinksetClock {
28
30
  readonly startUnixTime: number;
29
31
  /** Virtual milliseconds since linkset construction. Strictly monotonic. */
30
- now: number;
32
+ private time;
33
+ private readonly timeListeners;
34
+ get now(): number;
35
+ set now(value: number);
36
+ /** Continuous simulator properties update before scripts observe the new time. */
37
+ onAdvance(update: (now: number) => void): () => void;
31
38
  /** @param startUnixTime Unix time in seconds when `now` is 0. */
32
39
  constructor(startUnixTime?: number);
33
40
  /** Wall-clock time in microseconds since the Unix epoch, floored. */
34
41
  unixMicros(): number;
42
+ private readonly tasks;
43
+ /** Simulator work that completes even while its script's handler sleeps. */
44
+ scheduleTask(target: Script, at: number, run: () => void): () => void;
35
45
  private readonly queue;
36
46
  /**
37
47
  * Schedule a one-shot event on `target`'s handler at virtual time `at`.
@@ -39,28 +49,46 @@ export declare class LinksetClock {
39
49
  * parked while it is stopped; further events are dropped.
40
50
  */
41
51
  schedule(target: Script, at: number, event: string, payload?: Record<string, unknown>): void;
52
+ /** Whether `target` has a queued `event` that has not been delivered yet. */
53
+ hasPending(target: Script, event: string): boolean;
42
54
  /** Move the clock forward unconditionally; does not drain queues. */
43
55
  advance(ms: number): void;
44
56
  /**
45
57
  * Pop and return the next due event (`at <= horizon`, default `now`) considering all queued
46
- * one-shots and every script's recurring timer. Returns `null` when no
47
- * event is ready.
58
+ * one-shots, every script's recurring timer and every sleeping script's wake
59
+ * (a synthetic `__wake` event). Returns `null` when no event is ready. A
60
+ * sleeping script gets no events but `__reset` until it finishes, and wakes
61
+ * at its wake time or, if paused past it, on resume. At the same instant a
62
+ * queued event comes first, then a timer, then a wake.
48
63
  *
49
64
  * Recurring timers fire once per script per interval; their next fire
50
65
  * timestamp is advanced by `at + interval` (not `now + interval`) so that
51
66
  * long advances catch up on every missed fire. Ticks that fall due while
52
67
  * the script is busy (e.g. in llSleep) collapse into one event delivered
53
68
  * when it finishes, and the interval restarts from there.
69
+ *
70
+ * Under llMinEventDelay, a timer or touch_start waits until the delay since
71
+ * the last of them has passed, and the events queued behind it wait too.
54
72
  */
55
73
  takeNextDue(scripts: ReadonlyArray<Script>, horizon?: number): QueuedEvent | null;
74
+ private takeNextEventOrTask;
56
75
  /** Snapshot of the pending one-shot queue. Read-only; for inspection/tests. */
57
76
  pendingEvents(): readonly QueuedEvent[];
77
+ /**
78
+ * Move `script`'s events that are due by now behind every other queued
79
+ * event, in their order. Called when a handler that took time finishes,
80
+ * so the events that waited for it follow other scripts' events at that
81
+ * instant.
82
+ */
83
+ requeue(script: Script): void;
58
84
  /**
59
85
  * Remove every queued event whose target is `script` and that is due by
60
86
  * `upTo` (default: all of them), except events named `keep`. Used on reset
61
87
  * and state change.
62
88
  */
63
89
  purgeTarget(script: Script, upTo?: number, keep?: string): void;
90
+ /** Remove every queued `event` whose target is `script`. */
91
+ purgeEvent(script: Script, event: string): void;
64
92
  }
65
93
  /**
66
94
  * Per-script clock facade. Builtins read `ctx.state.clock` and call
@@ -72,21 +100,31 @@ export declare class ScriptClockView {
72
100
  private readonly self;
73
101
  /** Reference time for `llGetTime`/`llResetTime` (virtual ms); the script's creation, reset or last llResetTime. */
74
102
  timeReferenceMs: number;
103
+ /** Monotonic completed-handler count used to bound synchronous settling. */
104
+ completedHandlers: number;
75
105
  /** Recurring timer interval in ms; 0 = no timer. */
76
106
  timerIntervalMs: number;
77
107
  /** Virtual time at which the next timer event fires. */
78
108
  timerNextFireMs: number;
79
109
  /** Virtual time at which the script's last handler finished, when it took time (llSleep, delays). */
80
110
  busyUntilMs: number;
111
+ /** llMinEventDelay in ms; 0 = none. */
112
+ minEventDelayMs: number;
113
+ /** Earliest virtual time the next timer or touch_start may start, under llMinEventDelay. */
114
+ delayedUntilMs: number;
81
115
  constructor(linksetClock: LinksetClock, self: () => Script);
82
116
  get now(): number;
83
117
  /** Schedule a one-shot event on this script. */
84
118
  schedule(at: number, event: string, payload?: Record<string, unknown>): void;
85
119
  /** Schedule a one-shot event on a specific script. */
86
120
  scheduleOn(target: Script, at: number, event: string, payload?: Record<string, unknown>): void;
121
+ /** A reset chain finishes when its replacement state_entry finishes. */
122
+ finishHandler(restarting: boolean): void;
87
123
  cancelTimer(): void;
88
124
  setTimer(intervalMs: number): void;
89
- /** Advances the linkset clock — used by `llSleep`. */
125
+ /** llMinEventDelay: `ms` below 0 counts as 0, and the delay starts now. */
126
+ setMinEventDelay(ms: number): void;
127
+ /** Advances the linkset clock. */
90
128
  advance(ms: number): void;
91
129
  /** Wall-clock time in microseconds since the Unix epoch, floored. */
92
130
  unixMicros(): number;
@@ -1 +1 @@
1
- {"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC1C;AAED,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,KAAK,CAAA;AAEpC,oDAAoD;AACpD,qBAAa,YAAY;IAKX,QAAQ,CAAC,aAAa;IAJlC,2EAA2E;IAC3E,GAAG,SAAI;IAEP,iEAAiE;IACjE,YAAqB,aAAa,SAAI,EAAI;IAE1C,qEAAqE;IACrE,UAAU,IAAI,MAAM,CAEnB;IAED,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAE1C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAO/F;IAED,qEAAqE;IACrE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAGxB;IAED;;;;;;;;;;OAUG;IACH,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,SAAW,GAAG,WAAW,GAAG,IAAI,CAsClF;IAED,+EAA+E;IAC/E,aAAa,IAAI,SAAS,WAAW,EAAE,CAEtC;IAED;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,SAAW,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAKhE;CACF;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAWxB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXvB,mHAAmH;IACnH,eAAe,EAAE,MAAM,CAAA;IACvB,oDAAoD;IACpD,eAAe,SAAI;IACnB,wDAAwD;IACxD,eAAe,SAAI;IACnB,qGAAqG;IACrG,WAAW,SAAI;IAEf,YACmB,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,MAAM,MAAM,EAGpC;IAED,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,gDAAgD;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAE/E;IAED,sDAAsD;IACtD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAEjG;IAED,WAAW,IAAI,IAAI,CAGlB;IAED,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAOjC;IAED,sDAAsD;IACtD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAExB;IAED,qEAAqE;IACrE,UAAU,IAAI,MAAM,CAEnB;IAED,cAAc,IAAI,MAAM,CAEvB;IAED,cAAc,IAAI,IAAI,CAErB;CACF"}
1
+ {"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"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"}
package/dist/clock.js CHANGED
@@ -1,10 +1,24 @@
1
+ /** Events llMinEventDelay spaces out; other events are not delayed. */
2
+ export const DELAYED_EVENTS = new Set(['timer', 'touch_start']);
1
3
  /** Events a script can hold in its queue; more are dropped, as in Second Life. */
2
4
  export const MAX_PENDING_EVENTS = 64;
3
5
  /** Linkset-wide clock. One instance per Linkset. */
4
6
  export class LinksetClock {
5
7
  startUnixTime;
6
8
  /** Virtual milliseconds since linkset construction. Strictly monotonic. */
7
- now = 0;
9
+ time = 0;
10
+ timeListeners = new Set();
11
+ get now() { return this.time; }
12
+ set now(value) {
13
+ this.time = value;
14
+ for (const update of this.timeListeners)
15
+ update(value);
16
+ }
17
+ /** Continuous simulator properties update before scripts observe the new time. */
18
+ onAdvance(update) {
19
+ this.timeListeners.add(update);
20
+ return () => { this.timeListeners.delete(update); };
21
+ }
8
22
  /** @param startUnixTime Unix time in seconds when `now` is 0. */
9
23
  constructor(startUnixTime = 0) {
10
24
  this.startUnixTime = startUnixTime;
@@ -13,6 +27,13 @@ export class LinksetClock {
13
27
  unixMicros() {
14
28
  return Math.floor(this.startUnixTime * 1e6 + this.now * 1000);
15
29
  }
30
+ tasks = new Set();
31
+ /** Simulator work that completes even while its script's handler sleeps. */
32
+ scheduleTask(target, at, run) {
33
+ const task = { target, at, run };
34
+ this.tasks.add(task);
35
+ return () => { this.tasks.delete(task); };
36
+ }
16
37
  queue = [];
17
38
  /**
18
39
  * Schedule a one-shot event on `target`'s handler at virtual time `at`.
@@ -30,6 +51,10 @@ export class LinksetClock {
30
51
  }
31
52
  this.queue.push({ at, target, event, payload });
32
53
  }
54
+ /** Whether `target` has a queued `event` that has not been delivered yet. */
55
+ hasPending(target, event) {
56
+ return this.queue.some((e) => e.target === target && e.event === event);
57
+ }
33
58
  /** Move the clock forward unconditionally; does not drain queues. */
34
59
  advance(ms) {
35
60
  if (ms < 0)
@@ -38,58 +63,120 @@ export class LinksetClock {
38
63
  }
39
64
  /**
40
65
  * Pop and return the next due event (`at <= horizon`, default `now`) considering all queued
41
- * one-shots and every script's recurring timer. Returns `null` when no
42
- * event is ready.
66
+ * one-shots, every script's recurring timer and every sleeping script's wake
67
+ * (a synthetic `__wake` event). Returns `null` when no event is ready. A
68
+ * sleeping script gets no events but `__reset` until it finishes, and wakes
69
+ * at its wake time or, if paused past it, on resume. At the same instant a
70
+ * queued event comes first, then a timer, then a wake.
43
71
  *
44
72
  * Recurring timers fire once per script per interval; their next fire
45
73
  * timestamp is advanced by `at + interval` (not `now + interval`) so that
46
74
  * long advances catch up on every missed fire. Ticks that fall due while
47
75
  * the script is busy (e.g. in llSleep) collapse into one event delivered
48
76
  * when it finishes, and the interval restarts from there.
77
+ *
78
+ * Under llMinEventDelay, a timer or touch_start waits until the delay since
79
+ * the last of them has passed, and the events queued behind it wait too.
49
80
  */
50
81
  takeNextDue(scripts, horizon = this.now) {
82
+ for (;;) {
83
+ const next = this.takeNextEventOrTask(scripts, horizon);
84
+ if (next !== 'task')
85
+ return next;
86
+ }
87
+ }
88
+ takeNextEventOrTask(scripts, horizon) {
89
+ const heldFrom = new Map();
90
+ for (let i = 0; i < this.queue.length; i++) {
91
+ const e = this.queue[i];
92
+ if (DELAYED_EVENTS.has(e.event) && e.target.clockView.delayedUntilMs > e.at && !heldFrom.has(e.target)) {
93
+ heldFrom.set(e.target, i);
94
+ }
95
+ }
51
96
  let bestIdx = -1;
52
97
  let bestAt = Infinity;
53
98
  for (let i = 0; i < this.queue.length; i++) {
54
99
  const e = this.queue[i];
55
- if (e.at <= horizon && e.at < bestAt) {
56
- bestAt = e.at;
100
+ const v = e.target.clockView;
101
+ // An event that waited for its target's handler is due when that handler finished.
102
+ let due = Math.max(e.at, v.busyUntilMs);
103
+ if (e.event !== '__reset' && i >= (heldFrom.get(e.target) ?? Infinity))
104
+ due = Math.max(due, v.delayedUntilMs);
105
+ if (due <= horizon && due < bestAt && (e.event === '__reset' || e.target.wakeAt === undefined)) {
106
+ bestAt = due;
57
107
  bestIdx = i;
58
108
  }
59
109
  }
60
110
  let bestTimerScript = null;
61
111
  let bestTimerAt = Infinity;
112
+ let waking = null;
113
+ let wakeAt = Infinity;
62
114
  for (const s of scripts) {
63
115
  // Per LSL: dead and stopped scripts don't generate timer events. Skip
64
116
  // their timer state so we don't waste catch-up iterations or accumulate
65
117
  // back-logged events that flood the script on resume.
66
118
  if (s.dead || !s.running)
67
119
  continue;
120
+ const w = s.wakeAt === undefined ? undefined : Math.max(s.wakeAt, this.now);
121
+ if (w !== undefined) {
122
+ if (w <= horizon && w < wakeAt) {
123
+ wakeAt = w;
124
+ waking = s;
125
+ }
126
+ continue;
127
+ }
68
128
  const v = s.clockView;
69
129
  if (v.timerIntervalMs > 0 && v.timerNextFireMs <= horizon) {
70
- const due = Math.max(v.timerNextFireMs, v.busyUntilMs);
71
- if (due < bestTimerAt) {
130
+ const due = Math.max(v.timerNextFireMs, v.busyUntilMs, v.delayedUntilMs);
131
+ if (due <= horizon && due < bestTimerAt) {
72
132
  bestTimerAt = due;
73
133
  bestTimerScript = s;
74
134
  }
75
135
  }
76
136
  }
77
- if (bestIdx === -1 && bestTimerScript === null)
78
- return null;
79
- if (bestTimerScript && bestTimerAt <= bestAt) {
137
+ let task;
138
+ for (const candidate of this.tasks) {
139
+ if (candidate.target.dead) {
140
+ this.tasks.delete(candidate);
141
+ continue;
142
+ }
143
+ if (candidate.at <= horizon && (!task || candidate.at < task.at))
144
+ task = candidate;
145
+ }
146
+ if (task && task.at <= Math.min(bestAt, bestTimerAt, wakeAt)) {
147
+ this.tasks.delete(task);
148
+ this.now = Math.max(this.now, task.at);
149
+ task.run();
150
+ return 'task';
151
+ }
152
+ if (bestIdx !== -1 && bestAt <= bestTimerAt && bestAt <= wakeAt) {
153
+ const ev = this.queue[bestIdx];
154
+ this.queue.splice(bestIdx, 1);
155
+ return bestAt > ev.at ? { ...ev, at: bestAt } : ev;
156
+ }
157
+ if (bestTimerScript && bestTimerAt <= wakeAt) {
80
158
  const at = bestTimerAt;
81
159
  const v = bestTimerScript.clockView;
82
160
  v.timerNextFireMs = at + v.timerIntervalMs;
83
161
  return { at, target: bestTimerScript, event: 'timer', payload: {} };
84
162
  }
85
- const ev = this.queue[bestIdx];
86
- this.queue.splice(bestIdx, 1);
87
- return ev;
163
+ return waking && { at: wakeAt, target: waking, event: '__wake', payload: {} };
88
164
  }
89
165
  /** Snapshot of the pending one-shot queue. Read-only; for inspection/tests. */
90
166
  pendingEvents() {
91
167
  return this.queue.slice();
92
168
  }
169
+ /**
170
+ * Move `script`'s events that are due by now behind every other queued
171
+ * event, in their order. Called when a handler that took time finishes,
172
+ * so the events that waited for it follow other scripts' events at that
173
+ * instant.
174
+ */
175
+ requeue(script) {
176
+ const waited = this.queue.filter((e) => e.target === script && e.at <= this.now);
177
+ this.purgeTarget(script, this.now);
178
+ this.queue.push(...waited);
179
+ }
93
180
  /**
94
181
  * Remove every queued event whose target is `script` and that is due by
95
182
  * `upTo` (default: all of them), except events named `keep`. Used on reset
@@ -102,6 +189,14 @@ export class LinksetClock {
102
189
  this.queue.splice(i, 1);
103
190
  }
104
191
  }
192
+ /** Remove every queued `event` whose target is `script`. */
193
+ purgeEvent(script, event) {
194
+ for (let i = this.queue.length - 1; i >= 0; i--) {
195
+ const e = this.queue[i];
196
+ if (e.target === script && e.event === event)
197
+ this.queue.splice(i, 1);
198
+ }
199
+ }
105
200
  }
106
201
  /**
107
202
  * Per-script clock facade. Builtins read `ctx.state.clock` and call
@@ -113,12 +208,18 @@ export class ScriptClockView {
113
208
  self;
114
209
  /** Reference time for `llGetTime`/`llResetTime` (virtual ms); the script's creation, reset or last llResetTime. */
115
210
  timeReferenceMs;
211
+ /** Monotonic completed-handler count used to bound synchronous settling. */
212
+ completedHandlers = 0;
116
213
  /** Recurring timer interval in ms; 0 = no timer. */
117
214
  timerIntervalMs = 0;
118
215
  /** Virtual time at which the next timer event fires. */
119
216
  timerNextFireMs = 0;
120
217
  /** Virtual time at which the script's last handler finished, when it took time (llSleep, delays). */
121
218
  busyUntilMs = 0;
219
+ /** llMinEventDelay in ms; 0 = none. */
220
+ minEventDelayMs = 0;
221
+ /** Earliest virtual time the next timer or touch_start may start, under llMinEventDelay. */
222
+ delayedUntilMs = 0;
122
223
  constructor(linksetClock, self) {
123
224
  this.linksetClock = linksetClock;
124
225
  this.self = self;
@@ -135,6 +236,11 @@ export class ScriptClockView {
135
236
  scheduleOn(target, at, event, payload = {}) {
136
237
  this.linksetClock.schedule(target, at, event, payload);
137
238
  }
239
+ /** A reset chain finishes when its replacement state_entry finishes. */
240
+ finishHandler(restarting) {
241
+ if (!restarting)
242
+ this.completedHandlers++;
243
+ }
138
244
  cancelTimer() {
139
245
  this.timerIntervalMs = 0;
140
246
  this.timerNextFireMs = 0;
@@ -147,7 +253,12 @@ export class ScriptClockView {
147
253
  this.timerIntervalMs = intervalMs;
148
254
  this.timerNextFireMs = this.now + intervalMs;
149
255
  }
150
- /** Advances the linkset clock — used by `llSleep`. */
256
+ /** llMinEventDelay: `ms` below 0 counts as 0, and the delay starts now. */
257
+ setMinEventDelay(ms) {
258
+ this.minEventDelayMs = Math.max(0, ms);
259
+ this.delayedUntilMs = this.now + this.minEventDelayMs;
260
+ }
261
+ /** Advances the linkset clock. */
151
262
  advance(ms) {
152
263
  this.linksetClock.advance(ms);
153
264
  }
package/dist/clock.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"clock.js","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clock.js","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { BuiltinImpl, ScriptState } from './runtime.js';
1
+ import type { BuiltinImpl, Run, ScriptState } from './runtime.js';
2
2
  import type { LslValue } from './values/types.js';
3
3
  import type { BuiltinSpec } from './generated/functions.js';
4
4
  import type { Script } from './script.js';
@@ -14,6 +14,7 @@ export interface DispatchContext {
14
14
  *
15
15
  * Resolution order: user mock > real built-in > generated stub > error.
16
16
  * Every successful call (including stubs) is appended to ScriptState.calls.
17
+ * A builtin that sleeps or has a delay suspends the script after it returns.
17
18
  */
18
- export declare function callBuiltin(dctx: DispatchContext, name: string, args: ReadonlyArray<LslValue>): LslValue | undefined;
19
+ export declare function callBuiltin(dctx: DispatchContext, name: string, args: ReadonlyArray<LslValue>): Run<LslValue | undefined>;
19
20
  //# sourceMappingURL=dispatch.d.ts.map