@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,127 @@
1
+ import { ZERO_VECTOR } from '../values/types.js';
2
+ import { conjugate, rotateVector } from '../values/ops.js';
3
+ import { listElementType, uniformList } from '../values/list-types.js';
4
+ import { PERMISSION_ATTACH, PERMISSION_TRACK_CAMERA, CHANGED_OWNER, PERM_TRANSFER } from '../generated/constants.js';
5
+ import { sayError } from './debug.js';
6
+ import { isAgentInRegion } from './viewer.js';
7
+ import { effectiveCamera } from './camera.js';
8
+ const sameKey = (a, b) => a.toLowerCase() === b.toLowerCase();
9
+ const isHUD = (point) => point >= 31 && point <= 38;
10
+ function localAgent(ctx, key) {
11
+ return isAgentInRegion(ctx, key) && (!ctx.linkset.world ||
12
+ ctx.linkset.world.avatars.some(a => sameKey(a.key, key) && a.region === ctx.linkset.region));
13
+ }
14
+ function attach(ctx, point, temporary) {
15
+ const { agent, granted } = ctx.state.permissions;
16
+ // In-world, the missing permission agent is diagnosed before permission bits.
17
+ if (!localAgent(ctx, agent)) {
18
+ sayError(ctx, 'Cannot find the agent to attach to.');
19
+ return;
20
+ }
21
+ if (!(granted & PERMISSION_ATTACH) || ctx.linkset.attachment)
22
+ return;
23
+ if (temporary && ctx.linkset.prims.some(p => p.inventory.some(i => !(i.permMask.owner & PERM_TRANSFER)))) {
24
+ sayError(ctx, 'No permission to transfer');
25
+ return;
26
+ }
27
+ if (!sameKey(agent, ctx.linkset.owner)) {
28
+ if (!temporary)
29
+ return;
30
+ for (const prim of ctx.linkset.prims) {
31
+ for (const item of prim.inventory) {
32
+ const mask = item.permMask;
33
+ item.permMask = { ...mask, base: mask.base & mask.next, owner: mask.owner & mask.next };
34
+ }
35
+ }
36
+ ctx.linkset.owner = agent;
37
+ ctx.state.permissions.granted = PERMISSION_ATTACH;
38
+ for (const script of ctx.linkset.allScripts()) {
39
+ ctx.linkset.clock.schedule(script, ctx.state.clock.now, 'changed', { changes: CHANGED_OWNER });
40
+ }
41
+ }
42
+ ctx.linkset.attachToAvatar(agent, point, temporary);
43
+ }
44
+ export const llAttachToAvatar = (ctx, args) => {
45
+ attach(ctx, args[0], false);
46
+ return undefined;
47
+ };
48
+ export const llAttachToAvatarTemp = (ctx, args) => {
49
+ attach(ctx, args[0], true);
50
+ return undefined;
51
+ };
52
+ export const llDetachFromAvatar = ctx => {
53
+ const attached = ctx.linkset.attachment;
54
+ if (!attached || ctx.prim !== ctx.linkset.prims[0] || !sameKey(ctx.state.permissions.agent, attached.avatar))
55
+ return undefined;
56
+ // The caller still sees the old point; the simulator detaches asynchronously.
57
+ ctx.linkset.clock.scheduleTask(ctx.script, ctx.state.clock.now, () => ctx.linkset.detachFromAvatar());
58
+ return undefined;
59
+ };
60
+ export const llGetAttached = ctx => ctx.linkset.attachment?.point ?? 0;
61
+ function attachments(ctx, avatar) {
62
+ const known = ctx.linkset.world?.avatars.find(a => sameKey(a.key, avatar));
63
+ if (known && known.region !== ctx.linkset.region)
64
+ return 'NOT ON REGION';
65
+ if (!localAgent(ctx, avatar))
66
+ return 'NOT FOUND';
67
+ return ctx.linkset.peers.filter(l => !l.dead && l.attachment && sameKey(l.attachment.avatar, avatar))
68
+ .sort((a, b) => a.attachment.order - b.attachment.order);
69
+ }
70
+ export const llGetAttachedList = (ctx, args) => {
71
+ const worn = attachments(ctx, args[0]);
72
+ if (typeof worn === 'string')
73
+ return uniformList([worn], 'string');
74
+ return uniformList(worn.filter(l => !isHUD(l.attachment.point)).map(l => l.prims[0].key), 'key');
75
+ };
76
+ export const llGetAttachedListFiltered = (ctx, args) => {
77
+ const avatar = args[0];
78
+ const worn = attachments(ctx, avatar);
79
+ if (typeof worn === 'string')
80
+ return uniformList([worn], 'string');
81
+ const options = args[1];
82
+ const points = new Set();
83
+ let flags = 0;
84
+ if (options.length % 2)
85
+ return [];
86
+ for (let i = 0; i < options.length; i += 2) {
87
+ if (listElementType(options, i) !== 'integer' || listElementType(options, i + 1) !== 'integer')
88
+ return [];
89
+ const rule = options[i];
90
+ const value = options[i + 1];
91
+ if (rule === 1)
92
+ points.add(value);
93
+ else if (rule === 2)
94
+ flags = value;
95
+ else
96
+ return [];
97
+ }
98
+ const experience = ctx.state.experience;
99
+ const canSeeHUDs = !!(flags & 1) && !!experience?.allowedHere &&
100
+ [...experience.agents].some(a => sameKey(a, avatar));
101
+ return uniformList(worn.filter(l => {
102
+ const point = l.attachment.point;
103
+ const hud = isHUD(point);
104
+ if (points.size && !points.has(point) && !(hud && points.has(-1)))
105
+ return false;
106
+ return !hud || (canSeeHUDs && l.allScripts().some(s => s.experience?.id === experience.id));
107
+ }).map(l => l.prims[0].key), 'key');
108
+ };
109
+ // Offsets from the HUD attachment anchor to the screen centre, in screen heights.
110
+ const hudOrigins = [
111
+ [0, 0], [0.5, -0.5], [0, -0.5], [-0.5, -0.5],
112
+ [0, 0], [-0.5, 0.5], [0, 0.5], [0.5, 0.5],
113
+ ];
114
+ export const llWorldPosToHUD = (ctx, args) => {
115
+ const point = ctx.linkset.attachment?.point ?? 0;
116
+ if (!isHUD(point) || !(ctx.state.permissions.granted & PERMISSION_TRACK_CAMERA))
117
+ return ZERO_VECTOR;
118
+ const { pos, rot, fov, aspect } = effectiveCamera(ctx);
119
+ const world = args[0];
120
+ const local = rotateVector({ x: world.x - pos.x, y: world.y - pos.y, z: world.z - pos.z }, conjugate(rot));
121
+ if (local.x === 0)
122
+ return ZERO_VECTOR;
123
+ const scale = 2 * local.x * Math.tan(fov / 2);
124
+ const [y, z] = hudOrigins[point - 31];
125
+ return { x: Math.sign(local.x), y: local.y / scale + y * aspect, z: local.z / scale + z };
126
+ };
127
+ //# sourceMappingURL=attachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/builtins/attachments.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@ import type { BuiltinImpl } from '../runtime.js';
6
6
  */
