@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.
Files changed (235) 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 +8 -0
  14. package/dist/builtins/base64.d.ts.map +1 -1
  15. package/dist/builtins/base64.js +1 -1
  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 +27 -1
  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/http.d.ts +99 -4
  66. package/dist/builtins/http.d.ts.map +1 -1
  67. package/dist/builtins/http.js +216 -6
  68. package/dist/builtins/http.js.map +1 -1
  69. package/dist/builtins/index.d.ts.map +1 -1
  70. package/dist/builtins/index.js +235 -10
  71. package/dist/builtins/index.js.map +1 -1
  72. package/dist/builtins/inventory.d.ts +1 -0
  73. package/dist/builtins/inventory.d.ts.map +1 -1
  74. package/dist/builtins/inventory.js +1 -1
  75. package/dist/builtins/inventory.js.map +1 -1
  76. package/dist/builtins/land.d.ts +29 -0
  77. package/dist/builtins/land.d.ts.map +1 -0
  78. package/dist/builtins/land.js +339 -0
  79. package/dist/builtins/land.js.map +1 -0
  80. package/dist/builtins/links.d.ts +20 -0
  81. package/dist/builtins/links.d.ts.map +1 -0
  82. package/dist/builtins/links.js +53 -0
  83. package/dist/builtins/links.js.map +1 -0
  84. package/dist/builtins/linksetdata.d.ts +5 -0
  85. package/dist/builtins/linksetdata.d.ts.map +1 -1
  86. package/dist/builtins/linksetdata.js +16 -0
  87. package/dist/builtins/linksetdata.js.map +1 -1
  88. package/dist/builtins/lists.d.ts +6 -0
  89. package/dist/builtins/lists.d.ts.map +1 -1
  90. package/dist/builtins/lists.js +19 -6
  91. package/dist/builtins/lists.js.map +1 -1
  92. package/dist/builtins/math.d.ts +16 -0
  93. package/dist/builtins/math.d.ts.map +1 -1
  94. package/dist/builtins/math.js +74 -0
  95. package/dist/builtins/math.js.map +1 -1
  96. package/dist/builtins/media.d.ts +8 -0
  97. package/dist/builtins/media.d.ts.map +1 -0
  98. package/dist/builtins/media.js +167 -0
  99. package/dist/builtins/media.js.map +1 -0
  100. package/dist/builtins/motion.d.ts +79 -0
  101. package/dist/builtins/motion.d.ts.map +1 -0
  102. package/dist/builtins/motion.js +396 -0
  103. package/dist/builtins/motion.js.map +1 -0
  104. package/dist/builtins/notecard-search.d.ts +15 -0
  105. package/dist/builtins/notecard-search.d.ts.map +1 -0
  106. package/dist/builtins/notecard-search.js +374 -0
  107. package/dist/builtins/notecard-search.js.map +1 -0
  108. package/dist/builtins/object-animation.d.ts +21 -0
  109. package/dist/builtins/object-animation.d.ts.map +1 -0
  110. package/dist/builtins/object-animation.js +193 -0
  111. package/dist/builtins/object-animation.js.map +1 -0
  112. package/dist/builtins/object-reads.d.ts +39 -0
  113. package/dist/builtins/object-reads.d.ts.map +1 -0
  114. package/dist/builtins/object-reads.js +332 -0
  115. package/dist/builtins/object-reads.js.map +1 -0
  116. package/dist/builtins/object.d.ts +6 -0
  117. package/dist/builtins/object.d.ts.map +1 -1
  118. package/dist/builtins/object.js +19 -3
  119. package/dist/builtins/object.js.map +1 -1
  120. package/dist/builtins/particles.d.ts +4 -0
  121. package/dist/builtins/particles.d.ts.map +1 -0
  122. package/dist/builtins/particles.js +65 -0
  123. package/dist/builtins/particles.js.map +1 -0
  124. package/dist/builtins/pathfinding.d.ts +39 -0
  125. package/dist/builtins/pathfinding.d.ts.map +1 -0
  126. package/dist/builtins/pathfinding.js +83 -0
  127. package/dist/builtins/pathfinding.js.map +1 -0
  128. package/dist/builtins/permissions.d.ts.map +1 -1
  129. package/dist/builtins/permissions.js +6 -0
  130. package/dist/builtins/permissions.js.map +1 -1
  131. package/dist/builtins/physics.d.ts +49 -0
  132. package/dist/builtins/physics.d.ts.map +1 -0
  133. package/dist/builtins/physics.js +47 -0
  134. package/dist/builtins/physics.js.map +1 -0
  135. package/dist/builtins/prim-accessors.d.ts +3 -0
  136. package/dist/builtins/prim-accessors.d.ts.map +1 -1
  137. package/dist/builtins/prim-accessors.js +27 -7
  138. package/dist/builtins/prim-accessors.js.map +1 -1
  139. package/dist/builtins/raycast.d.ts +3 -0
  140. package/dist/builtins/raycast.d.ts.map +1 -0
  141. package/dist/builtins/raycast.js +65 -0
  142. package/dist/builtins/raycast.js.map +1 -0
  143. package/dist/builtins/region.d.ts +31 -0
  144. package/dist/builtins/region.d.ts.map +1 -0
  145. package/dist/builtins/region.js +125 -0
  146. package/dist/builtins/region.js.map +1 -0
  147. package/dist/builtins/remote-load.d.ts +3 -0
  148. package/dist/builtins/remote-load.d.ts.map +1 -0
  149. package/dist/builtins/remote-load.js +53 -0
  150. package/dist/builtins/remote-load.js.map +1 -0
  151. package/dist/builtins/rez.d.ts +10 -0
  152. package/dist/builtins/rez.d.ts.map +1 -0
  153. package/dist/builtins/rez.js +255 -0
  154. package/dist/builtins/rez.js.map +1 -0
  155. package/dist/builtins/rsa.d.ts +4 -0
  156. package/dist/builtins/rsa.d.ts.map +1 -0
  157. package/dist/builtins/rsa.js +44 -0
  158. package/dist/builtins/rsa.js.map +1 -0
  159. package/dist/builtins/script-control.d.ts +6 -2
  160. package/dist/builtins/script-control.d.ts.map +1 -1
  161. package/dist/builtins/script-control.js +9 -4
  162. package/dist/builtins/script-control.js.map +1 -1
  163. package/dist/builtins/sensor.d.ts +11 -0
  164. package/dist/builtins/sensor.d.ts.map +1 -0
  165. package/dist/builtins/sensor.js +145 -0
  166. package/dist/builtins/sensor.js.map +1 -0
  167. package/dist/builtins/sit.d.ts +23 -0
  168. package/dist/builtins/sit.d.ts.map +1 -0
  169. package/dist/builtins/sit.js +150 -0
  170. package/dist/builtins/sit.js.map +1 -0
  171. package/dist/builtins/sound.d.ts +19 -0
  172. package/dist/builtins/sound.d.ts.map +1 -0
  173. package/dist/builtins/sound.js +113 -0
  174. package/dist/builtins/sound.js.map +1 -0
  175. package/dist/builtins/targets.d.ts +12 -0
  176. package/dist/builtins/targets.d.ts.map +1 -0
  177. package/dist/builtins/targets.js +121 -0
  178. package/dist/builtins/targets.js.map +1 -0
  179. package/dist/builtins/time.d.ts +12 -0
  180. package/dist/builtins/time.d.ts.map +1 -1
  181. package/dist/builtins/time.js +32 -4
  182. package/dist/builtins/time.js.map +1 -1
  183. package/dist/builtins/vehicles.d.ts +22 -0
  184. package/dist/builtins/vehicles.d.ts.map +1 -0
  185. package/dist/builtins/vehicles.js +78 -0
  186. package/dist/builtins/vehicles.js.map +1 -0
  187. package/dist/builtins/viewer.d.ts +39 -0
  188. package/dist/builtins/viewer.d.ts.map +1 -0
  189. package/dist/builtins/viewer.js +74 -0
  190. package/dist/builtins/viewer.js.map +1 -0
  191. package/dist/clock.d.ts +29 -1
  192. package/dist/clock.d.ts.map +1 -1
  193. package/dist/clock.js +89 -5
  194. package/dist/clock.js.map +1 -1
  195. package/dist/experience.d.ts +39 -0
  196. package/dist/experience.d.ts.map +1 -0
  197. package/dist/experience.js +38 -0
  198. package/dist/experience.js.map +1 -0
  199. package/dist/index.d.ts +20 -3
  200. package/dist/index.d.ts.map +1 -1
  201. package/dist/index.js +1 -0
  202. package/dist/index.js.map +1 -1
  203. package/dist/interpreter.d.ts +0 -1
  204. package/dist/interpreter.d.ts.map +1 -1
  205. package/dist/interpreter.js.map +1 -1
  206. package/dist/inventory.d.ts +2 -0
  207. package/dist/inventory.d.ts.map +1 -1
  208. package/dist/inventory.js +2 -0
  209. package/dist/inventory.js.map +1 -1
  210. package/dist/linkset.d.ts +139 -11
  211. package/dist/linkset.d.ts.map +1 -1
  212. package/dist/linkset.js +376 -24
  213. package/dist/linkset.js.map +1 -1
  214. package/dist/prim-params.d.ts.map +1 -1
  215. package/dist/prim-params.js +11 -3
  216. package/dist/prim-params.js.map +1 -1
  217. package/dist/prim.d.ts +94 -4
  218. package/dist/prim.d.ts.map +1 -1
  219. package/dist/prim.js +94 -5
  220. package/dist/prim.js.map +1 -1
  221. package/dist/runtime.d.ts +41 -0
  222. package/dist/runtime.d.ts.map +1 -1
  223. package/dist/script.d.ts +147 -2
  224. package/dist/script.d.ts.map +1 -1
  225. package/dist/script.js +373 -19
  226. package/dist/script.js.map +1 -1
  227. package/dist/values/ops.d.ts +3 -0
  228. package/dist/values/ops.d.ts.map +1 -1
  229. package/dist/values/ops.js +2 -2
  230. package/dist/values/ops.js.map +1 -1
  231. package/dist/world.d.ts +247 -1
  232. package/dist/world.d.ts.map +1 -1
  233. package/dist/world.js +318 -6
  234. package/dist/world.js.map +1 -1
  235. package/package.json +2 -2
