@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
package/dist/ui.js ADDED
@@ -0,0 +1,243 @@
1
+ // The order of ServerUi.events' bits; "close" always comes.
2
+ const EVENT_BITS = ["click", "change", "submit", "keydown", "focus", "blur", "mouseover", "mouseout"];
3
+ const ACTION = { open: 0, close: 1, show: 2, hide: 3, set: 4, listen: 5 };
4
+ const CHANGE = { text: 0, html: 1, value: 2, classOn: 3, classOff: 4, attribute: 5, removeAttribute: 6, focus: 7, checked: 8 };
5
+ /** The most text or RML one change carries, in UTF-8 bytes. */
6
+ const MAX_VALUE = 5119;
7
+ /**
8
+ * A UI document the server opened on one player: an RML client file the
9
+ * server fills in by element id and hears clicks, changes and submits from.
10
+ * For anything that has to react without a round trip to the server
11
+ * (animation, per-frame updates, client-side logic), use a client script's
12
+ * `sagl.ui` instead.
13
+ */
14
+ export class UiDocument {
15
+ id;
16
+ /** The client file it was opened from. */
17
+ file;
18
+ player;
19
+ #ui;
20
+ #open = true;
21
+ #handlers = [];
22
+ #events = 0;
23
+ /** @internal */
24
+ constructor(ui, player, id, file) {
25
+ this.#ui = ui;
26
+ this.player = player;
27
+ this.id = id;
28
+ this.file = file;
29
+ }
30
+ /** False once it's closed (by `close()`, the player, or them leaving). */
31
+ get open() {
32
+ return this.#open && this.player.connected;
33
+ }
34
+ /** Sets an element's text (shown as text: no markup). */
35
+ setText(id, text) {
36
+ return this.#set(CHANGE.text, id, "", String(text));
37
+ }
38
+ /** Replaces an element's contents with RML (up to 5 KB). */
39
+ setHtml(id, rml) {
40
+ return this.#set(CHANGE.html, id, "", rml);
41
+ }
42
+ /** A form control's value (`<input>`, `<select>`, `<textarea>`). */
43
+ setValue(id, value) {
44
+ return this.#set(CHANGE.value, id, "", String(value));
45
+ }
46
+ /** Checks or unchecks a checkbox or radio button. */
47
+ setChecked(id, checked = true) {
48
+ return this.#set(CHANGE.checked, id, "", checked ? "1" : "");
49
+ }
50
+ /** Adds (`on`, the default) or removes a class. */
51
+ setClass(id, name, on = true) {
52
+ return this.#set(on ? CHANGE.classOn : CHANGE.classOff, id, name, "");
53
+ }
54
+ /** Sets an attribute, or removes it with `null`. Not `id`. */
55
+ setAttribute(id, name, value) {
56
+ if (name === "id")
57
+ throw new TypeError("ids can't be changed");
58
+ return value === null
59
+ ? this.#set(CHANGE.removeAttribute, id, name, "")
60
+ : this.#set(CHANGE.attribute, id, name, String(value));
61
+ }
62
+ /** Gives an element keyboard and gamepad focus. */
63
+ focus(id) {
64
+ return this.#set(CHANGE.focus, id, "", "");
65
+ }
66
+ /** Shows it again (and takes input again, if it does). */
67
+ show() {
68
+ if (this.open)
69
+ this.#ui.send({ doc: this.id, action: ACTION.show });
70
+ return this;
71
+ }
72
+ /** Hides it (and gives input back) without closing it. */
73
+ hide() {
74
+ if (this.open)
75
+ this.#ui.send({ doc: this.id, action: ACTION.hide });
76
+ return this;
77
+ }
78
+ /** Closes it for good. Its `close` handlers don't run: you closed it. */
79
+ close() {
80
+ if (!this.open)
81
+ return;
82
+ this.#open = false;
83
+ this.#ui.send({ doc: this.id, action: ACTION.close });
84
+ this.#ui.forget(this.id);
85
+ }
86
+ on(type, a, b) {
87
+ const [id, fn] = typeof a === "function" ? [null, a] : [a, b];
88
+ if (typeof fn !== "function")
89
+ throw new TypeError("on(type, [id,] handler)");
90
+ const bit = EVENT_BITS.indexOf(type);
91
+ if (bit < 0 && type !== "close")
92
+ throw new RangeError(`no "${type}" events`);
93
+ this.#handlers.push({ type, id, fn });
94
+ if (bit >= 0 && !(this.#events & (1 << bit))) {
95
+ this.#events |= 1 << bit;
96
+ if (this.open)
97
+ this.#ui.send({ doc: this.id, action: ACTION.listen, events: this.#events });
98
+ }
99
+ return this;
100
+ }
101
+ /** Removes a handler, or every handler of that type. */
102
+ off(type, handler) {
103
+ this.#handlers = this.#handlers.filter((h) => h.type !== type || (handler && h.fn !== handler));
104
+ return this;
105
+ }
106
+ /** Calls `fn` when the player closes it. */
107
+ onClose(fn) {
108
+ return this.on("close", fn);
109
+ }
110
+ /** @internal */
111
+ dispatch(raw) {
112
+ if (raw.type === "error") {
113
+ this.#open = false;
114
+ this.#ui.forget(this.id);
115
+ console.error(`[sagl] ui: ${this.file} on ${this.player.name}: ${raw.value}`);
116
+ return;
117
+ }
118
+ const e = {
119
+ type: raw.type, document: this, player: this.player,
120
+ id: raw.id, value: raw.value, checked: raw.checked, enter: raw.enter, key: raw.key, fields: raw.fields,
121
+ };
122
+ if (e.type === "close") {
123
+ this.#open = false;
124
+ this.#ui.forget(this.id);
125
+ }
126
+ for (const h of [...this.#handlers]) {
127
+ if (h.type !== e.type || (h.id !== null && h.id !== e.id))
128
+ continue;
129
+ try {
130
+ h.fn(e);
131
+ }
132
+ catch (err) {
133
+ console.error(`[sagl] ui ${e.type} handler threw:`, err);
134
+ }
135
+ }
136
+ }
137
+ #set(change, element, name, value) {
138
+ if (Buffer.byteLength(value) > MAX_VALUE)
139
+ throw new RangeError("at most 5 KB per change");
140
+ if (this.open)
141
+ this.#ui.send({ doc: this.id, action: ACTION.set, change, element, name, value });
142
+ return this;
143
+ }
144
+ }
145
+ /** UI documents the server opens on one player (`player.ui`). */
146
+ export class PlayerUi {
147
+ #native;
148
+ #player;
149
+ #docs = new Map();
150
+ #next = 1;
151
+ /** @internal */
152
+ constructor(nativeServer, player) {
153
+ this.#native = nativeServer;
154
+ this.#player = player;
155
+ }
156
+ /**
157
+ * Opens an RML client file on their screen. Its relative links (images,
158
+ * stylesheets) resolve beside it. At most 16 at once per player.
159
+ */
160
+ open(file, options = {}) {
161
+ if (!this.#native.clientFiles().some((f) => f.path === file)) {
162
+ throw new ReferenceError(`no client file "${file}"`);
163
+ }
164
+ if (this.#docs.size >= 16)
165
+ throw new RangeError("at most 16 open documents per player");
166
+ const input = options.input ?? true;
167
+ const flags = (input ? 1 : 0) | ((options.cursor ?? input) ? 2 : 0) | ((options.keyboard ?? input) ? 4 : 0) |
168
+ ((options.gamepad ?? input) ? 8 : 0) | (options.movement ? 16 : 0) | ((options.escapeCloses ?? true) ? 32 : 0);
169
+ const doc = new UiDocument(this, this.#player, this.#next++, file);
170
+ this.#docs.set(doc.id, doc);
171
+ this.send({ doc: doc.id, action: ACTION.open, file, flags });
172
+ return doc;
173
+ }
174
+ /**
175
+ * Shows a markdown client file in the document viewer: a title, the
176
+ * document scrolling, a row of buttons. For help pages, rules, terms of
177
+ * service. Resolves with the index of the button pressed, or -1 if they
178
+ * closed it (or left). `{key:ID}` in it shows an action's key. One at a
179
+ * time on their screen; more wait their turn.
180
+ *
181
+ * ```ts
182
+ * const choice = await player.ui.showDocument("docs/rules.md", {
183
+ * title: "Server rules", buttons: ["Decline", "Accept"], requireEnd: true, closable: false,
184
+ * });
185
+ * if (choice !== 1) player.kick("You must accept the rules to play.");
186
+ * ```
187
+ */
188
+ showDocument(file, options = {}) {
189
+ if (!this.#native.clientFiles().some((f) => f.path === file))
190
+ throw new ReferenceError(`no client file "${file}"`);
191
+ const buttons = (options.buttons ?? []).map((b) => String(b).replace(/\n/g, " ").slice(0, 64));
192
+ if (buttons.join("\n").length > 512)
193
+ throw new RangeError("the buttons' text is over 512 characters");
194
+ const id = this.#nextDocument++;
195
+ this.#native.documentView(this.#player.id, {
196
+ id, title: (options.title ?? "").slice(0, 128), file, buttons: buttons.join("\n"),
197
+ requireEnd: options.requireEnd ?? false, closable: options.closable ?? true,
198
+ });
199
+ return new Promise((resolve) => this.#documents.set(id, resolve));
200
+ }
201
+ /** Takes down every document viewer they have showing or waiting (each resolves -1). */
202
+ closeDocuments() {
203
+ for (const id of this.#documents.keys())
204
+ this.#native.documentView(this.#player.id, { id, close: true });
205
+ }
206
+ /** @internal Their answer from the viewer. */
207
+ documentAnswered(id, button) {
208
+ const done = this.#documents.get(id);
209
+ this.#documents.delete(id);
210
+ done?.(button);
211
+ }
212
+ /** @internal They left: every document resolves -1. */
213
+ disconnected() {
214
+ for (const done of this.#documents.values())
215
+ done(-1);
216
+ this.#documents.clear();
217
+ }
218
+ #documents = new Map();
219
+ #nextDocument = 1;
220
+ /** The documents open now. */
221
+ get documents() {
222
+ return [...this.#docs.values()];
223
+ }
224
+ /** Closes every document. */
225
+ closeAll() {
226
+ for (const doc of this.documents)
227
+ doc.close();
228
+ }
229
+ /** @internal */
230
+ send(spec) {
231
+ if (this.#player.connected)
232
+ this.#native.ui(this.#player.id, spec);
233
+ }
234
+ /** @internal */
235
+ forget(id) {
236
+ this.#docs.delete(id);
237
+ }
238
+ /** @internal */
239
+ dispatch(e) {
240
+ this.#docs.get(e.doc)?.dispatch(e);
241
+ }
242
+ }
243
+ //# sourceMappingURL=ui.js.map
package/dist/ui.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,306 @@
1
+ import { type Livery, type PaintFinish } from "./paint.js";
2
+ import { type NativeServer } from "./native.js";
3
+ import type { Player } from "./player.js";
4
+ import type { Ped } from "./ped.js";
5
+ import type { Vector3 } from "./player.js";
6
+ import type { Explosion, VehicleHit } from "./server.js";
7
+ /** Door, bonnet and boot states. */
8
+ export declare enum DoorDamage {
9
+ Ok = 0,
10
+ Open = 1,
11
+ Damaged = 2,
12
+ OpenDamaged = 3,
13
+ Gone = 4
14
+ }
15
+ /** Tyre states. */
16
+ export declare enum TyreDamage {
17
+ Ok = 0,
18
+ Burst = 1,
19
+ Gone = 2
20
+ }
21
+ /** Body panel states (wings, windscreen, bumpers), as the game's doors'. */
22
+ export declare enum PanelDamage {
23
+ Ok = 0,
24
+ Loose = 1,
25
+ Damaged = 2,
26
+ LooseDamaged = 3
27
+ }
28
+ /**
29
+ * A vehicle's visible damage (the game's CDamageManager). Bikes use only the
30
+ * first two tyres.
31
+ */
32
+ export interface VehicleDamage {
33
+ /** 0 fine; rises as the engine takes damage (smoke past about 100). */
34
+ engine: number;
35
+ /** Front left, rear left, front right, rear right. */
36
+ tyres: [TyreDamage, TyreDamage, TyreDamage, TyreDamage];
37
+ /** Bonnet, boot, front left, front right, rear left, rear right. */
38
+ doors: [DoorDamage, DoorDamage, DoorDamage, DoorDamage, DoorDamage, DoorDamage];
39
+ /** Front left, front right, rear left, rear right wings, windscreen, front and rear bumpers (7). */
40
+ panels: PanelDamage[];
41
+ /** Front left, front right, rear right, rear left: true when smashed. */
42
+ lights: [boolean, boolean, boolean, boolean];
43
+ }
44
+ /** A vehicle's indicators. */
45
+ export type Indicators = "off" | "left" | "right" | "hazard";
46
+ export declare class Vehicle {
47
+ #private;
48
+ readonly id: number;
49
+ /** Vehicle model, 400-611. */
50
+ readonly model: number;
51
+ /** Free-form per-vehicle storage for gamemode data. */
52
+ readonly data: Record<string, unknown>;
53
+ /**
54
+ * Modified in a mod shop (anything bought there: set by `server.modShops`,
55
+ * or by you, e.g. for a car loaded with parts). A Pay 'n' Spray only
56
+ * repairs a modified car: its paint stays.
57
+ */
58
+ modded: boolean;
59
+ /**
60
+ * Its paint finish: drawn with a shader instead of the game's plain paint
61
+ * (metallic flake, or your own). Null (the default): the game's. See
62
+ * `PaintFinish`.
63
+ *
64
+ * ```ts
65
+ * vehicle.paintFinish = { type: "metallic", flakes: 0.8 };
66
+ * vehicle.paintFinish = { shader: "shaders/candy.hlsl", params: { depth: 0.6 } };
67
+ * ```
68
+ */
69
+ get paintFinish(): PaintFinish | null;
70
+ set paintFinish(finish: PaintFinish | null);
71
+ /**
72
+ * A livery (paint job) over its paint: an image of yours, projected onto
73
+ * any car (a sticker bomb) or laid on by the paint's own layout (a
74
+ * texture drawn for that model, as the game's paint jobs are). It shows
75
+ * under any `paintFinish`. Null (the default): none. See `Livery`.
76
+ *
77
+ * ```ts
78
+ * vehicle.livery = { texture: "liveries/stickerbomb.jpg", scale: 1.5 };
79
+ * ```
80
+ */
81
+ get livery(): Livery | null;
82
+ set livery(livery: Livery | null);
83
+ /** @internal Created by Server. */
84
+ constructor(nativeServer: NativeServer, id: number, player: (id: number) => Player | undefined, destroy: (vehicle: Vehicle) => void, ped?: (id: number) => Ped | undefined, vehicle?: (id: number) => Vehicle | undefined);
85
+ /** False once destroyed. */
86
+ get exists(): boolean;
87
+ /** @internal */
88
+ markDestroyed(): void;
89
+ /** Last synced position: the driver's, or where it was left. */
90
+ get position(): Vector3;
91
+ /** The trailer it tows (a driver backing into one, or `attachTrailer`), or null. */
92
+ get trailer(): Vehicle | null;
93
+ /**
94
+ * Hitches `trailer` to it (SA-MP's AttachTrailerToVehicle), wherever it
95
+ * is. **Returns** false if it can't (another world, someone driving the
96
+ * trailer, a wreck).
97
+ */
98
+ attachTrailer(trailer: Vehicle): boolean;
99
+ /** Unhitches what it tows (DetachTrailerFromVehicle). */
100
+ detachTrailer(): void;
101
+ /**
102
+ * What happens to it when hit, for this vehicle alone (as
103
+ * `server.on("vehicleHit")` for all): return `false` to refuse the harm,
104
+ * or a number for the health it costs instead. Called before the server's
105
+ * listeners. **Returns** a function that removes it.
106
+ *
107
+ * ```ts
108
+ * const off = car.onHit((hit) => (hit.cause === "weapon" ? undefined : false)); // only weapons hurt it
109
+ * ```
110
+ */
111
+ onHit(fn: (hit: VehicleHit) => boolean | number | void): () => void;
112
+ /** @internal A hit, to its own listeners: false refused, a number its cost, else nothing said. */
113
+ hitBy(hit: VehicleHit): boolean | number | undefined;
114
+ /**
115
+ * A player's grenade, molotov, rocket or satchel going off within
116
+ * `radius` m of it (or the vehicle they wrecked blowing up nearby): for
117
+ * telling when something was thrown at it, before it takes any harm.
118
+ * **Returns** a function that removes it.
119
+ */
120
+ onExplosionNear(radius: number, fn: (player: Player, explosion: Explosion) => void): () => void;
121
+ /** @internal An explosion somewhere: to those near enough to hear of it. */
122
+ explosionNear(player: Player, e: Explosion): void;
123
+ /** Speed in m/s, as last synced (0 once nobody has for a second). */
124
+ get speed(): number;
125
+ /** Whether it's one of the law's: police cars and bikes, rangers, SWAT, FBI, army. */
126
+ get isPolice(): boolean;
127
+ /**
128
+ * A point relative to it, by its heading: `right`, `ahead` and `up` m
129
+ * from its middle (negative for left, behind, below). For camera shots
130
+ * and placing things by it.
131
+ *
132
+ * ```ts
133
+ * player.camera.set({ position: car.offset({ right: 3, ahead: 1, up: 1 }), lookAt: { vehicle: car } });
134
+ * ```
135
+ */
136
+ offset(by: {
137
+ right?: number;
138
+ ahead?: number;
139
+ up?: number;
140
+ }): Vector3;
141
+ /** Velocity in m/s, as last synced (still once nobody has for a second). */
142
+ get velocity(): Vector3;
143
+ /**
144
+ * 1000 is undamaged; it catches fire below 250 and then blows up. Only the
145
+ * server raises it (a player's game saying it's better is ignored);
146
+ * setting it sets it for everyone (1-100000). Not for a wreck.
147
+ */
148
+ get health(): number;
149
+ set health(health: number);
150
+ /**
151
+ * Its visible damage: what's open, dented, burst or gone. Like health,
152
+ * only the server repairs; setting it (better or worse) sets it for
153
+ * everyone. Not for a wreck.
154
+ */
155
+ get damage(): VehicleDamage;
156
+ set damage(damage: VehicleDamage);
157
+ /**
158
+ * Its licence plate, the same for everyone. Setting it changes it at
159
+ * once: up to 8 of A-Z, 0-9 and spaces (lower case is raised).
160
+ */
161
+ get plate(): string;
162
+ set plate(plate: string);
163
+ /** Puts it back where it was created, new, for everyone (a wreck too). */
164
+ respawn(): void;
165
+ /**
166
+ * Seconds after it's wrecked, or left empty away from where it was
167
+ * created, that it respawns by itself (when nobody is near enough to
168
+ * see); 0: never.
169
+ */
170
+ get respawnDelay(): number;
171
+ set respawnDelay(seconds: number);
172
+ /**
173
+ * Colours: the game's palette (carcols.dat), 0-127, or your own
174
+ * (`server.vehicleColors.add`, 128 up). Only the server recolours
175
+ * vehicles: setting this recolours it for everyone.
176
+ */
177
+ get colors(): [number, number];
178
+ set colors([color1, color2]: [number, number]);
179
+ /**
180
+ * Its radio station (`RadioStation`), or -1 before anyone has been in it.
181
+ * Everyone in it hears the same thing; setting it retunes it for them.
182
+ */
183
+ get radio(): number;
184
+ set radio(station: number);
185
+ /** Its virtual world. Setting it moves everyone in it along. */
186
+ get world(): number;
187
+ /**
188
+ * Puts it there, at a standstill (as SA-MP's SetVehiclePos and
189
+ * SetVehicleZAngle): `position` on the ground, as `createVehicle` takes
190
+ * it; `heading` in degrees (default as it was). Anyone in it goes too.
191
+ */
192
+ setPosition(position: Vector3, heading?: number): void;
193
+ /**
194
+ * Fits a tuning part (component 1000-1193: spoilers, hoods, wheels,
195
+ * nitro, hydraulics...), replacing what's in its slot, for everyone, as
196
+ * SA-MP's AddVehicleComponent. Returns false if it doesn't fit this model
197
+ * (by the game's own carmods.dat).
198
+ */
199
+ addComponent(part: number): boolean;
200
+ /** Takes a tuning part off. */
201
+ removeComponent(part: number): void;
202
+ /** The tuning parts on it. */
203
+ get components(): number[];
204
+ /**
205
+ * The part in a slot (`ComponentSlot`: spoiler, hood, roof, side skirt,
206
+ * lamps, nitro, exhaust, wheels, stereo, hydraulics, bumpers, vents), or
207
+ * 0, as SA-MP's GetVehicleComponentInSlot.
208
+ */
209
+ componentInSlot(slot: number): number;
210
+ /** Its paintjob (0-2, for the models that have them), or -1: none. As SA-MP's ChangeVehiclePaintjob (3 there: none). */
211
+ get paintjob(): number;
212
+ set paintjob(paintjob: number);
213
+ /**
214
+ * Its doors locked, for everyone (as SA-MP's SetVehicleParamsEx doors):
215
+ * no one can get in; those in it stay. `lockFor` sets it for one player.
216
+ */
217
+ get locked(): boolean;
218
+ set locked(locked: boolean);
219
+ /**
220
+ * Its doors for one player, whatever `locked` is for everyone (as
221
+ * SA-MP's SetVehicleParamsForPlayer): true locked, false open, null as
222
+ * for everyone again. A car lock system: `car.locked = true;
223
+ * car.lockFor(owner, false)`.
224
+ */
225
+ lockFor(player: Player, locked: boolean | null): void;
226
+ /**
227
+ * Its engine: true running, false off (it won't drive: SA-MP's manual
228
+ * engines), null as the game has it (on when someone drives). Default null.
229
+ */
230
+ get engine(): boolean | null;
231
+ set engine(on: boolean | null);
232
+ /** Its lights: true on, false off, null as the game has them (on at night). Default null. */
233
+ get lights(): boolean | null;
234
+ set lights(on: boolean | null);
235
+ /**
236
+ * A helicopter's searchlight: true on, false off, null as its pilot has it
237
+ * (a Police Maverick's pilot switches it with the horn). Default null.
238
+ * Any helicopter can have one. `searchlightOn` is whether it's on now.
239
+ */
240
+ get searchlight(): boolean | null;
241
+ set searchlight(on: boolean | null);
242
+ /**
243
+ * A plane's smoke trail: true on, false off, null as its pilot has it (a
244
+ * Stuntplane's or Cropduster's pilot switches it). Default null. It only
245
+ * shows while someone flies it with the engine running. `smokeOn` is
246
+ * whether it's on now.
247
+ */
248
+ get smoke(): boolean | null;
249
+ set smoke(on: boolean | null);
250
+ /**
251
+ * Its indicators: `"left"`, `"right"`, `"hazard"` or `"off"`, held so
252
+ * (its driver's keys then do nothing), or null as its driver has them
253
+ * (the default). They stay as left when the driver gets out. Cars, bikes
254
+ * and trucks; everyone sees them flash together. `indicatorsOn` is what
255
+ * they show now.
256
+ */
257
+ get indicators(): Indicators | null;
258
+ set indicators(to: Indicators | null);
259
+ /** Its indicators now (held, or as its driver last had them). */
260
+ get indicatorsOn(): Indicators;
261
+ /** Whether its searchlight is on now, as its driver's game has it. */
262
+ get searchlightOn(): boolean;
263
+ /**
264
+ * How dirty it is, 0 (clean) to 15 (the dirtiest the game shows), the
265
+ * same on every screen; null (the default): as each player's game has it
266
+ * (the game picks one as it makes the car). Pay 'n' Sprays and mod shop
267
+ * paint clean it (0).
268
+ */
269
+ get dirt(): number | null;
270
+ set dirt(level: number | null);
271
+ /** Whether its smoke trail is on now, as its driver's game has it. */
272
+ get smokeOn(): boolean;
273
+ /** Which way it faces (degrees, 0 north, anticlockwise). */
274
+ get heading(): number;
275
+ /** The interior it's in (seen only from there), as SA-MP's LinkVehicleToInterior. */
276
+ get interior(): number;
277
+ set interior(interior: number);
278
+ set world(world: number);
279
+ /** The player driving it, or null. */
280
+ get driver(): Player | null;
281
+ /** Full health and no visible damage, for everyone. Not for a wreck. */
282
+ repair(): void;
283
+ /** Part of the ambient traffic (the server removes it when nobody is near). */
284
+ get ambient(): boolean;
285
+ /** Blown up. A wreck stays one until respawned or destroyed. */
286
+ get wrecked(): boolean;
287
+ /** Blows it up for everyone, credited to `killer` if given. */
288
+ explode(killer?: Player): void;
289
+ /** Everyone in it, driver included: seat number -> player. */
290
+ /** Server peds in it: seat number -> ped. */
291
+ get peds(): Map<number, Ped>;
292
+ get occupants(): Map<number, Player>;
293
+ /**
294
+ * Hands it back to the game: the server removes it as it does ambient
295
+ * traffic, once nobody is near (a wreck after a while), unless it's
296
+ * someone's last car.
297
+ */
298
+ release(): void;
299
+ /** Removes it for everyone; its occupants are put out first. */
300
+ destroy(): void;
301
+ toString(): string;
302
+ }
303
+ /** A tuning part's slot (`ComponentSlot`), or -1. */
304
+ export declare function componentSlot(part: number): number;
305
+ /** Whether a tuning part fits a vehicle model (the game's own carmods.dat). */
306
+ export declare function componentFits(model: number, part: number): boolean;