7
7
  export declare const llStringToBase64: BuiltinImpl;
8
8
  export declare const llBase64ToString: BuiltinImpl;
9
+ /** UTF-8 decode where NUL and each byte of an invalid sequence become `?`. */
10
+ export declare function decodeUtf8Lenient(bytes: Uint8Array): string;
9
11
  /**
10
12
  * llIntegerToBase64(integer x) — encodes the 32-bit big-endian
11
13
  * representation of x as 6 base64 chars (24 bits → 4 chars × 6 bits, padded
@@ -17,14 +19,23 @@ export declare const llBase64ToString: BuiltinImpl;
17
19
  * big-endian integer.
18
20
  */
19
21
  export declare const llIntegerToBase64: BuiltinImpl;
22
+ /**
23
+ * Decodes base64 the way Second Life does for llXorBase64: reading stops at
24
+ * the first character outside `A-Z a-z 0-9 + /` (so `=` ends it too), and
25
+ * bits left over after the last whole byte are dropped. `Buffer.from(s,
26
+ * 'base64')` is more lenient (skips spaces, accepts `-` `_`), so it can't be
27
+ * used here.
28
+ */
29
+ export declare function decodeBase64Strict(s: string): Uint8Array;
20
30
  /**
21
31
  * llXorBase64(string str1, string str2) — xors the bytes of str1 with the
22
32
  * bytes of str2, repeating str2 as needed. An empty key leaves str1 as is.
23
33
  */