@@ -0,0 +1,121 @@
1
+ import { ZERO_ROTATION } from '../values/types.js';
2
+ import { llAngleBetween } from './math.js';
3
+ /** Aditi's stationary single-target handlers ran about once every 44 ms. */
4
+ const INTERVAL = 1000 / 22.5;
5
+ const targets = new WeakMap();
6
+ /** Inventory pauses checks while retaining values and handle numbers. */
7
+ export function pauseTargets(script) {
8
+ const entries = targets.get(script);
9
+ entries?.cancel?.();
10
+ if (entries)
11
+ entries.cancel = undefined;
12
+ }
13
+ export function resumeTargets(script) {
14
+ const entries = targets.get(script);
15
+ if (entries && !entries.cancel && (entries.positions.length || entries.rotations.length))
16
+ entries.resume?.();
17
+ }
18
+ /** Reset/deletion clear registrations and their handle counter; state changes preserve them. */
19
+ export function clearTargets(script) {
20
+ targets.get(script)?.cancel?.();
21
+ targets.delete(script);
22
+ }
23
+ function emit(ctx, event, payload = {}) {
24
+ // A sleeping handler retains one completed event per target, even after removal.
25
+ const pending = ctx.script.linkset.clock.pendingEvents();
26
+ if (pending.some(e => e.target === ctx.script && e.event === event &&
27
+ e.payload['tnum'] === payload['tnum'] && e.payload['handle'] === payload['handle']))
28
+ return;
29
+ ctx.state.clock.schedule(ctx.state.clock.now, event, payload);
30
+ }
31
+ function check(ctx, entries) {
32
+ if (!ctx.script.running || ctx.script.dead)
33
+ return;
34
+ const root = ctx.script.linkset.prims[0];
35
+ const position = root.regionPosition();
36
+ const rotation = root.regionRotation();
37
+ if (entries.positions.length) {
38
+ let reached = false;
39
+ for (const target of entries.positions) {
40
+ const p = target.value;
41
+ const distance = (p.x - position.x) ** 2 + (p.y - position.y) ** 2 + (p.z - position.z) ** 2;
42
+ if (distance < target.range ** 2) {
43
+ reached = true;
44
+ emit(ctx, 'at_target', { tnum: target.handle, targetpos: { ...p }, ourpos: { ...position } });
45
+ }
46
+ }
47
+ if (!reached)
48
+ emit(ctx, 'not_at_target');
49
+ }
50
+ if (entries.rotations.length) {
51
+ let reached = false;
52
+ for (const target of entries.rotations) {
53
+ if (Number(llAngleBetween(ctx, [target.value, rotation])) < target.range) {
54
+ reached = true;
55
+ emit(ctx, 'at_rot_target', { handle: target.handle, targetrot: { ...target.value }, ourrot: { ...rotation } });
56
+ }
57
+ }
58
+ if (!reached)
59
+ emit(ctx, 'not_at_rot_target');
60
+ }
61
+ }
62
+ function register(ctx) {
63
+ let entries = targets.get(ctx.script);
64
+ if (!entries) {
65
+ entries = { nextHandle: 1, positions: [], rotations: [], cancel: undefined, resume: undefined };
66
+ targets.set(ctx.script, entries);
67
+ }
68
+ if (!entries.cancel) {
69
+ const current = entries;
70
+ const schedule = () => {
71
+ if (!ctx.script.linkset.peers.includes(ctx.script.linkset))
72
+ return;
73
+ current.cancel = ctx.script.linkset.clock.scheduleTask(ctx.script, ctx.state.clock.now + INTERVAL, tick);
74
+ };
75
+ const tick = () => {
76
+ check(ctx, current);
77
+ schedule();
78
+ };
79
+ current.resume = schedule;
80
+ schedule();
81
+ }
82
+ return entries;
83
+ }
84
+ function normalize(rotation) {
85
+ const magnitude = Math.hypot(rotation.x, rotation.y, rotation.z, rotation.s);
86
+ if (magnitude === 0)
87
+ return ZERO_ROTATION;
88
+ return { x: rotation.x / magnitude, y: rotation.y / magnitude, z: rotation.z / magnitude, s: rotation.s / magnitude };
89
+ }
90
+ export const llTarget = (ctx, args) => {
91
+ const entries = register(ctx);
92
+ const handle = entries.nextHandle++;
93
+ entries.positions.push({ handle, value: { ...args[0] }, range: Number(args[1]) });
94
+ if (entries.positions.length > 8)
95
+ entries.positions.shift();
96
+ return handle;
97
+ };
98
+ export const llRotTarget = (ctx, args) => {
99
+ const entries = register(ctx);
100
+ const handle = entries.nextHandle++;
101
+ entries.rotations.push({ handle, value: normalize(args[0]), range: Number(args[1]) });
102
+ if (entries.rotations.length > 8)
103
+ entries.rotations.shift();
104
+ return handle;
105
+ };
106
+ function remove(ctx, handle, kind) {
107
+ const entries = targets.get(ctx.script);
108
+ if (!entries)
109
+ return;
110
+ const list = entries[kind];
111
+ const index = list.findIndex(target => target.handle === handle);
112
+ if (index >= 0)
113
+ list.splice(index, 1);
114
+ if (!entries.positions.length && !entries.rotations.length) {
115
+ entries.cancel?.();
116
+ entries.cancel = undefined;
117
+ }
118
+ }
119
+ export const llTargetRemove = (ctx, args) => { remove(ctx, Number(args[0]), 'positions'); };
120
+ export const llRotTargetRemove = (ctx, args) => { remove(ctx, Number(args[0]), 'rotations'); };
121
+ //# sourceMappingURL=targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/builtins/targets.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,12 @@ import type { BuiltinImpl } from '../runtime.js';
5
5
  */
