@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.
- 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/vehicle.js
ADDED
|
@@ -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
|
+
}
|