24
34
  export declare const llXorBase64: BuiltinImpl;
25
35
  /**
26
- * llBase64ToInteger(string s) — inverse of llIntegerToBase64.
27
- * Returns 0 if the input doesn't decode to at least 4 bytes.
36
+ * llBase64ToInteger(string s) — inverse of llIntegerToBase64. Missing bytes
37
+ * are zero-padded on the right; input longer than 8 characters gives 0.
28
38
  */
29
39
  export declare const llBase64ToInteger: BuiltinImpl;
40
+ export declare const llXorBase64StringsCorrect: BuiltinImpl;
30
41
  //# sourceMappingURL=base64.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/builtins/base64.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB,EAAE,WAG9B,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,WAG9B,CAAA;AA6BD;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAK/B,CAAA;AA6BD;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,WAMzB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAK/B,CAAA"}
1
+ {"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/builtins/base64.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB,EAAE,WAG9B,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,WAG9B,CAAA;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAwB3D;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAK/B,CAAA;AAKD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAexD;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,WAMzB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAM/B,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,WAAyB,CAAA"}
@@ -13,7 +13,7 @@ export const llBase64ToString = (_ctx, args) => {
13
13
  return decodeUtf8Lenient(Buffer.from(s, 'base64'));
14
14
  };
15
15
  /** UTF-8 decode where NUL and each byte of an invalid sequence become `?`. */
16
- function decodeUtf8Lenient(bytes) {
16
+ export function decodeUtf8Lenient(bytes) {
17
17
  const strict = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });
18
18
  let out = '';
19
19
  let i = 0;