6
6
  /** llSetTimerEvent(float sec) — `sec <= 0` cancels; otherwise (re)arms. */
7
7
  export declare const llSetTimerEvent: BuiltinImpl;
8
+ /**
9
+ * llMinEventDelay(float delay) — timer and touch_start events start at
10
+ * least `delay` seconds apart, counted from the call and then from the
11
+ * start of each of them. A reset clears it; a state change keeps it.
12
+ */
13
+ export declare const llMinEventDelay: BuiltinImpl;
8
14
  /**
9
15
  * llSleep(float sec) — suspends the script on the virtual clock.
10
16
  *
@@ -27,8 +33,14 @@ export declare const llResetTime: BuiltinImpl;
27
33
  export declare const llGetUnixTime: BuiltinImpl;
28
34
  /** llGetTimestamp() — UTC time as `YYYY-MM-DDThh:mm:ss.ffffffZ`. */
29
35
  export declare const llGetTimestamp: BuiltinImpl;
36
+ /** Microseconds since the Unix epoch as `YYYY-MM-DDThh:mm:ss.ffffffZ`. */
37
+ export declare function formatTimestamp(micros: number): string;
30
38
  /** llGetDate() — UTC date as `YYYY-MM-DD`. */
31
39
  export declare const llGetDate: BuiltinImpl;
