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

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,612 @@
1
+ import { encodePaint, encodePaintAndLivery } from "./paint.js";
2
+ import { native } from "./native.js";
3
+ /** The law's vehicles: police cars, bikes, rangers, the SWAT van, FBI, army (models). */
4
+ const POLICE_MODELS = new Set([427, 433, 470, 490, 497, 523, 528, 596, 597, 598, 599, 601]);
5
+ /** Door, bonnet and boot states. */
6
+ export var DoorDamage;
7
+ (function (DoorDamage) {
8
+ DoorDamage[DoorDamage["Ok"] = 0] = "Ok";
9
+ DoorDamage[DoorDamage["Open"] = 1] = "Open";
10
+ DoorDamage[DoorDamage["Damaged"] = 2] = "Damaged";
11
+ DoorDamage[DoorDamage["OpenDamaged"] = 3] = "OpenDamaged";
12
+ DoorDamage[DoorDamage["Gone"] = 4] = "Gone";
13
+ })(DoorDamage || (DoorDamage = {}));
14
+ /** Tyre states. */
15
+ export var TyreDamage;
16
+ (function (TyreDamage) {
17
+ TyreDamage[TyreDamage["Ok"] = 0] = "Ok";
18
+ TyreDamage[TyreDamage["Burst"] = 1] = "Burst";
19
+ TyreDamage[TyreDamage["Gone"] = 2] = "Gone";
20
+ })(TyreDamage || (TyreDamage = {}));
21
+ /** Body panel states (wings, windscreen, bumpers), as the game's doors'. */
22
+ export var PanelDamage;
23
+ (function (PanelDamage) {
24
+ PanelDamage[PanelDamage["Ok"] = 0] = "Ok";
25
+ PanelDamage[PanelDamage["Loose"] = 1] = "Loose";
26
+ PanelDamage[PanelDamage["Damaged"] = 2] = "Damaged";
27
+ PanelDamage[PanelDamage["LooseDamaged"] = 3] = "LooseDamaged";
28
+ })(PanelDamage || (PanelDamage = {}));
29
+ const kDamageSize = 24;
30
+ function decodeDamage(b) {
31
+ const bytes = b.length === kDamageSize ? b : new Array(kDamageSize).fill(0);
32
+ const u32 = (at) => (bytes[at] | (bytes[at + 1] << 8) | (bytes[at + 2] << 16) | (bytes[at + 3] << 24)) >>> 0;
33
+ const lights = u32(0x10);
34
+ const panels = u32(0x14);
35
+ return {
36
+ engine: bytes[4],
37
+ tyres: [bytes[5], bytes[6], bytes[7], bytes[8]],
38
+ doors: [bytes[9], bytes[10], bytes[11], bytes[12], bytes[13], bytes[14]],
39
+ panels: Array.from({ length: 7 }, (_, i) => (panels >>> (i * 4)) & 0xf),
40
+ lights: [0, 1, 2, 3].map((i) => ((lights >>> (i * 2)) & 3) !== 0),
41
+ };
42
+ }
43
+ function encodeDamage(d) {
44
+ const bytes = new Array(kDamageSize).fill(0);
45
+ const clamp = (v, max) => Math.max(0, Math.min(max, Math.trunc(v || 0)));
46
+ bytes[4] = clamp(d.engine, 255);
47
+ d.tyres.forEach((t, i) => (bytes[5 + i] = clamp(t, 2)));
48
+ d.doors.forEach((s, i) => (bytes[9 + i] = clamp(s, 4)));
49
+ let lights = 0;
50
+ d.lights.forEach((on, i) => (lights |= (on ? 1 : 0) << (i * 2)));
51
+ let panels = 0;
52
+ d.panels.slice(0, 7).forEach((s, i) => (panels |= clamp(s, 3) << (i * 4)));
53
+ for (let k = 0; k < 4; ++k) {
54
+ bytes[0x10 + k] = (lights >>> (k * 8)) & 0xff;
55
+ bytes[0x14 + k] = (panels >>> (k * 8)) & 0xff;
56
+ }
57
+ return bytes;
58
+ }
59
+ const INDICATORS = ["off", "left", "right", "hazard"];
60
+ export class Vehicle {
61
+ id;
62
+ /** Vehicle model, 400-611. */
63
+ model;
64
+ /** Free-form per-vehicle storage for gamemode data. */
65
+ data = {};
66
+ /**
67
+ * Modified in a mod shop (anything bought there: set by `server.modShops`,
68
+ * or by you, e.g. for a car loaded with parts). A Pay 'n' Spray only
69
+ * repairs a modified car: its paint stays.
70
+ */
71
+ modded = false;
72
+ /**
73
+ * Its paint finish: drawn with a shader instead of the game's plain paint
74
+ * (metallic flake, or your own). Null (the default): the game's. See
75
+ * `PaintFinish`.
76
+ *
77
+ * ```ts
78
+ * vehicle.paintFinish = { type: "metallic", flakes: 0.8 };
79
+ * vehicle.paintFinish = { shader: "shaders/candy.hlsl", params: { depth: 0.6 } };
80
+ * ```
81
+ */
82
+ get paintFinish() {
83
+ return this.#paintFinish;
84
+ }
85
+ set paintFinish(finish) {
86
+ if (finish && "shader" in finish)
87
+ this.#needFile(finish.shader);
88
+ if (finish)
89
+ encodePaint(finish); // throws if it's not one
90
+ this.#paintFinish = finish ? { ...finish } : null;
91
+ this.#sendPaint();
92
+ }
93
+ #paintFinish = null;
94
+ /**
95
+ * A livery (paint job) over its paint: an image of yours, projected onto
96
+ * any car (a sticker bomb) or laid on by the paint's own layout (a
97
+ * texture drawn for that model, as the game's paint jobs are). It shows
98
+ * under any `paintFinish`. Null (the default): none. See `Livery`.
99
+ *
100
+ * ```ts
101
+ * vehicle.livery = { texture: "liveries/stickerbomb.jpg", scale: 1.5 };
102
+ * ```
103
+ */
104
+ get livery() {
105
+ return this.#livery;
106
+ }
107
+ set livery(livery) {
108
+ if (livery && !livery.texture.startsWith("game:"))
109
+ this.#needFile(livery.texture);
110
+ this.#livery = livery ? { ...livery } : null;
111
+ this.#sendPaint();
112
+ }
113
+ #livery = null;
114
+ #needFile(file) {
115
+ if (!this.#native.clientFiles().some((f) => f.path === file))
116
+ throw new ReferenceError(`no client file "${file}"`);
117
+ }
118
+ #sendPaint() {
119
+ if (this.#exists)
120
+ this.#native.vehiclePaint(this.id, encodePaintAndLivery(this.#paintFinish, this.#livery));
121
+ }
122
+ #native;
123
+ #player;
124
+ #ped;
125
+ #destroy;
126
+ #byId;
127
+ #exists = true;
128
+ /** @internal Created by Server. */
129
+ constructor(nativeServer, id, player, destroy, ped = () => undefined, vehicle = () => undefined) {
130
+ this.#native = nativeServer;
131
+ this.id = id;
132
+ this.#player = player;
133
+ this.#ped = ped;
134
+ this.#byId = vehicle;
135
+ this.#destroy = destroy;
136
+ this.model = this.#state()?.model ?? 0;
137
+ }
138
+ #state() {
139
+ return this.#exists ? this.#native.vehicle(this.id) : null;
140
+ }
141
+ /** False once destroyed. */
142
+ get exists() {
143
+ return this.#exists;
144
+ }
145
+ /** @internal */
146
+ markDestroyed() {
147
+ this.#exists = false;
148
+ }
149
+ /** Last synced position: the driver's, or where it was left. */
150
+ get position() {
151
+ const s = this.#state();
152
+ return { x: s?.x ?? 0, y: s?.y ?? 0, z: s?.z ?? 0 };
153
+ }
154
+ /** The trailer it tows (a driver backing into one, or `attachTrailer`), or null. */
155
+ get trailer() {
156
+ const id = this.#state()?.trailerId;
157
+ return id ? (this.#byId(id) ?? null) : null;
158
+ }
159
+ /**
160
+ * Hitches `trailer` to it (SA-MP's AttachTrailerToVehicle), wherever it
161
+ * is. **Returns** false if it can't (another world, someone driving the
162
+ * trailer, a wreck).
163
+ */
164
+ attachTrailer(trailer) {
165
+ return this.#exists && this.#native.towVehicle(this.id, trailer.id);
166
+ }
167
+ /** Unhitches what it tows (DetachTrailerFromVehicle). */
168
+ detachTrailer() {
169
+ if (this.#exists)
170
+ this.#native.towVehicle(this.id, 0);
171
+ }
172
+ /**
173
+ * What happens to it when hit, for this vehicle alone (as
174
+ * `server.on("vehicleHit")` for all): return `false` to refuse the harm,
175
+ * or a number for the health it costs instead. Called before the server's
176
+ * listeners. **Returns** a function that removes it.
177
+ *
178
+ * ```ts
179
+ * const off = car.onHit((hit) => (hit.cause === "weapon" ? undefined : false)); // only weapons hurt it
180
+ * ```
181
+ */
182
+ onHit(fn) {
183
+ this.#hit.push(fn);
184
+ return () => {
185
+ const i = this.#hit.indexOf(fn);
186
+ if (i >= 0)
187
+ this.#hit.splice(i, 1);
188
+ };
189
+ }
190
+ #hit = [];
191
+ /** @internal A hit, to its own listeners: false refused, a number its cost, else nothing said. */
192
+ hitBy(hit) {
193
+ let out;
194
+ for (const fn of [...this.#hit]) {
195
+ try {
196
+ const r = fn(hit);
197
+ if (r === false)
198
+ return false;
199
+ if (typeof r === "number")
200
+ out = r;
201
+ }
202
+ catch (err) {
203
+ console.error("[sagl] vehicle onHit threw:", err);
204
+ }
205
+ }
206
+ return out;
207
+ }
208
+ /**
209
+ * A player's grenade, molotov, rocket or satchel going off within
210
+ * `radius` m of it (or the vehicle they wrecked blowing up nearby): for
211
+ * telling when something was thrown at it, before it takes any harm.
212
+ * **Returns** a function that removes it.
213
+ */
214
+ onExplosionNear(radius, fn) {
215
+ const entry = { radius, fn };
216
+ this.#near.push(entry);
217
+ return () => {
218
+ const i = this.#near.indexOf(entry);
219
+ if (i >= 0)
220
+ this.#near.splice(i, 1);
221
+ };
222
+ }
223
+ #near = [];
224
+ /** @internal An explosion somewhere: to those near enough to hear of it. */
225
+ explosionNear(player, e) {
226
+ if (!this.#near.length || !this.#exists)
227
+ return;
228
+ const at = this.position;
229
+ const d = Math.hypot(e.position.x - at.x, e.position.y - at.y, e.position.z - at.z);
230
+ for (const { radius, fn } of [...this.#near]) {
231
+ if (d > radius)
232
+ continue;
233
+ try {
234
+ fn(player, e);
235
+ }
236
+ catch (err) {
237
+ console.error("[sagl] vehicle onExplosionNear threw:", err);
238
+ }
239
+ }
240
+ }
241
+ /** Speed in m/s, as last synced (0 once nobody has for a second). */
242
+ get speed() {
243
+ const v = this.velocity;
244
+ return Math.hypot(v.x, v.y, v.z);
245
+ }
246
+ /** Whether it's one of the law's: police cars and bikes, rangers, SWAT, FBI, army. */
247
+ get isPolice() {
248
+ return POLICE_MODELS.has(this.model);
249
+ }
250
+ /**
251
+ * A point relative to it, by its heading: `right`, `ahead` and `up` m
252
+ * from its middle (negative for left, behind, below). For camera shots
253
+ * and placing things by it.
254
+ *
255
+ * ```ts
256
+ * player.camera.set({ position: car.offset({ right: 3, ahead: 1, up: 1 }), lookAt: { vehicle: car } });
257
+ * ```
258
+ */
259
+ offset(by) {
260
+ const h = (this.heading * Math.PI) / 180;
261
+ const at = this.position;
262
+ const r = by.right ?? 0, a = by.ahead ?? 0;
263
+ return {
264
+ x: at.x + Math.cos(h) * r - Math.sin(h) * a,
265
+ y: at.y + Math.sin(h) * r + Math.cos(h) * a,
266
+ z: at.z + (by.up ?? 0),
267
+ };
268
+ }
269
+ /** Velocity in m/s, as last synced (still once nobody has for a second). */
270
+ get velocity() {
271
+ const v = this.#state()?.velocity;
272
+ return { x: v?.x ?? 0, y: v?.y ?? 0, z: v?.z ?? 0 };
273
+ }
274
+ /**
275
+ * 1000 is undamaged; it catches fire below 250 and then blows up. Only the
276
+ * server raises it (a player's game saying it's better is ignored);
277
+ * setting it sets it for everyone (1-100000). Not for a wreck.
278
+ */
279
+ get health() {
280
+ return this.#state()?.health ?? 0;
281
+ }
282
+ set health(health) {
283
+ if (this.#exists && !this.wrecked && !this.#native.setVehicleHealth(this.id, health)) {
284
+ throw new RangeError(`not a vehicle health: ${health}`);
285
+ }
286
+ }
287
+ /**
288
+ * Its visible damage: what's open, dented, burst or gone. Like health,
289
+ * only the server repairs; setting it (better or worse) sets it for
290
+ * everyone. Not for a wreck.
291
+ */
292
+ get damage() {
293
+ return decodeDamage(this.#state()?.damage ?? []);
294
+ }
295
+ set damage(damage) {
296
+ if (this.#exists)
297
+ this.#native.setVehicleDamage(this.id, encodeDamage(damage));
298
+ }
299
+ /**
300
+ * Its licence plate, the same for everyone. Setting it changes it at
301
+ * once: up to 8 of A-Z, 0-9 and spaces (lower case is raised).
302
+ */
303
+ get plate() {
304
+ return this.#state()?.plate ?? "";
305
+ }
306
+ set plate(plate) {
307
+ if (this.#exists && !this.#native.setVehiclePlate(this.id, plate)) {
308
+ throw new RangeError(`not a licence plate: ${plate}`);
309
+ }
310
+ }
311
+ /** Puts it back where it was created, new, for everyone (a wreck too). */
312
+ respawn() {
313
+ if (this.#exists)
314
+ this.#native.respawnVehicle(this.id);
315
+ }
316
+ /**
317
+ * Seconds after it's wrecked, or left empty away from where it was
318
+ * created, that it respawns by itself (when nobody is near enough to
319
+ * see); 0: never.
320
+ */
321
+ get respawnDelay() {
322
+ return (this.#state()?.respawnDelay ?? 0) / 1000;
323
+ }
324
+ set respawnDelay(seconds) {
325
+ if (this.#exists)
326
+ this.#native.setVehicleRespawnDelay(this.id, Math.max(0, seconds * 1000));
327
+ }
328
+ /**
329
+ * Colours: the game's palette (carcols.dat), 0-127, or your own
330
+ * (`server.vehicleColors.add`, 128 up). Only the server recolours
331
+ * vehicles: setting this recolours it for everyone.
332
+ */
333
+ get colors() {
334
+ const s = this.#state();
335
+ return [s?.color1 ?? 0, s?.color2 ?? 0];
336
+ }
337
+ set colors([color1, color2]) {
338
+ if (this.#exists)
339
+ this.#native.setVehicleColors(this.id, color1, color2);
340
+ }
341
+ /**
342
+ * Its radio station (`RadioStation`), or -1 before anyone has been in it.
343
+ * Everyone in it hears the same thing; setting it retunes it for them.
344
+ */
345
+ get radio() {
346
+ return this.#state()?.radio ?? -1;
347
+ }
348
+ set radio(station) {
349
+ if (this.#exists && !this.#native.setVehicleRadio(this.id, station)) {
350
+ throw new RangeError(`not a radio station: ${station}`);
351
+ }
352
+ }
353
+ /** Its virtual world. Setting it moves everyone in it along. */
354
+ get world() {
355
+ return this.#state()?.world ?? 0;
356
+ }
357
+ /**
358
+ * Puts it there, at a standstill (as SA-MP's SetVehiclePos and
359
+ * SetVehicleZAngle): `position` on the ground, as `createVehicle` takes
360
+ * it; `heading` in degrees (default as it was). Anyone in it goes too.
361
+ */
362
+ setPosition(position, heading) {
363
+ if (!this.#exists)
364
+ return;
365
+ this.#native.placeVehicle(this.id, position.x, position.y, position.z, heading ?? this.heading);
366
+ }
367
+ /**
368
+ * Fits a tuning part (component 1000-1193: spoilers, hoods, wheels,
369
+ * nitro, hydraulics...), replacing what's in its slot, for everyone, as
370
+ * SA-MP's AddVehicleComponent. Returns false if it doesn't fit this model
371
+ * (by the game's own carmods.dat).
372
+ */
373
+ addComponent(part) {
374
+ return this.#exists && this.#native.vehicleComponent(this.id, part, true);
375
+ }
376
+ /** Takes a tuning part off. */
377
+ removeComponent(part) {
378
+ if (this.#exists)
379
+ this.#native.vehicleComponent(this.id, part, false);
380
+ }
381
+ /** The tuning parts on it. */
382
+ get components() {
383
+ return this.#state()?.components ?? [];
384
+ }
385
+ /**
386
+ * The part in a slot (`ComponentSlot`: spoiler, hood, roof, side skirt,
387
+ * lamps, nitro, exhaust, wheels, stereo, hydraulics, bumpers, vents), or
388
+ * 0, as SA-MP's GetVehicleComponentInSlot.
389
+ */
390
+ componentInSlot(slot) {
391
+ return this.components.find((p) => componentSlot(p) === slot) ?? 0;
392
+ }
393
+ /** Its paintjob (0-2, for the models that have them), or -1: none. As SA-MP's ChangeVehiclePaintjob (3 there: none). */
394
+ get paintjob() {
395
+ return this.#state()?.paintjob ?? -1;
396
+ }
397
+ set paintjob(paintjob) {
398
+ const p = paintjob === 3 ? -1 : paintjob;
399
+ if (!Number.isInteger(p) || p < -1 || p > 2)
400
+ throw new RangeError(`not a paintjob: ${paintjob} (0-2, or -1 none)`);
401
+ if (this.#exists)
402
+ this.#native.vehiclePaintjob(this.id, p);
403
+ }
404
+ /**
405
+ * Its doors locked, for everyone (as SA-MP's SetVehicleParamsEx doors):
406
+ * no one can get in; those in it stay. `lockFor` sets it for one player.
407
+ */
408
+ get locked() {
409
+ return this.#state()?.doorsLocked ?? false;
410
+ }
411
+ set locked(locked) {
412
+ if (this.#exists)
413
+ this.#native.vehicleLocked(this.id, locked);
414
+ }
415
+ /**
416
+ * Its doors for one player, whatever `locked` is for everyone (as
417
+ * SA-MP's SetVehicleParamsForPlayer): true locked, false open, null as
418
+ * for everyone again. A car lock system: `car.locked = true;
419
+ * car.lockFor(owner, false)`.
420
+ */
421
+ lockFor(player, locked) {
422
+ if (this.#exists)
423
+ this.#native.vehicleLocked(this.id, locked ?? false, player.id, locked === null);
424
+ }
425
+ /**
426
+ * Its engine: true running, false off (it won't drive: SA-MP's manual
427
+ * engines), null as the game has it (on when someone drives). Default null.
428
+ */
429
+ get engine() {
430
+ return this.#param("engine");
431
+ }
432
+ set engine(on) {
433
+ this.#setParam("engine", on);
434
+ }
435
+ /** Its lights: true on, false off, null as the game has them (on at night). Default null. */
436
+ get lights() {
437
+ return this.#param("lights");
438
+ }
439
+ set lights(on) {
440
+ this.#setParam("lights", on);
441
+ }
442
+ /**
443
+ * A helicopter's searchlight: true on, false off, null as its pilot has it
444
+ * (a Police Maverick's pilot switches it with the horn). Default null.
445
+ * Any helicopter can have one. `searchlightOn` is whether it's on now.
446
+ */
447
+ get searchlight() {
448
+ return this.#param("searchlight");
449
+ }
450
+ set searchlight(on) {
451
+ this.#setParam("searchlight", on);
452
+ }
453
+ /**
454
+ * A plane's smoke trail: true on, false off, null as its pilot has it (a
455
+ * Stuntplane's or Cropduster's pilot switches it). Default null. It only
456
+ * shows while someone flies it with the engine running. `smokeOn` is
457
+ * whether it's on now.
458
+ */
459
+ get smoke() {
460
+ return this.#param("smoke");
461
+ }
462
+ set smoke(on) {
463
+ this.#setParam("smoke", on);
464
+ }
465
+ /**
466
+ * Its indicators: `"left"`, `"right"`, `"hazard"` or `"off"`, held so
467
+ * (its driver's keys then do nothing), or null as its driver has them
468
+ * (the default). They stay as left when the driver gets out. Cars, bikes
469
+ * and trucks; everyone sees them flash together. `indicatorsOn` is what
470
+ * they show now.
471
+ */
472
+ get indicators() {
473
+ const f = this.#state()?.indicators ?? 0;
474
+ return f ? (INDICATORS[f - 1] ?? null) : null;
475
+ }
476
+ set indicators(to) {
477
+ const i = to === null ? -1 : INDICATORS.indexOf(to);
478
+ if (to !== null && i < 0)
479
+ throw new RangeError(`not indicators: ${to}`);
480
+ this.#setParam("indicators", i + 1);
481
+ }
482
+ /** Its indicators now (held, or as its driver last had them). */
483
+ get indicatorsOn() {
484
+ return INDICATORS[this.#state()?.indicatorsOn ?? 0] ?? "off";
485
+ }
486
+ /** Whether its searchlight is on now, as its driver's game has it. */
487
+ get searchlightOn() {
488
+ return this.#state()?.searchlightOn ?? false;
489
+ }
490
+ /**
491
+ * How dirty it is, 0 (clean) to 15 (the dirtiest the game shows), the
492
+ * same on every screen; null (the default): as each player's game has it
493
+ * (the game picks one as it makes the car). Pay 'n' Sprays and mod shop
494
+ * paint clean it (0).
495
+ */
496
+ get dirt() {
497
+ const d = this.#state()?.dirt ?? 0;
498
+ return d === 0 ? null : (d - 1) / 10;
499
+ }
500
+ set dirt(level) {
501
+ const s = this.#state();
502
+ if (!this.#exists || !s)
503
+ return;
504
+ if (level !== null && !(level >= 0 && level <= 15))
505
+ throw new RangeError(`not a dirt level: ${level} (0-15, or null)`);
506
+ const d = level === null ? 0 : 1 + Math.round(level * 10);
507
+ this.#native.vehicleParams(this.id, s.engine, s.lights, s.searchlight, s.smoke, s.indicators, d);
508
+ }
509
+ /** Whether its smoke trail is on now, as its driver's game has it. */
510
+ get smokeOn() {
511
+ return this.#state()?.smokeOn ?? false;
512
+ }
513
+ #param(name) {
514
+ const v = this.#state()?.[name] ?? 0;
515
+ return v === 0 ? null : v === 2;
516
+ }
517
+ #setParam(name, on) {
518
+ const s = this.#state();
519
+ if (!this.#exists || !s)
520
+ return;
521
+ const p = { engine: s.engine, lights: s.lights, searchlight: s.searchlight, smoke: s.smoke, indicators: s.indicators };
522
+ p[name] = typeof on === "number" ? on : on === null ? 0 : on ? 2 : 1;
523
+ this.#native.vehicleParams(this.id, p.engine, p.lights, p.searchlight, p.smoke, p.indicators, s.dirt);
524
+ }
525
+ /** Which way it faces (degrees, 0 north, anticlockwise). */
526
+ get heading() {
527
+ return this.#state()?.heading ?? 0;
528
+ }
529
+ /** The interior it's in (seen only from there), as SA-MP's LinkVehicleToInterior. */
530
+ get interior() {
531
+ return this.#state()?.interior ?? 0;
532
+ }
533
+ set interior(interior) {
534
+ if (!Number.isInteger(interior) || interior < 0 || interior > 255)
535
+ throw new RangeError(`not an interior: ${interior}`);
536
+ if (this.#exists)
537
+ this.#native.setVehicleInterior(this.id, interior);
538
+ }
539
+ set world(world) {
540
+ if (this.#exists)
541
+ this.#native.setVehicleWorld(this.id, world);
542
+ }
543
+ /** The player driving it, or null. */
544
+ get driver() {
545
+ const id = this.#state()?.driverId;
546
+ return id === null || id === undefined ? null : this.#player(id) ?? null;
547
+ }
548
+ /** Full health and no visible damage, for everyone. Not for a wreck. */
549
+ repair() {
550
+ if (this.#exists)
551
+ this.#native.repairVehicle(this.id);
552
+ }
553
+ /** Part of the ambient traffic (the server removes it when nobody is near). */
554
+ get ambient() {
555
+ return this.#state()?.ambient ?? false;
556
+ }
557
+ /** Blown up. A wreck stays one until respawned or destroyed. */
558
+ get wrecked() {
559
+ return this.#state()?.wrecked ?? false;
560
+ }
561
+ /** Blows it up for everyone, credited to `killer` if given. */
562
+ explode(killer) {
563
+ if (this.#exists)
564
+ this.#native.wreckVehicle(this.id, killer?.id);
565
+ }
566
+ /** Everyone in it, driver included: seat number -> player. */
567
+ /** Server peds in it: seat number -> ped. */
568
+ get peds() {
569
+ const out = new Map();
570
+ for (const [seat, id] of Object.entries(this.#state()?.pedSeats ?? {})) {
571
+ const ped = this.#ped(id);
572
+ if (ped)
573
+ out.set(Number(seat), ped);
574
+ }
575
+ return out;
576
+ }
577
+ get occupants() {
578
+ const out = new Map();
579
+ for (const [seat, id] of Object.entries(this.#state()?.occupants ?? {})) {
580
+ const player = this.#player(id);
581
+ if (player)
582
+ out.set(Number(seat), player);
583
+ }
584
+ return out;
585
+ }
586
+ /**
587
+ * Hands it back to the game: the server removes it as it does ambient
588
+ * traffic, once nobody is near (a wreck after a while), unless it's
589
+ * someone's last car.
590
+ */
591
+ release() {
592
+ if (this.#exists)
593
+ this.#native.releaseVehicle(this.id);
594
+ }
595
+ /** Removes it for everyone; its occupants are put out first. */
596
+ destroy() {
597
+ if (this.#exists)
598
+ this.#destroy(this);
599
+ }
600
+ toString() {
601
+ return `vehicle ${this.id} (model ${this.model})`;
602
+ }
603
+ }
604
+ /** A tuning part's slot (`ComponentSlot`), or -1. */
605
+ export function componentSlot(part) {
606
+ return native.componentSlot(part);
607
+ }
608
+ /** Whether a tuning part fits a vehicle model (the game's own carmods.dat). */
609
+ export function componentFits(model, part) {
610
+ return native.componentFits(model, part);
611
+ }
612
+ //# sourceMappingURL=vehicle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vehicle.js","sourceRoot":"","sources":["../src/vehicle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { NativeServer } from "./native.js";
2
+ import type { Player } from "./player.js";
3
+ /**
4
+ * Car colours: the game's (0-127) and your own (`server.vehicleColors`).
5
+ * Add a colour of your own and you get an id, 128 up, that works anywhere
6
+ * a colour does: `vehicle.colors`, `createVehicle`, the mod shops' colour
7
+ * grid (where yours are added by default).
8
+ *
9
+ * ```ts
10
+ * const teal = server.vehicleColors.add(0x00a8a8);
11
+ * vehicle.colors = [teal, 1];
12
+ * ```
13
+ */
14
+ export declare class VehicleColors {
15
+ #private;
16
+ /** @internal */
17
+ constructor(native: NativeServer, players: () => Player[]);
18
+ /** Adds a colour (0xRRGGBB) and gives its id (128 up; the same colour twice: the same id). At most 128. */
19
+ add(rgb: number): number;
20
+ /** Your colours' ids, in order. */
21
+ get custom(): number[];
22
+ /** A colour id's 0xRRGGBB (the game's or yours), or undefined. */
23
+ rgb(id: number): number | undefined;
24
+ /** @internal A player joined: they get yours. */
25
+ joined(player: Player): void;
26
+ }