@@ -64,7 +64,7 @@ const BASE64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012
64
64
  * 'base64')` is more lenient (skips spaces, accepts `-` `_`), so it can't be
65
65
  * used here.
66
66
  */
67
- function decodeBase64Strict(s) {
67
+ export function decodeBase64Strict(s) {
68
68
  const bytes = [];
69
69
  let bits = 0;
70
70
  let nbits = 0;
@@ -92,14 +92,16 @@ export const llXorBase64 = (_ctx, args) => {
92
92
  return Buffer.from(out).toString('base64');
93
93
  };
94
94
  /**
95
- * llBase64ToInteger(string s) — inverse of llIntegerToBase64.
96
- * Returns 0 if the input doesn't decode to at least 4 bytes.
95
+ * llBase64ToInteger(string s) — inverse of llIntegerToBase64. Missing bytes
96
+ * are zero-padded on the right; input longer than 8 characters gives 0.
97
97
  */
98
98
  export const llBase64ToInteger = (_ctx, args) => {
99
99
  const s = args[0] ?? '';
100
- const buf = Buffer.from(s, 'base64');
101
- if (buf.length < 4)
100
+ if (s.length > 8)
102
101
  return 0;
102
+ const buf = Buffer.alloc(4);
103
+ Buffer.from(s, 'base64').copy(buf, 0, 0, 4);
103
104
  return buf.readInt32BE(0);
104
105
  };
106
+ export const llXorBase64StringsCorrect = llXorBase64;
105
107
  //# sourceMappingURL=base64.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/builtins/base64.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE5C;;;;GAIG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IAC1D,MAAM,CAAC,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAClD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IAC1D,MAAM,CAAC,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IAC/C,OAAO,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;AACpD,CAAC,CAAA;AAED,8EAA8E;AAC9E,SAAS,iBAAiB,CAAC,KAAiB;IAC1C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACzE,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QACnB,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAChH,IAAI,EAAE,GAAkB,IAAI,CAAA;QAC5B,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,EAAE,GAAG,IAAI,CAAA;YACX,CAAC;QACH,CAAC;QACD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,GAAG,IAAI,GAAG,CAAA;YACV,CAAC,IAAI,CAAC,CAAA;QACR,CAAC;aAAM,CAAC;YACN,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YAC7B,CAAC,IAAI,GAAG,CAAA;QACV,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IAC3D,MAAM,CAAC,GAAG,OAAO,CAAE,IAAI,CAAC,CAAC,CAAwB,IAAI,CAAC,CAAC,CAAA;IACvD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC3B,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtB,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAC/B,CAAC,CAAA;AAED,MAAM,eAAe,GACnB,kEAAkE,CAAA;AAEpE;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,CAAS;IACnC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACrC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAK;QAChB,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAA;QACjC,KAAK,IAAI,CAAC,CAAA;QACV,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,KAAK,IAAI,CAAC,CAAA;YACV,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IACrD,MAAM,IAAI,GAAG,kBAAkB,CAAE,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAC,CAAA;IACtE,MAAM,GAAG,GAAG,kBAAkB,CAAE,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAC,CAAA;IACrE,MAAM,GAAG,GACP,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAE,CAAC,CAAA;IAC9E,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IAC3D,MAAM,CAAC,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACpC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAA;IAC5B,OAAO,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;AAC3B,CAAC,CAAA"}
1
+ {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/builtins/base64.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { BuiltinImpl, CallContext } from '../runtime.js';
2
+ import type { Rotation, Vector } from '../values/types.js';
3
+ /** The permission agent's camera, as llGetCamera* report it. */
4
+ export interface Camera {
5
+ pos: Vector;
6
+ rot: Rotation;
7
+ fov: number;
8
+ aspect: number;
9
+ }
10
+ /** In-world, the headless viewer's lens read 1.047198 (60 degrees) and 1.4242. */
11
+ export declare function defaultCamera(): Camera;
12
+ /** Pose shared by camera reads and consumers such as HUD projection. */
13
+ export declare function effectiveCamera(ctx: CallContext): Camera;
14
+ /** llGetCameraPos() — ZERO_VECTOR without PERMISSION_TRACK_CAMERA. */
15
+ export declare const llGetCameraPos: BuiltinImpl;
16
+ /** llGetCameraRot() — ZERO_ROTATION without PERMISSION_TRACK_CAMERA. */
17
+ export declare const llGetCameraRot: BuiltinImpl;
18
+ /** llGetCameraFOV() — 0.0 without PERMISSION_TRACK_CAMERA. */
19
+ export declare const llGetCameraFOV: BuiltinImpl;
20
+ /** llGetCameraAspect() — 0.0 without PERMISSION_TRACK_CAMERA. */
21
+ export declare const llGetCameraAspect: BuiltinImpl;
22
+ /**
23
+ * llSetCameraParams(list rules) — merges [rule, value, ...] pairs into the
24
+ * recorded camera rules; a trailing rule without a value is dropped. Without
25
+ * PERMISSION_CONTROL_CAMERA it does nothing and says nothing.
26
+ */
27
+ export declare const llSetCameraParams: BuiltinImpl;
28
+ /** llClearCameraParams() — forgets every camera rule; needs PERMISSION_CONTROL_CAMERA. */
29
+ export declare const llClearCameraParams: BuiltinImpl;
30
+ /** Prim settings need no runtime camera permission and affect subsequent sits. */
31
+ export declare const llSetCameraEyeOffset: BuiltinImpl;
32
+ export declare const llSetCameraAtOffset: BuiltinImpl;
33
+ export declare const llForceMouselook: BuiltinImpl;
34
+ export declare const llSetLinkCamera: BuiltinImpl;
35
+ //# sourceMappingURL=camera.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../../src/builtins/camera.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAG7D,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAIpE,gEAAgE;AAChE,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,QAAQ,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;CACf;AAED,kFAAkF;AAClF,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AA8BD,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAGxD;AAED,sEAAsE;AACtE,eAAO,MAAM,cAAc,EAAE,WAA+E,CAAA;AAE5G,wEAAwE;AACxE,eAAO,MAAM,cAAc,EAAE,WAAiF,CAAA;AAE9G,8DAA8D;AAC9D,eAAO,MAAM,cAAc,EAAE,WAAiE,CAAA;AAE9F,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,EAAE,WAAoE,CAAA;AAEpG;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAQ/B,CAAA;AAED,0FAA0F;AAC1F,eAAO,MAAM,mBAAmB,EAAE,WAGjC,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,EAAE,WAGlC,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,WAGjC,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,WAG9B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,WAkB7B,CAAA"}
@@ -0,0 +1,104 @@
1
+ import { rotateVector } from '../values/ops.js';
2
+ import { llAxes2Rot } from './math.js';
3
+ import { vec, ZERO_ROTATION, ZERO_VECTOR } from '../values/types.js';
4
+ import { AGENT_MOUSELOOK, LINK_ROOT, LINK_THIS, PERMISSION_CONTROL_CAMERA, PERMISSION_TRACK_CAMERA } from '../generated/constants.js';
5
+ /** In-world, the headless viewer's lens read 1.047198 (60 degrees) and 1.4242. */
6
+ export function defaultCamera() {
7
+ return { pos: ZERO_VECTOR, rot: ZERO_ROTATION, fov: Math.fround(Math.PI / 3), aspect: Math.fround(1.4242) };
8
+ }
9
+ const tracking = (ctx) => (ctx.state.permissions.granted & PERMISSION_TRACK_CAMERA) !== 0;
10
+ const controlling = (ctx) => (ctx.state.permissions.granted & PERMISSION_CONTROL_CAMERA) !== 0;
11
+ /** Seat offsets are captured by World when the avatar sits, then follow the prim. */
12
+ function seatedCamera(ctx) {
13
+ const avatar = ctx.linkset.world?.avatars.find(a => a.key.toLowerCase() === ctx.state.permissions.agent.toLowerCase());
14
+ const seat = avatar?.sittingOn;
15
+ const offsets = avatar?.sittingCamera;
16
+ // Mouselook eye/bone transforms are supplied through Script.setCamera.
17
+ if (!seat || !offsets || (avatar.info & AGENT_MOUSELOOK))
18
+ return null;
19
+ const eye = offsets.eye;
20
+ const at = offsets.at;
21
+ if (eye.x === at.x && eye.y === at.y && eye.z === at.z)
22
+ return null;
23
+ const origin = seat.regionPosition();
24
+ const rotation = seat.regionRotation();
25
+ const offset = rotateVector(eye, rotation);
26
+ const direction = rotateVector({ x: at.x - eye.x, y: at.y - eye.y, z: at.z - eye.z }, rotation);
27
+ const length = Math.hypot(direction.x, direction.y, direction.z);
28
+ const forward = vec(direction.x / length, direction.y / length, direction.z / length);
29
+ const horizontal = Math.hypot(forward.x, forward.y);
30
+ const left = horizontal === 0 ? vec(0, 1, 0) : vec(-forward.y / horizontal, forward.x / horizontal, 0);
31
+ const up = vec(-forward.z * left.y, forward.z * left.x, forward.x * left.y - forward.y * left.x);
32
+ return {
33
+ pos: vec(origin.x + offset.x, origin.y + offset.y, origin.z + offset.z),
34
+ rot: llAxes2Rot(ctx, [forward, left, up]),
35
+ };
36
+ }
37
+ /** Pose shared by camera reads and consumers such as HUD projection. */
38
+ export function effectiveCamera(ctx) {
39
+ const seated = seatedCamera(ctx);
40
+ return seated ? { ...ctx.state.camera, ...seated } : ctx.state.camera;
41
+ }
42
+ /** llGetCameraPos() — ZERO_VECTOR without PERMISSION_TRACK_CAMERA. */
43
+ export const llGetCameraPos = (ctx) => (tracking(ctx) ? effectiveCamera(ctx).pos : ZERO_VECTOR);
44
+ /** llGetCameraRot() — ZERO_ROTATION without PERMISSION_TRACK_CAMERA. */
45
+ export const llGetCameraRot = (ctx) => (tracking(ctx) ? effectiveCamera(ctx).rot : ZERO_ROTATION);
46
+ /** llGetCameraFOV() — 0.0 without PERMISSION_TRACK_CAMERA. */
47
+ export const llGetCameraFOV = (ctx) => (tracking(ctx) ? ctx.state.camera.fov : 0);
48
+ /** llGetCameraAspect() — 0.0 without PERMISSION_TRACK_CAMERA. */
49
+ export const llGetCameraAspect = (ctx) => (tracking(ctx) ? ctx.state.camera.aspect : 0);
50
+ /**
51
+ * llSetCameraParams(list rules) — merges [rule, value, ...] pairs into the
52
+ * recorded camera rules; a trailing rule without a value is dropped. Without
53
+ * PERMISSION_CONTROL_CAMERA it does nothing and says nothing.
54
+ */
55
+ export const llSetCameraParams = (ctx, args) => {
56
+ if (!controlling(ctx))
57
+ return undefined;
58
+ const rules = args[0] ?? [];
59
+ for (let i = 0; i + 1 < rules.length; i += 2) {
60
+ const rule = rules[i];
61
+ if (typeof rule === 'number')
62
+ ctx.state.cameraParams.set(rule, rules[i + 1]);
63
+ }
64
+ return undefined;
65
+ };
66
+ /** llClearCameraParams() — forgets every camera rule; needs PERMISSION_CONTROL_CAMERA. */
67
+ export const llClearCameraParams = (ctx) => {
68
+ if (controlling(ctx))
69
+ ctx.state.cameraParams.clear();
70
+ return undefined;
71
+ };
72
+ /** Prim settings need no runtime camera permission and affect subsequent sits. */
73
+ export const llSetCameraEyeOffset = (ctx, args) => {
74
+ ctx.prim.cameraEyeOffset = { ...args[0] };
75
+ return undefined;
76
+ };
77
+ export const llSetCameraAtOffset = (ctx, args) => {
78
+ ctx.prim.cameraAtOffset = { ...args[0] };
79
+ return undefined;
80
+ };
81
+ export const llForceMouselook = (ctx, args) => {
82
+ ctx.prim.forceMouselook = args[0] !== 0;
83
+ return undefined;
84
+ };
85
+ export const llSetLinkCamera = (ctx, args) => {
86
+ const link = args[0];
87
+ const root = ctx.linkset.prims[0];
88
+ const occupiedLoneRoot = ctx.linkset.prims.length === 1 &&
89
+ ctx.linkset.world?.avatars.some(a => a.sittingOn === root);
90
+ // In-world: every negative selector except LINK_THIS picks the first other
91
+ // prim, even LINK_SET / LINK_ALL_CHILDREN and unknown negative values.
92
+ const target = link === LINK_THIS ? ctx.prim
93
+ : link < 0 ? ctx.linkset.prims.find(p => p !== ctx.prim)
94
+ : link === 0 && occupiedLoneRoot ? undefined
95
+ : link === 0 && ctx.prim !== root ? root
96
+ : link === LINK_ROOT && occupiedLoneRoot ? root
97
+ : ctx.linkset.prims.find(p => p.linkNumber === link);
98
+ if (target) {
99
+ target.cameraEyeOffset = { ...args[1] };
100
+ target.cameraAtOffset = { ...args[2] };
101
+ }
102
+ return undefined;
103
+ };
104
+ //# sourceMappingURL=camera.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera.js","sourceRoot":"","sources":["../../src/builtins/camera.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { BuiltinImpl } from '../runtime.js';
2
+ import type { Script } from '../script.js';
3
+ export interface CollisionFilter {
4
+ name: string;
5
+ key: string;
6
+ accept: boolean;
7
+ }
8
+ /** Requested impact sound and volume. Audio playback and particles are not simulated. */
9
+ export interface CollisionSound {
10
+ sound: string;
11
+ volume: number;
12
+ }
13
+ export declare const llCollisionFilter: BuiltinImpl;
14
+ export declare const llVolumeDetect: BuiltinImpl;
15
+ export declare const llCollisionSound: BuiltinImpl;
16
+ /** Foreign inventory drops are opt-in, and only the root can change this flag. */
17
+ export declare const llAllowInventoryDrop: BuiltinImpl;
18
+ export declare const llSetRemoteScriptAccessPin: BuiltinImpl;
19
+ /** Filter at test injection, before queueing. Completed events keep their detected data. */
20
+ export declare function withCollisionFilter(script: Script, event: string, payload: Record<string, unknown>, deliver: (payload: Record<string, unknown>) => void): void;
21
+ //# sourceMappingURL=collision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collision.d.ts","sourceRoot":"","sources":["../../src/builtins/collision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAK1C,MAAM,WAAW,eAAe;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE;AAC/E,yFAAyF;AACzF,MAAM,WAAW,cAAc;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAGjE,eAAO,MAAM,iBAAiB,EAAE,WAG/B,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,WAO5B,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,WAE9B,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,EAAE,WAElC,CAAA;AAED,eAAO,MAAM,0BAA0B,EAAE,WAExC,CAAA;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,IAAI,CAU9J"}
@@ -0,0 +1,44 @@
1
+ import { NULL_KEY } from '../values/types.js';
2
+ import { STATUS_PHANTOM } from '../generated/constants.js';
3
+ const KEY = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
4
+ export const llCollisionFilter = (ctx, args) => {
5
+ const key = String(args[1]);
6
+ ctx.prim.collisionFilter = { name: String(args[0]), key: KEY.test(key) ? key.toLowerCase() : NULL_KEY, accept: Number(args[2]) !== 0 };
7
+ };
8
+ export const llVolumeDetect = (ctx, args) => {
9
+ const enabled = Number(args[0]) !== 0;
10
+ for (const prim of ctx.linkset.prims) {
11
+ if (prim.volumeDetect === enabled)
12
+ continue;
13
+ prim.volumeDetect = enabled;
14
+ prim.setStatus(STATUS_PHANTOM, enabled);
15
+ }
16
+ };
17
+ export const llCollisionSound = (ctx, args) => {
18
+ ctx.prim.collisionSound = { sound: String(args[0]), volume: Number(args[1]) };
19
+ };
20
+ /** Foreign inventory drops are opt-in, and only the root can change this flag. */
21
+ export const llAllowInventoryDrop = (ctx, args) => {
22
+ if (ctx.prim === ctx.linkset.prims[0])
23
+ ctx.prim.allowInventoryDrop = Number(args[0]) !== 0;
24
+ };
25
+ export const llSetRemoteScriptAccessPin = (ctx, args) => {
26
+ ctx.prim.remoteScriptAccessPin = Number(args[0]);
27
+ };
28
+ /** Filter at test injection, before queueing. Completed events keep their detected data. */
29
+ export function withCollisionFilter(script, event, payload, deliver) {
30
+ if (event !== 'collision_start' && event !== 'collision' && event !== 'collision_end')
31
+ return deliver(payload);
32
+ if (script.host.volumeDetect && event === 'collision')
33
+ return;
34
+ const filter = script.host.collisionFilter;
35
+ if (!Array.isArray(payload['detected']))
36
+ return deliver(payload);
37
+ const detected = payload['detected'].filter(entry => {
38
+ const matches = (!filter.name || entry.name === filter.name) && (filter.key === NULL_KEY || entry.key.toLowerCase() === filter.key);
39
+ return matches === filter.accept;
40
+ });
41
+ if (detected.length)
42
+ deliver({ ...payload, detected, num_detected: detected.length });
43
+ }
44
+ //# sourceMappingURL=collision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collision.js","sourceRoot":"","sources":["../../src/builtins/collision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { BuiltinImpl } from '../runtime.js';
2
+ /** Controls held by llTakeControls. */
3
+ export interface TakenControls {
4
+ readonly controls: number;
5
+ readonly accept: boolean;
6
+ readonly passOn: boolean;
7
+ }
8
+ /**
9
+ * llTakeControls(integer controls, integer accept, integer pass_on) — takes
10
+ * the permission agent's controls. Without PERMISSION_TAKE_CONTROLS it does
11
+ * nothing and says nothing, as measured in-world.
12
+ */
13
+ export declare const llTakeControls: BuiltinImpl;
14
+ /**
15
+ * llReleaseControls() — lets the controls go, drops the control events still
16
+ * queued, and drops PERMISSION_TAKE_CONTROLS, taken or not.
17
+ */
18
+ export declare const llReleaseControls: BuiltinImpl;
19
+ //# sourceMappingURL=controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../src/builtins/controls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,uCAAuC;AACvC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,WAQ5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAK/B,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { PERMISSION_TAKE_CONTROLS } from '../generated/constants.js';
2
+ /**
3
+ * llTakeControls(integer controls, integer accept, integer pass_on) — takes
4
+ * the permission agent's controls. Without PERMISSION_TAKE_CONTROLS it does
5
+ * nothing and says nothing, as measured in-world.
6
+ */
7
+ export const llTakeControls = (ctx, args) => {
8
+ if (!(ctx.state.permissions.granted & PERMISSION_TAKE_CONTROLS))
9
+ return undefined;
10
+ ctx.state.controls.taken = {
11
+ controls: args[0] ?? 0,
12
+ accept: (args[1] ?? 0) !== 0,
13
+ passOn: (args[2] ?? 0) !== 0,
14
+ };
15
+ return undefined;
16
+ };
17
+ /**
18
+ * llReleaseControls() — lets the controls go, drops the control events still
19
+ * queued, and drops PERMISSION_TAKE_CONTROLS, taken or not.
20
+ */
21
+ export const llReleaseControls = (ctx) => {
22
+ ctx.state.controls.taken = null;
23
+ ctx.linkset.clock.purgeEvent(ctx.script, 'control');
24
+ ctx.state.permissions.granted &= ~PERMISSION_TAKE_CONTROLS;
25
+ return undefined;
26
+ };
27
+ //# sourceMappingURL=controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls.js","sourceRoot":"","sources":["../../src/builtins/controls.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AASpE;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;IACvD,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,GAAG,wBAAwB,CAAC;QAAE,OAAO,SAAS,CAAA;IACjF,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG;QACzB,QAAQ,EAAG,IAAI,CAAC,CAAC,CAAwB,IAAI,CAAC;QAC9C,MAAM,EAAE,CAAE,IAAI,CAAC,CAAC,CAAwB,IAAI,CAAC,CAAC,KAAK,CAAC;QACpD,MAAM,EAAE,CAAE,IAAI,CAAC,CAAC,CAAwB,IAAI,CAAC,CAAC,KAAK,CAAC;KACrD,CAAA;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAgB,CAAC,GAAG,EAAE,EAAE;IACpD,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAA;IAC/B,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACnD,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC,wBAAwB,CAAA;IAC1D,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA"}
@@ -0,0 +1,24 @@
1
+ import type { BuiltinImpl } from '../runtime.js';
2
+ import type { Script } from '../script.js';
3
+ import type { LinksetClock } from '../clock.js';
4
+ /** An avatar supplied by a test; scripts represent its attachments. */
5
+ export interface CombatAvatar {
6
+ health: number;
7
+ damageEnabled: boolean;
8
+ readonly scripts?: readonly Script[];
9
+ }
10
+ interface RegisteredCombatAvatar extends CombatAvatar {
11
+ readonly region: string | undefined;
12
+ }
13
+ export declare function combatAvatars(script: Script): Map<string, RegisteredCombatAvatar>;
14
+ /** Called when a damage handler starts and finishes, including suspension/abandonment. */
15
+ export declare function enterDamageEvent(payload: Record<string, unknown>): void;
16
+ export declare function leaveDamageEvent(payload: Record<string, unknown>): void;
17
+ /** Release a barrier when reset, state change, death or queue overflow drops its event. */
18
+ export declare function flushDamageEvents(clock: LinksetClock): void;
19
+ export declare const llGetHealth: BuiltinImpl;
20
+ export declare const llSetDamage: BuiltinImpl;
21
+ export declare const llAdjustDamage: BuiltinImpl;
22
+ export declare const llDamage: BuiltinImpl;
23
+ export {};
24
+ //# sourceMappingURL=damage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"damage.d.ts","sourceRoot":"","sources":["../../src/builtins/damage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAA;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAG1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAK/C,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC;AAED,UAAU,sBAAuB,SAAQ,YAAY;IAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE;AAE7F,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAIjF;AAUD,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAGvE;AACD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAMvE;AAED,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAU3D;AAqCD,eAAO,MAAM,WAAW,EAAE,WAWzB,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,WAGzB,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,WAO5B,CAAA;AAoBD,eAAO,MAAM,QAAQ,EAAE,WA0CtB,CAAA"}