32
40
  /** llGetRegionTimeDilation() — 1.0, a region running at full speed. */
33
41
  export declare const llGetRegionTimeDilation: BuiltinImpl;
42
+ /** llGetGMTclock() — whole seconds since midnight UTC. */
43
+ export declare const llGetGMTclock: BuiltinImpl;
44
+ /** llGetWallclock() — whole seconds since midnight US Pacific time, following daylight time. */
45
+ export declare const llGetWallclock: BuiltinImpl;
34
46
  //# sourceMappingURL=time.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/builtins/time.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD;;;GAGG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAA;AAUD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO,EAAE,WAKrB,CAAA;AAED,sEAAsE;AACtE,eAAO,MAAM,SAAS,EAAE,WAEvB,CAAA;AAED,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,EAAE,WAI/B,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,WAAW,EAAE,WAGzB,CAAA;AAED,gFAAgF;AAChF,eAAO,MAAM,aAAa,EAAE,WAE3B,CAAA;AAED,oEAAoE;AACpE,eAAO,MAAM,cAAc,EAAE,WAK5B,CAAA;AAED,8CAA8C;AAC9C,eAAO,MAAM,SAAS,EAAE,WAEvB,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,uBAAuB,EAAE,WAAqB,CAAA"}
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/builtins/time.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD;;;GAGG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,WAG7B,CAAA;AAUD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO,EAAE,WAKrB,CAAA;AAED,sEAAsE;AACtE,eAAO,MAAM,SAAS,EAAE,WAEvB,CAAA;AAED,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,EAAE,WAI/B,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,WAAW,EAAE,WAGzB,CAAA;AAED,gFAAgF;AAChF,eAAO,MAAM,aAAa,EAAE,WAE3B,CAAA;AAED,oEAAoE;AACpE,eAAO,MAAM,cAAc,EAAE,WAAoE,CAAA;AAEjG,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,8CAA8C;AAC9C,eAAO,MAAM,SAAS,EAAE,WAEvB,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,uBAAuB,EAAE,WAAqB,CAAA;AAY3D,0DAA0D;AAC1D,eAAO,MAAM,aAAa,EAAE,WAE3B,CAAA;AAED,gGAAgG;AAChG,eAAO,MAAM,cAAc,EAAE,WAI5B,CAAA"}
@@ -1,4 +1,4 @@
1
- import { toInt32 } from '../values/types.js';
1
+ import { toFloat32, toInt32 } from '../values/types.js';
2
2
  /**
3
3
  * Time and timer built-ins. All operate on the virtual clock; no real
4
4
  * wall-clock time is read.
@@ -9,6 +9,15 @@ export const llSetTimerEvent = (ctx, args) => {
9
9
  ctx.state.clock.setTimer(seconds * 1000);
10
10
  return undefined;
11
11
  };
12
+ /**
13
+ * llMinEventDelay(float delay) — timer and touch_start events start at
14
+ * least `delay` seconds apart, counted from the call and then from the
15
+ * start of each of them. A reset clears it; a state change keeps it.
16
+ */
17
+ export const llMinEventDelay = (ctx, args) => {
18
+ ctx.state.clock.setMinEventDelay((args[0] ?? 0) * 1000);
19
+ return undefined;
20
+ };
12
21
  /**
13
22
  * Minimum llSleep advance for positive durations: one server frame at the
14
23
  * LSL-canonical 45 Hz tick (~22.222 ms). `llSleep(0)` and negative values
@@ -54,16 +63,35 @@ export const llGetUnixTime = (ctx) => {
54
63
  return toInt32(Math.floor(ctx.state.clock.unixMicros() / 1e6));
55
64
  };
56
65
  /** llGetTimestamp() — UTC time as `YYYY-MM-DDThh:mm:ss.ffffffZ`. */
