@sagl/server 0.0.0-stage → 0.1.0-next.51

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 (129) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +61 -2
  3. package/dist/actions.d.ts +46 -0
  4. package/dist/actions.js +80 -0
  5. package/dist/actions.js.map +1 -0
  6. package/dist/animations.d.ts +32 -0
  7. package/dist/animations.js +95 -0
  8. package/dist/animations.js.map +1 -0
  9. package/dist/audio.d.ts +180 -0
  10. package/dist/audio.js +353 -0
  11. package/dist/audio.js.map +1 -0
  12. package/dist/audio_effects.d.ts +219 -0
  13. package/dist/audio_effects.js +84 -0
  14. package/dist/audio_effects.js.map +1 -0
  15. package/dist/camera.d.ts +188 -0
  16. package/dist/camera.js +247 -0
  17. package/dist/camera.js.map +1 -0
  18. package/dist/claims.d.ts +27 -0
  19. package/dist/claims.js +48 -0
  20. package/dist/claims.js.map +1 -0
  21. package/dist/commands.d.ts +135 -0
  22. package/dist/commands.js +373 -0
  23. package/dist/commands.js.map +1 -0
  24. package/dist/console.d.ts +21 -0
  25. package/dist/console.js +100 -0
  26. package/dist/console.js.map +1 -0
  27. package/dist/constants.d.ts +654 -0
  28. package/dist/constants.js +657 -0
  29. package/dist/constants.js.map +1 -0
  30. package/dist/cutscene.d.ts +47 -0
  31. package/dist/cutscene.js +190 -0
  32. package/dist/cutscene.js.map +1 -0
  33. package/dist/draw.d.ts +106 -0
  34. package/dist/draw.js +132 -0
  35. package/dist/draw.js.map +1 -0
  36. package/dist/effects.d.ts +91 -0
  37. package/dist/effects.js +116 -0
  38. package/dist/effects.js.map +1 -0
  39. package/dist/gangzones.d.ts +47 -0
  40. package/dist/gangzones.js +122 -0
  41. package/dist/gangzones.js.map +1 -0
  42. package/dist/geo.d.ts +11 -0
  43. package/dist/geo.js +25 -0
  44. package/dist/geo.js.map +1 -0
  45. package/dist/hud.d.ts +159 -0
  46. package/dist/hud.js +247 -0
  47. package/dist/hud.js.map +1 -0
  48. package/dist/index.d.ts +40 -0
  49. package/dist/index.js +43 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/interaction.d.ts +81 -0
  52. package/dist/interaction.js +143 -0
  53. package/dist/interaction.js.map +1 -0
  54. package/dist/junctions.d.ts +1 -0
  55. package/dist/junctions.js +330 -0
  56. package/dist/junctions.js.map +1 -0
  57. package/dist/map.d.ts +55 -0
  58. package/dist/map.js +71 -0
  59. package/dist/map.js.map +1 -0
  60. package/dist/menu.d.ts +96 -0
  61. package/dist/menu.js +129 -0
  62. package/dist/menu.js.map +1 -0
  63. package/dist/mission.d.ts +482 -0
  64. package/dist/mission.js +1258 -0
  65. package/dist/mission.js.map +1 -0
  66. package/dist/models.d.ts +56 -0
  67. package/dist/models.js +71 -0
  68. package/dist/models.js.map +1 -0
  69. package/dist/modshop.d.ts +229 -0
  70. package/dist/modshop.js +904 -0
  71. package/dist/modshop.js.map +1 -0
  72. package/dist/modshop_data.d.ts +44 -0
  73. package/dist/modshop_data.js +287 -0
  74. package/dist/modshop_data.js.map +1 -0
  75. package/dist/native.d.ts +809 -0
  76. package/dist/native.js +27 -0
  77. package/dist/native.js.map +1 -0
  78. package/dist/objects.d.ts +249 -0
  79. package/dist/objects.js +455 -0
  80. package/dist/objects.js.map +1 -0
  81. package/dist/paint.d.ts +124 -0
  82. package/dist/paint.js +84 -0
  83. package/dist/paint.js.map +1 -0
  84. package/dist/paynspray.d.ts +44 -0
  85. package/dist/paynspray.js +177 -0
  86. package/dist/paynspray.js.map +1 -0
  87. package/dist/ped.d.ts +335 -0
  88. package/dist/ped.js +536 -0
  89. package/dist/ped.js.map +1 -0
  90. package/dist/player.d.ts +685 -0
  91. package/dist/player.js +1163 -0
  92. package/dist/player.js.map +1 -0
  93. package/dist/screeneffects.d.ts +99 -0
  94. package/dist/screeneffects.js +257 -0
  95. package/dist/screeneffects.js.map +1 -0
  96. package/dist/scripts.d.ts +69 -0
  97. package/dist/scripts.js +125 -0
  98. package/dist/scripts.js.map +1 -0
  99. package/dist/server.d.ts +713 -0
  100. package/dist/server.js +1080 -0
  101. package/dist/server.js.map +1 -0
  102. package/dist/shopblips.d.ts +9 -0
  103. package/dist/shopblips.js +30 -0
  104. package/dist/shopblips.js.map +1 -0
  105. package/dist/special.d.ts +33 -0
  106. package/dist/special.js +26 -0
  107. package/dist/special.js.map +1 -0
  108. package/dist/splash.d.ts +42 -0
  109. package/dist/splash.js +55 -0
  110. package/dist/splash.js.map +1 -0
  111. package/dist/text.d.ts +19 -0
  112. package/dist/text.js +25 -0
  113. package/dist/text.js.map +1 -0
  114. package/dist/ui.d.ts +141 -0
  115. package/dist/ui.js +243 -0
  116. package/dist/ui.js.map +1 -0
  117. package/dist/vehicle.d.ts +306 -0
  118. package/dist/vehicle.js +612 -0
  119. package/dist/vehicle.js.map +1 -0
  120. package/dist/vehiclecolors.d.ts +26 -0
  121. package/dist/vehiclecolors.js +49 -0
  122. package/dist/vehiclecolors.js.map +1 -0
  123. package/dist/world.d.ts +222 -0
  124. package/dist/world.js +227 -0
  125. package/dist/world.js.map +1 -0
  126. package/dist/zone.d.ts +89 -0
  127. package/dist/zone.js +140 -0
  128. package/dist/zone.js.map +1 -0
  129. package/package.json +33 -4
