@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.
- package/LICENSE +21 -0
- package/README.md +61 -2
- package/dist/actions.d.ts +46 -0
- package/dist/actions.js +80 -0
- package/dist/actions.js.map +1 -0
- package/dist/animations.d.ts +32 -0
- package/dist/animations.js +95 -0
- package/dist/animations.js.map +1 -0
- package/dist/audio.d.ts +180 -0
- package/dist/audio.js +353 -0
- package/dist/audio.js.map +1 -0
- package/dist/audio_effects.d.ts +219 -0
- package/dist/audio_effects.js +84 -0
- package/dist/audio_effects.js.map +1 -0
- package/dist/camera.d.ts +188 -0
- package/dist/camera.js +247 -0
- package/dist/camera.js.map +1 -0
- package/dist/claims.d.ts +27 -0
- package/dist/claims.js +48 -0
- package/dist/claims.js.map +1 -0
- package/dist/commands.d.ts +135 -0
- package/dist/commands.js +373 -0
- package/dist/commands.js.map +1 -0
- package/dist/console.d.ts +21 -0
- package/dist/console.js +100 -0
- package/dist/console.js.map +1 -0
- package/dist/constants.d.ts +654 -0
- package/dist/constants.js +657 -0
- package/dist/constants.js.map +1 -0
- package/dist/cutscene.d.ts +47 -0
- package/dist/cutscene.js +190 -0
- package/dist/cutscene.js.map +1 -0
- package/dist/draw.d.ts +106 -0
- package/dist/draw.js +132 -0
- package/dist/draw.js.map +1 -0
- package/dist/effects.d.ts +91 -0
- package/dist/effects.js +116 -0
- package/dist/effects.js.map +1 -0
- package/dist/gangzones.d.ts +47 -0
- package/dist/gangzones.js +122 -0
- package/dist/gangzones.js.map +1 -0
- package/dist/geo.d.ts +11 -0
- package/dist/geo.js +25 -0
- package/dist/geo.js.map +1 -0
- package/dist/hud.d.ts +159 -0
- package/dist/hud.js +247 -0
- package/dist/hud.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction.d.ts +81 -0
- package/dist/interaction.js +143 -0
- package/dist/interaction.js.map +1 -0
- package/dist/junctions.d.ts +1 -0
- package/dist/junctions.js +330 -0
- package/dist/junctions.js.map +1 -0
- package/dist/map.d.ts +55 -0
- package/dist/map.js +71 -0
- package/dist/map.js.map +1 -0
- package/dist/menu.d.ts +96 -0
- package/dist/menu.js +129 -0
- package/dist/menu.js.map +1 -0
- package/dist/mission.d.ts +482 -0
- package/dist/mission.js +1258 -0
- package/dist/mission.js.map +1 -0
- package/dist/models.d.ts +56 -0
- package/dist/models.js +71 -0
- package/dist/models.js.map +1 -0
- package/dist/modshop.d.ts +229 -0
- package/dist/modshop.js +904 -0
- package/dist/modshop.js.map +1 -0
- package/dist/modshop_data.d.ts +44 -0
- package/dist/modshop_data.js +287 -0
- package/dist/modshop_data.js.map +1 -0
- package/dist/native.d.ts +809 -0
- package/dist/native.js +27 -0
- package/dist/native.js.map +1 -0
- package/dist/objects.d.ts +249 -0
- package/dist/objects.js +455 -0
- package/dist/objects.js.map +1 -0
- package/dist/paint.d.ts +124 -0
- package/dist/paint.js +84 -0
- package/dist/paint.js.map +1 -0
- package/dist/paynspray.d.ts +44 -0
- package/dist/paynspray.js +177 -0
- package/dist/paynspray.js.map +1 -0
- package/dist/ped.d.ts +335 -0
- package/dist/ped.js +536 -0
- package/dist/ped.js.map +1 -0
- package/dist/player.d.ts +685 -0
- package/dist/player.js +1163 -0
- package/dist/player.js.map +1 -0
- package/dist/screeneffects.d.ts +99 -0
- package/dist/screeneffects.js +257 -0
- package/dist/screeneffects.js.map +1 -0
- package/dist/scripts.d.ts +69 -0
- package/dist/scripts.js +125 -0
- package/dist/scripts.js.map +1 -0
- package/dist/server.d.ts +713 -0
- package/dist/server.js +1080 -0
- package/dist/server.js.map +1 -0
- package/dist/shopblips.d.ts +9 -0
- package/dist/shopblips.js +30 -0
- package/dist/shopblips.js.map +1 -0
- package/dist/special.d.ts +33 -0
- package/dist/special.js +26 -0
- package/dist/special.js.map +1 -0
- package/dist/splash.d.ts +42 -0
- package/dist/splash.js +55 -0
- package/dist/splash.js.map +1 -0
- package/dist/text.d.ts +19 -0
- package/dist/text.js +25 -0
- package/dist/text.js.map +1 -0
- package/dist/ui.d.ts +141 -0
- package/dist/ui.js +243 -0
- package/dist/ui.js.map +1 -0
- package/dist/vehicle.d.ts +306 -0
- package/dist/vehicle.js +612 -0
- package/dist/vehicle.js.map +1 -0
- package/dist/vehiclecolors.d.ts +26 -0
- package/dist/vehiclecolors.js +49 -0
- package/dist/vehiclecolors.js.map +1 -0
- package/dist/world.d.ts +222 -0
- package/dist/world.js +227 -0
- package/dist/world.js.map +1 -0
- package/dist/zone.d.ts +89 -0
- package/dist/zone.js +140 -0
- package/dist/zone.js.map +1 -0
- 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;
|