57
- export const llGetTimestamp = (ctx) => {
58
- const micros = ctx.state.clock.unixMicros();
66
+ export const llGetTimestamp = (ctx) => formatTimestamp(ctx.state.clock.unixMicros());
67
+ /** Microseconds since the Unix epoch as `YYYY-MM-DDThh:mm:ss.ffffffZ`. */
68
+ export function formatTimestamp(micros) {
59
69
  const ms = Math.floor(micros / 1000);
60
70
  const fraction = String(micros - Math.floor(micros / 1e6) * 1e6).padStart(6, '0');
61
71
  return `${new Date(ms).toISOString().slice(0, 19)}.${fraction}Z`;
62
- };
72
+ }
63
73
  /** llGetDate() — UTC date as `YYYY-MM-DD`. */
64
74
  export const llGetDate = (ctx) => {
65
75
  return new Date(Math.floor(ctx.state.clock.unixMicros() / 1000)).toISOString().slice(0, 10);
66
76
  };
67
77
  /** llGetRegionTimeDilation() — 1.0, a region running at full speed. */
68
78
  export const llGetRegionTimeDilation = () => 1;
79
+ const DAY_SECONDS = 86_400;
80
+ const PACIFIC = new Intl.DateTimeFormat('en-US', {
81
+ timeZone: 'America/Los_Angeles',
82
+ hourCycle: 'h23',
83
+ hour: 'numeric',
84
+ minute: 'numeric',
85
+ second: 'numeric',
86
+ });
87
+ /** llGetGMTclock() — whole seconds since midnight UTC. */
88
+ export const llGetGMTclock = (ctx) => {
89
+ return Math.floor(ctx.state.clock.unixMicros() / 1e6) % DAY_SECONDS;
90
+ };
91
+ /** llGetWallclock() — whole seconds since midnight US Pacific time, following daylight time. */
92
+ export const llGetWallclock = (ctx) => {
93
+ const parts = PACIFIC.formatToParts(Math.floor(ctx.state.clock.unixMicros() / 1000));
94
+ const part = (type) => Number(parts.find((p) => p.type === type).value);
95
+ return part('hour') * 3600 + part('minute') * 60 + part('second');
96
+ };
69
97
  //# sourceMappingURL=time.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/builtins/time.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/builtins/time.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { BuiltinImpl } from '../runtime.js';