@@ -0,0 +1,455 @@
1
+ import { isCustomModelId } from "./models.js";
2
+ import { mapColor } from "./map.js";
3
+ import { GameSound } from "./constants.js";
4
+ import { Ped } from "./ped.js";
5
+ import { Player } from "./player.js";
6
+ import { Vehicle } from "./vehicle.js";
7
+ /** @internal Something sent to some players (or everyone, players joining later too). */
8
+ export class Broadcast {
9
+ #send;
10
+ #players;
11
+ #to;
12
+ spec;
13
+ constructor(send, players, to, spec) {
14
+ this.#send = send;
15
+ this.#players = players;
16
+ this.#to = to ? [...to] : null;
17
+ this.spec = spec;
18
+ this.sendAll();
19
+ }
20
+ sees(player) {
21
+ return !this.#to || this.#to.includes(player);
22
+ }
23
+ sendAll(extra = {}) {
24
+ for (const p of this.#players())
25
+ if (this.sees(p) && p.connected)
26
+ this.#send(p, { ...this.spec, ...extra });
27
+ }
28
+ replay(player) {
29
+ if (this.sees(player))
30
+ this.#send(player, this.spec);
31
+ }
32
+ /** Every connected player who sees it. */
33
+ each(fn) {
34
+ for (const p of this.#players())
35
+ if (this.sees(p) && p.connected)
36
+ fn(p);
37
+ }
38
+ }
39
+ // 0xRRGGBBAA as the wire's ARGB.
40
+ const argb = (c) => (((c & 0xff) << 24) | (c >>> 8)) >>> 0;
41
+ /**
42
+ * One of the server's objects (`server.createObject()`): any of the game's
43
+ * object models, where you put it. Players' games never move or break it
44
+ * on their own; the server moves it (`move()`) and decides its damage.
45
+ */
46
+ export class GameObject {
47
+ id;
48
+ model;
49
+ #b;
50
+ #health;
51
+ #exists = true;
52
+ #onHit = [];
53
+ #onDestroyed = [];
54
+ #forget;
55
+ #sendMaterial;
56
+ #materials = new Map();
57
+ /** @internal */
58
+ constructor(id, model, b, health, forget, sendMaterial) {
59
+ this.id = id;
60
+ this.model = model;
61
+ this.#b = b;
62
+ this.#health = health;
63
+ this.#forget = forget;
64
+ this.#sendMaterial = sendMaterial;
65
+ }
66
+ /**
67
+ * Draws one of its model's materials (`index`, 0-15, in the order the
68
+ * model has them) otherwise, as SA-MP's SetObjectMaterial: another
69
+ * texture (from any model's textures, a custom model's, or an image
70
+ * client file), tinted, or both. Only this object changes.
71
+ *
72
+ * ```ts
73
+ * atm.setMaterial(1, { model: 2942, txd: "kmb_atmx", texture: "kmb_chip1" }); // a game texture
74
+ * atm.setMaterial(1, { image: "textures/poster.png" }); // your own picture
75
+ * atm.setMaterial(0, { color: "#ff3030" }); // its own, tinted
76
+ * ```
77
+ */
78
+ setMaterial(index, options) {
79
+ if (!Number.isInteger(index) || index < 0 || index > 15)
80
+ throw new RangeError(`not a material index: ${index} (0-15)`);
81
+ if (options.texture !== undefined && options.model === undefined)
82
+ throw new TypeError("a texture needs the model it's loaded with");
83
+ this.#setMaterial({
84
+ objectId: this.id, index, model: options.model ?? 0, txd: options.txd ?? "", texture: options.texture ?? "",
85
+ file: options.image ?? "", color: options.color === undefined ? 0 : argb(mapColor(options.color, 0xffffffff)),
86
+ });
87
+ }
88
+ /**
89
+ * Text as one of its materials, as SA-MP's SetObjectMaterialText: drawn
90
+ * on a canvas (`MaterialSize`) in place of its texture. `\n` breaks a
91
+ * line; `{RRGGBB}` colours what follows.
92
+ *
93
+ * ```ts
94
+ * atm.setMaterialText(1, "{ffcc00}SAGL\nBANK", { size: MaterialSize.Size256x128, fontSize: 48, bold: true, align: MaterialTextAlign.Center });
95
+ * ```
96
+ */
97
+ setMaterialText(index, text, options = {}) {
98
+ if (!Number.isInteger(index) || index < 0 || index > 15)
99
+ throw new RangeError(`not a material index: ${index} (0-15)`);
100
+ this.#setMaterial({
101
+ objectId: this.id, index, isText: true, text, size: options.size ?? 0, font: options.font ?? "",
102
+ fontSize: options.fontSize ?? 0, bold: options.bold ?? false,
103
+ fontColor: argb(mapColor(options.color, 0xffffffff)),
104
+ backColor: options.background === undefined ? 0 : argb(mapColor(options.background, 0)),
105
+ align: options.align ?? 0,
106
+ });
107
+ }
108
+ /** Material `index` as its model has it again (or all, with none given). */
109
+ resetMaterial(index) {
110
+ for (const i of index === undefined ? [...this.#materials.keys()] : [index]) {
111
+ if (!this.#materials.delete(i))
112
+ continue;
113
+ this.#b.each((p) => this.#sendMaterial(p, { objectId: this.id, index: i, remove: true }));
114
+ }
115
+ }
116
+ #setMaterial(m) {
117
+ if (!this.#exists)
118
+ return;
119
+ this.#materials.set(m.index, m);
120
+ this.#b.each((p) => this.#sendMaterial(p, m));
121
+ }
122
+ get exists() {
123
+ return this.#exists;
124
+ }
125
+ get position() {
126
+ return { x: this.#b.spec.x ?? 0, y: this.#b.spec.y ?? 0, z: this.#b.spec.z ?? 0 };
127
+ }
128
+ get rotation() {
129
+ return { x: this.#b.spec.rx ?? 0, y: this.#b.spec.ry ?? 0, z: this.#b.spec.rz ?? 0 };
130
+ }
131
+ /** Its health (breakable ones), or Infinity. */
132
+ get health() {
133
+ return this.#health;
134
+ }
135
+ /**
136
+ * Glides it to `position` (and `rotation`) over `ms` (0: puts it there).
137
+ * Resolves when it's there: gates, shutters, lifts.
138
+ */
139
+ move(position, rotation, ms = 0) {
140
+ if (this.#exists) {
141
+ Object.assign(this.#b.spec, { x: position.x, y: position.y, z: position.z }, rotation ? { rx: rotation.x, ry: rotation.y, rz: rotation.z } : {});
142
+ this.#b.sendAll({ moveMs: Math.max(0, Math.trunc(ms)) });
143
+ }
144
+ return new Promise((resolve) => setTimeout(resolve, ms));
145
+ }
146
+ /** Collision on or off (walk through it, or not). */
147
+ set collision(on) {
148
+ this.#b.spec.noCollision = !on;
149
+ this.#b.sendAll();
150
+ }
151
+ /**
152
+ * `fn(player, damage, weapon)` when a player hurts it (breakable ones),
153
+ * before it counts: return false to ignore it, or a number for the
154
+ * damage it does instead.
155
+ */
156
+ onHit(fn) {
157
+ this.#onHit.push(fn);
158
+ return this;
159
+ }
160
+ /** `fn(by)` when it's destroyed by damage (`by`: whoever did it). */
161
+ onDestroyed(fn) {
162
+ this.#onDestroyed.push(fn);
163
+ return this;
164
+ }
165
+ /** Takes it away for everyone; `shatter` breaks it apart first (glass, crates). */
166
+ destroy(options = {}) {
167
+ if (!this.#exists)
168
+ return;
169
+ this.#exists = false;
170
+ this.#b.sendAll({ remove: true, shatter: options.shatter ?? false });
171
+ this.#forget(this);
172
+ }
173
+ /** @internal */
174
+ replay(player) {
175
+ this.#b.replay(player);
176
+ if (this.#b.sees(player))
177
+ for (const m of this.#materials.values())
178
+ this.#sendMaterial(player, m);
179
+ }
180
+ /** @internal */
181
+ hit(player, damage, weapon) {
182
+ if (!this.#exists || !this.#b.spec.breakable || !this.#b.sees(player))
183
+ return;
184
+ const p = player.position, o = this.position;
185
+ if (Math.hypot(p.x - o.x, p.y - o.y, p.z - o.z) > 200)
186
+ return;
187
+ let amount = Math.min(Math.max(0, damage), 1000);
188
+ for (const fn of this.#onHit) {
189
+ try {
190
+ const r = fn(player, amount, weapon);
191
+ if (r === false)
192
+ return;
193
+ if (typeof r === "number")
194
+ amount = Math.max(0, r);
195
+ }
196
+ catch (err) {
197
+ console.error("[sagl] object hit handler threw:", err);
198
+ }
199
+ }
200
+ this.#health -= amount;
201
+ if (this.#health > 0)
202
+ return;
203
+ this.destroy({ shatter: true });
204
+ for (const fn of this.#onDestroyed) {
205
+ try {
206
+ fn(player);
207
+ }
208
+ catch (err) {
209
+ console.error("[sagl] object destroyed handler threw:", err);
210
+ }
211
+ }
212
+ }
213
+ }
214
+ // The game's own pickup models.
215
+ const MODEL_HEALTH = 1240, MODEL_ARMOUR = 1242, MODEL_MONEY = 1212;
216
+ /** A pickup (`server.createPickup()`). */
217
+ export class Pickup {
218
+ id;
219
+ options;
220
+ #b;
221
+ #exists = true;
222
+ #taken = false;
223
+ #timer = null;
224
+ #onPickup = [];
225
+ #forget;
226
+ /** @internal */
227
+ label = null;
228
+ /** @internal */
229
+ #sound;
230
+ /** @internal */
231
+ constructor(id, options, b, forget, sound) {
232
+ this.id = id;
233
+ this.options = options;
234
+ this.#b = b;
235
+ this.#forget = forget;
236
+ this.#sound = sound;
237
+ }
238
+ get exists() {
239
+ return this.#exists;
240
+ }
241
+ /** Taken, and not back yet. */
242
+ get taken() {
243
+ return this.#taken;
244
+ }
245
+ get position() {
246
+ return this.options.position;
247
+ }
248
+ /**
249
+ * `fn(player)` when a player takes it, before they get what it holds:
250
+ * return false to refuse (it stays, they get nothing).
251
+ */
252
+ onPickup(fn) {
253
+ this.#onPickup.push(fn);
254
+ return this;
255
+ }
256
+ /** Takes it away for everyone. */
257
+ remove() {
258
+ if (!this.#exists)
259
+ return;
260
+ this.#exists = false;
261
+ if (this.#timer)
262
+ clearTimeout(this.#timer);
263
+ this.#b.sendAll({ remove: true });
264
+ this.label?.remove();
265
+ this.#forget(this);
266
+ }
267
+ /** @internal */
268
+ replay(player) {
269
+ this.#b.replay(player);
270
+ }
271
+ /** @internal Their game says they walked into it: checked, then given. */
272
+ touch(player) {
273
+ if (!this.#exists || this.#taken || !this.#b.sees(player) || !player.alive)
274
+ return;
275
+ const o = this.options;
276
+ if (player.vehicle && !o.inVehicle)
277
+ return;
278
+ const p = player.position, at = o.position;
279
+ if (Math.hypot(p.x - at.x, p.y - at.y) > (player.vehicle ? 7 : 4) || Math.abs(p.z - at.z) > 4)
280
+ return;
281
+ for (const fn of this.#onPickup) {
282
+ try {
283
+ if (fn(player) === false)
284
+ return;
285
+ }
286
+ catch (err) {
287
+ console.error("[sagl] pickup handler threw:", err);
288
+ return;
289
+ }
290
+ }
291
+ if (o.weapon)
292
+ player.giveWeapon(o.weapon, o.ammo ?? 30);
293
+ if (o.health !== undefined)
294
+ player.health = Math.max(player.health, o.health);
295
+ if (o.armour !== undefined)
296
+ player.armour = Math.max(player.armour, o.armour);
297
+ if (o.money)
298
+ player.giveMoney(o.money);
299
+ // The game's pickup sound, as theirs: for what it held.
300
+ this.#sound(player, o.weapon ? GameSound.PickupWeapon : o.money ? GameSound.PickupMoney
301
+ : o.health !== undefined ? GameSound.PickupHealth : o.armour !== undefined ? GameSound.PickupArmour : GameSound.PickupInfo);
302
+ if (o.respawn === undefined) {
303
+ this.remove();
304
+ return;
305
+ }
306
+ this.#taken = true;
307
+ this.#b.spec.hidden = true;
308
+ this.#b.sendAll();
309
+ this.#timer = setTimeout(() => {
310
+ this.#taken = false;
311
+ this.#b.spec.hidden = false;
312
+ this.#b.sendAll();
313
+ }, Math.max(0, o.respawn));
314
+ }
315
+ }
316
+ /** Floating text in the world (`server.labels.add()`). */
317
+ export class Label {
318
+ id;
319
+ /** @internal What it's on (LabelSpec.on, target). */
320
+ on;
321
+ /** @internal */
322
+ target;
323
+ #b;
324
+ #exists = true;
325
+ #forget;
326
+ /** @internal */
327
+ constructor(id, b, forget) {
328
+ this.id = id;
329
+ this.on = b.spec.on ?? 0;
330
+ this.target = b.spec.target ?? 0;
331
+ this.#b = b;
332
+ this.#forget = forget;
333
+ }
334
+ /** Changes its text (game codes and `gxt()` work). */
335
+ set text(text) {
336
+ this.#b.spec.text = text.slice(0, 255);
337
+ if (this.#exists)
338
+ this.#b.sendAll();
339
+ }
340
+ get text() {
341
+ return this.#b.spec.text ?? "";
342
+ }
343
+ set color(color) {
344
+ this.#b.spec.color = mapColor(color, 0xffffffff);
345
+ if (this.#exists)
346
+ this.#b.sendAll();
347
+ }
348
+ remove() {
349
+ if (!this.#exists)
350
+ return;
351
+ this.#exists = false;
352
+ this.#b.sendAll({ remove: true });
353
+ this.#forget(this);
354
+ }
355
+ /** @internal */
356
+ replay(player) {
357
+ this.#b.replay(player);
358
+ }
359
+ }
360
+ // ---- The server's -------------------------------------------------------------------------
361
+ /** @internal The server's objects, pickups and labels. */
362
+ export class WorldThings {
363
+ #native;
364
+ #players;
365
+ #next = 1;
366
+ objects = new Map();
367
+ pickups = new Map();
368
+ labels = new Map();
369
+ constructor(native, players) {
370
+ this.#native = native;
371
+ this.#players = players;
372
+ }
373
+ createObject(model, position, rotation = { x: 0, y: 0, z: 0 }, options = {}) {
374
+ if (!Number.isInteger(model) || (model <= 0 && !isCustomModelId(model)))
375
+ throw new RangeError(`not an object model: ${model}`);
376
+ const id = this.#next++;
377
+ const spec = {
378
+ id, model, x: position.x, y: position.y, z: position.z, rx: rotation.x, ry: rotation.y, rz: rotation.z,
379
+ noCollision: options.collision === false, breakable: options.health !== undefined,
380
+ interior: options.interior ?? 0, streamDistance: options.streamDistance ?? 0,
381
+ };
382
+ const b = new Broadcast((p, s) => this.#native.serverObject(p.id, s), this.#players, options.visibleTo, spec);
383
+ const o = new GameObject(id, model, b, options.health ?? Infinity, (x) => {
384
+ this.objects.delete(x.id);
385
+ this.forgetTarget(4, x.id);
386
+ }, (p, m) => this.#native.objectMaterial(p.id, m));
387
+ this.objects.set(id, o);
388
+ return o;
389
+ }
390
+ createPickup(options) {
391
+ const model = options.model ?? (options.weapon ? 0 : options.health !== undefined ? MODEL_HEALTH
392
+ : options.armour !== undefined ? MODEL_ARMOUR : options.money ? MODEL_MONEY : 0);
393
+ if (!model && !options.weapon)
394
+ throw new TypeError("a pickup needs a weapon, health, armour, money or a model");
395
+ const id = this.#next++;
396
+ const at = options.position;
397
+ const spec = {
398
+ id, model, weapon: options.weapon ?? 0, x: at.x, y: at.y, z: at.z, inVehicle: options.inVehicle ?? false,
399
+ interior: options.interior ?? 0,
400
+ };
401
+ const b = new Broadcast((p, s) => this.#native.pickup(p.id, s), this.#players, options.visibleTo, spec);
402
+ const pickup = new Pickup(id, { ...options }, b, (x) => {
403
+ this.pickups.delete(x.id);
404
+ this.forgetTarget(5, x.id);
405
+ }, (p, sound) => this.#native.gameSound(p.id, { sound }));
406
+ this.pickups.set(id, pickup);
407
+ if (options.label)
408
+ pickup.label = this.addLabel(options.label, pickup, { to: options.visibleTo, interior: options.interior ?? 0 });
409
+ return pickup;
410
+ }
411
+ addLabel(text, at, options = {}) {
412
+ const id = this.#next++;
413
+ let on = 0, target = 0, offset = { x: 0, y: 0, z: 0 };
414
+ if (at instanceof Player)
415
+ [on, target, offset] = [2, at.id, { x: 0, y: 0, z: 1.1 }];
416
+ else if (at instanceof Vehicle)
417
+ [on, target, offset] = [3, at.id, { x: 0, y: 0, z: 1.5 }];
418
+ else if (at instanceof Ped)
419
+ [on, target, offset] = [1, at.id, { x: 0, y: 0, z: 1.1 }];
420
+ else if (at instanceof GameObject)
421
+ [on, target, offset] = [4, at.id, { x: 0, y: 0, z: 1.0 }];
422
+ else if (at instanceof Pickup)
423
+ [on, target, offset] = [5, at.id, { x: 0, y: 0, z: 0.8 }];
424
+ else
425
+ offset = { x: at.x, y: at.y, z: at.z };
426
+ if (options.offset) {
427
+ offset = on ? options.offset : { x: offset.x + options.offset.x, y: offset.y + options.offset.y, z: offset.z + options.offset.z };
428
+ }
429
+ const spec = {
430
+ id, text: text.slice(0, 255), x: offset.x, y: offset.y, z: offset.z, on, target,
431
+ color: options.color === undefined ? 0 : mapColor(options.color, 0xffffffff),
432
+ distance: options.distance ?? 20, throughWalls: options.throughWalls ?? false,
433
+ interior: options.interior ?? (on ? -1 : 0),
434
+ };
435
+ const b = new Broadcast((p, s) => this.#native.label(p.id, s), this.#players, options.to, spec);
436
+ const label = new Label(id, b, (x) => this.labels.delete(x.id));
437
+ this.labels.set(id, label);
438
+ return label;
439
+ }
440
+ /** Labels on something that's gone (its id may be another's later). */
441
+ forgetTarget(on, target) {
442
+ for (const l of [...this.labels.values()])
443
+ if (l.on === on && l.target === target)
444
+ l.remove();
445
+ }
446
+ replay(player) {
447
+ for (const o of this.objects.values())
448
+ o.replay(player);
449
+ for (const p of this.pickups.values())
450
+ p.replay(player);
451
+ for (const l of this.labels.values())
452
+ l.replay(player);
453
+ }
454
+ }
455
+ //# sourceMappingURL=objects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objects.js","sourceRoot":"","sources":["../src/objects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ /** Which of a car's colours a finish is on. */
2
+ export type PaintSlots = "both" | "primary" | "secondary" | "all";
3
+ /**
4
+ * Metallic: flakes in the paint glinting in the light, the colour deepening
5
+ * towards the edges, under a glossy clear coat.
6
+ */
7
+ export interface MetallicFinish {
8
+ type: "metallic";
9
+ /** How much the flakes show, 0-1. Default 0.7. */
10
+ flakes?: number;
11
+ /** Their size: 1 the default, 2 coarser (glittery), 0.5 finer. */
12
+ flakeSize?: number;
13
+ /** What colour they glint (0xRRGGBB), mixed with the paint's. Default white. */
14
+ flakeColor?: number;
15
+ /** The clear coat's shine, 0 (dull) to 1 (wet look). Default 0.85. */
16
+ gloss?: number;
17
+ /** Which colours. Default "both" (primary and secondary). */
18
+ on?: PaintSlots;
19
+ }
20
+ /**
21
+ * Satin: a soft, wide sheen instead of a highlight, hardly any reflection.
22
+ * `"matte"` is the same with no sheen to speak of.
23
+ */
24
+ export interface SatinFinish {
25
+ type: "satin" | "matte";
26
+ /** 0 (flat, chalky) to 1 (a soft glow). Default 0.5 for satin, 0.1 for matte. */
27
+ sheen?: number;
28
+ on?: PaintSlots;
29
+ }
30
+ /**
31
+ * Colour shift (chameleon): each part's hue turns as the surface turns away
32
+ * from you, colour 1 and colour 2 parts each from their own colour (greys
33
+ * stay grey), with fine pearl flakes under a clear coat.
34
+ */
35
+ export interface ColorShiftFinish {
36
+ type: "colorShift";
37
+ /** How far the hue turns at the edges, in degrees: one way on edges turning right (or up) from you, the other way left (or down). Default 30 (red: orange one way, pink the other). */
38
+ hueShift?: number;
39
+ /** How far it turns, 0 (not at all) to 1. Default 1. */
40
+ shift?: number;
41
+ /** How much the pearl flakes show, 0-1. Default 0.35. */
42
+ flakes?: number;
43
+ /** Their size, as metallic's. Default 1. */
44
+ flakeSize?: number;
45
+ /** The clear coat's shine, 0-1. Default 0.9. */
46
+ gloss?: number;
47
+ on?: PaintSlots;
48
+ }
49
+ /** Pearl: colour shift's pearl glow and flakes, with the paint keeping its colour. */
50
+ export interface PearlFinish {
51
+ type: "pearl";
52
+ /** What the glow and flakes are tinted towards (0xRRGGBB). Default white. */
53
+ pearlColor?: number;
54
+ /** How much the pearl flakes show, 0-1. Default 0.35. */
55
+ flakes?: number;
56
+ /** Their size, as metallic's. Default 1. */
57
+ flakeSize?: number;
58
+ /** The clear coat's shine, 0-1. Default 0.9. */
59
+ gloss?: number;
60
+ on?: PaintSlots;
61
+ }
62
+ /**
63
+ * Your own: a client file with a `float3 shade(Surface s)` (see the docs),
64
+ * and its parameters by name.
65
+ */
66
+ export interface CustomFinish {
67
+ shader: string;
68
+ params?: Record<string, number | number[]>;
69
+ on?: PaintSlots;
70
+ }
71
+ /**
72
+ * A livery (paint job) over a car's paint: an image client file, drawn
73
+ * over the paint under any finish (metallic sticker bomb).
74
+ */
75
+ export interface Livery {
76
+ /**
77
+ * An image client file (PNG or JPG, 2048 square at most), or one of the
78
+ * game's own textures, `"game:<txd>/<texture>"` (its paint jobs:
79
+ * `"game:savanna1/savanna92body256a"`, with `mapping: "uv"`).
80
+ */
81
+ texture: string;
82
+ /**
83
+ * `"projected"` (the default): onto any car, tiled `scale` metres across,
84
+ * from its sides, top and front. `"uv"`: by the paint's own texture
85
+ * coordinates, for an image drawn for one model's layout (as the game's
86
+ * own paint jobs are, for the Savanna and others).
87
+ */
88
+ mapping?: "projected" | "uv";
89
+ /** Projected: how many metres one tile (the image) covers. Default 4. */
90
+ scale?: number;
91
+ /** 0-1. Default 1. */
92
+ opacity?: number;
93
+ /**
94
+ * `"over"` (the default): the image as it is over the paint. `"multiply"`:
95
+ * tinted by the paint's colour (mid grey: the paint as is), as the game's
96
+ * own paint jobs are.
97
+ */
98
+ blend?: "over" | "multiply";
99
+ /** Which colours it's on. Default "both". */
100
+ on?: PaintSlots;
101
+ }
102
+ export type PaintFinish = MetallicFinish | PearlFinish | SatinFinish | ColorShiftFinish | CustomFinish;
103
+ /** @internal A finish and livery as sent (null: neither, the game's paint). */
104
+ export declare function encodePaintAndLivery(f: PaintFinish | null, l: Livery | null): ({
105
+ type: string;
106
+ shader: string;
107
+ params: string;
108
+ values: number[];
109
+ slots: number;
110
+ } & {
111
+ livery?: string;
112
+ liveryMapping?: number;
113
+ liveryScale?: number;
114
+ liveryOpacity?: number;
115
+ liveryMultiply?: boolean;
116
+ }) | null;
117
+ /** @internal As sent: its type or shader, parameters ("name:size,...") and values (4 each). */
118
+ export declare function encodePaint(f: PaintFinish): {
119
+ type: string;
120
+ shader: string;
121
+ params: string;
122
+ values: number[];
123
+ slots: number;
124
+ };