2
+ import type { LslValue, Rotation, Vector } from '../values/types.js';
3
+ export type VehicleRequestName = 'llSetVehicleType' | 'llSetVehicleFlags' | 'llRemoveVehicleFlags' | 'llSetVehicleFloatParam' | 'llSetVehicleVectorParam' | 'llSetVehicleRotationParam';
4
+ export interface VehicleRequest {
5
+ name: VehicleRequestName;
6
+ args: readonly LslValue[];
7
+ }
8
+ /** Last requested configuration, not simulator motion or an LSL read-back. */
9
+ export interface VehicleSettings {
10
+ type: number;
11
+ flags: number;
12
+ /** VEHICLE_* parameter IDs. Explicit setters retain requested magnitudes. */
13
+ params: Record<number, number | Vector | Rotation>;
14
+ requests: VehicleRequest[];
15
+ }
16
+ export declare const llSetVehicleType: BuiltinImpl;
17
+ export declare const llSetVehicleFlags: BuiltinImpl;
18
+ export declare const llRemoveVehicleFlags: BuiltinImpl;
19
+ export declare const llSetVehicleFloatParam: BuiltinImpl;
20
+ export declare const llSetVehicleVectorParam: BuiltinImpl;
21
+ export declare const llSetVehicleRotationParam: BuiltinImpl;
22
+ //# sourceMappingURL=vehicles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vehicles.d.ts","sourceRoot":"","sources":["../../src/builtins/vehicles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEpE,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,GAAG,mBAAmB,GAAG,sBAAsB,GAC9F,wBAAwB,GAAG,yBAAyB,GAAG,2BAA2B,CAAA;AACtF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAA;IACxB,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAA;CAC1B;AAED,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAA;IAClD,QAAQ,EAAE,cAAc,EAAE,CAAA;CAC3B;AAsCD,eAAO,MAAM,gBAAgB,aAK3B,CAAA;AACF,eAAO,MAAM,iBAAiB,aAE5B,CAAA;AACF,eAAO,MAAM,oBAAoB,aAE/B,CAAA;AACF,eAAO,MAAM,sBAAsB,aAMjC,CAAA;AACF,eAAO,MAAM,uBAAuB,aAKlC,CAAA;AACF,eAAO,MAAM,yBAAyB,aAIpC,CAAA"}
@@ -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":"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"}
package/dist/clock.d.ts CHANGED
@@ -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,6 +49,8 @@ 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
  /**
@@ -54,8 +66,12 @@ export declare class LinksetClock {
54
66
  * long advances catch up on every missed fire. Ticks that fall due while
55
67
  * the script is busy (e.g. in llSleep) collapse into one event delivered
56
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.
57
72
  */
58
73
  takeNextDue(scripts: ReadonlyArray<Script>, horizon?: number): QueuedEvent | null;
74
+ private takeNextEventOrTask;
59
75
  /** Snapshot of the pending one-shot queue. Read-only; for inspection/tests. */
60
76
  pendingEvents(): readonly QueuedEvent[];
61
77
  /**
@@ -71,6 +87,8 @@ export declare class LinksetClock {
71
87
  * and state change.
72
88
  */
73
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;
74
92
  }
75
93
  /**
76
94
  * Per-script clock facade. Builtins read `ctx.state.clock` and call
@@ -82,20 +100,30 @@ export declare class ScriptClockView {
82
100
  private readonly self;
83
101
  /** Reference time for `llGetTime`/`llResetTime` (virtual ms); the script's creation, reset or last llResetTime. */
84
102
  timeReferenceMs: number;
103
+ /** Monotonic completed-handler count used to bound synchronous settling. */
104
+ completedHandlers: number;
85
105
  /** Recurring timer interval in ms; 0 = no timer. */
86
106
  timerIntervalMs: number;
87
107
  /** Virtual time at which the next timer event fires. */
88
108
  timerNextFireMs: number;
89
109
  /** Virtual time at which the script's last handler finished, when it took time (llSleep, delays). */
90
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;
91
115
  constructor(linksetClock: LinksetClock, self: () => Script);
92
116
  get now(): number;
93
117
  /** Schedule a one-shot event on this script. */
94
118
  schedule(at: number, event: string, payload?: Record<string, unknown>): void;
95
119
  /** Schedule a one-shot event on a specific script. */
96
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;
97
123
  cancelTimer(): void;
98
124
  setTimer(intervalMs: number): void;
125
+ /** llMinEventDelay: `ms` below 0 counts as 0, and the delay starts now. */
126
+ setMinEventDelay(ms: number): void;
99
127
  /** Advances the linkset clock. */
100
128
  advance(ms: number): void;
101
129
  /** Wall-clock time in microseconds since the Unix epoch, floored. */
@@ -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;;;;;;;;;;;;;OAaG;IACH,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,SAAW,GAAG,WAAW,GAAG,IAAI,CAmDlF;IAED,+EAA+E;IAC/E,aAAa,IAAI,SAAS,WAAW,EAAE,CAEtC;IAED;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAI5B;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,kCAAkC;IAClC,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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"}