@infernus/core 0.8.7

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 (106) hide show
  1. package/.eslintrc +3 -0
  2. package/LICENSE +21 -0
  3. package/README.md +5 -0
  4. package/dist/bundle.d.ts +1668 -0
  5. package/dist/bundle.js +1 -0
  6. package/package.json +37 -0
  7. package/rollup.config.mjs +29 -0
  8. package/src/controllers/command/index.ts +57 -0
  9. package/src/controllers/filterscript/index.ts +69 -0
  10. package/src/controllers/gamemode/index.ts +277 -0
  11. package/src/controllers/gamemode/settings.ts +3 -0
  12. package/src/controllers/gametext/index.ts +61 -0
  13. package/src/controllers/gangzone/baseGangZone.ts +284 -0
  14. package/src/controllers/gangzone/gangZoneBus.ts +8 -0
  15. package/src/controllers/gangzone/gangZoneEvent.ts +91 -0
  16. package/src/controllers/gangzone/index.ts +2 -0
  17. package/src/controllers/i18n/index.ts +81 -0
  18. package/src/controllers/index.ts +12 -0
  19. package/src/controllers/menu/baseMenu.ts +203 -0
  20. package/src/controllers/menu/index.ts +2 -0
  21. package/src/controllers/menu/menuBus.ts +8 -0
  22. package/src/controllers/menu/menuEvent.ts +76 -0
  23. package/src/controllers/netstats/index.ts +43 -0
  24. package/src/controllers/npc/index.ts +2 -0
  25. package/src/controllers/npc/npcEvent.ts +26 -0
  26. package/src/controllers/npc/npcFunc.ts +64 -0
  27. package/src/controllers/player/basePlayer.ts +980 -0
  28. package/src/controllers/player/index.ts +3 -0
  29. package/src/controllers/player/pauseChecker.ts +39 -0
  30. package/src/controllers/player/playerBus.ts +9 -0
  31. package/src/controllers/player/playerEvent.ts +468 -0
  32. package/src/controllers/promise/client/index.ts +31 -0
  33. package/src/controllers/promise/dialog/index.ts +143 -0
  34. package/src/controllers/textdraw/baseTextDraw.ts +416 -0
  35. package/src/controllers/textdraw/index.ts +2 -0
  36. package/src/controllers/textdraw/textdrawBus.ts +8 -0
  37. package/src/controllers/textdraw/textdrawEvent.ts +61 -0
  38. package/src/controllers/vehicle/baseVehicle.ts +503 -0
  39. package/src/controllers/vehicle/index.ts +2 -0
  40. package/src/controllers/vehicle/vehicleBus.ts +8 -0
  41. package/src/controllers/vehicle/vehicleEvent.ts +201 -0
  42. package/src/enums/artwork.ts +5 -0
  43. package/src/enums/clickSources.ts +3 -0
  44. package/src/enums/dialogStyles.ts +8 -0
  45. package/src/enums/editResponseTypes.ts +5 -0
  46. package/src/enums/index.ts +18 -0
  47. package/src/enums/invalid.ts +13 -0
  48. package/src/enums/keys.ts +25 -0
  49. package/src/enums/limits.ts +18 -0
  50. package/src/enums/marker.ts +5 -0
  51. package/src/enums/netstat.ts +11 -0
  52. package/src/enums/npc.ts +11 -0
  53. package/src/enums/object.ts +25 -0
  54. package/src/enums/player.ts +92 -0
  55. package/src/enums/record.ts +5 -0
  56. package/src/enums/specialActions.ts +22 -0
  57. package/src/enums/streamer.ts +10 -0
  58. package/src/enums/textdrawFonts.ts +23 -0
  59. package/src/enums/vehicle.ts +32 -0
  60. package/src/enums/weapon.ts +82 -0
  61. package/src/interfaces/index.ts +233 -0
  62. package/src/logger/index.ts +24 -0
  63. package/src/main.ts +6 -0
  64. package/src/types/index.ts +48 -0
  65. package/src/utils/EventBus.ts +60 -0
  66. package/src/utils/animateUtils.ts +2504 -0
  67. package/src/utils/colorUtils.ts +43 -0
  68. package/src/utils/helperUtils.ts +403 -0
  69. package/src/utils/vehicleUtils.ts +321 -0
  70. package/src/wrapper/native/callbacks/index.ts +395 -0
  71. package/src/wrapper/native/functions/index.ts +3131 -0
  72. package/src/wrapper/streamer/3dtext/3dTextBus.ts +8 -0
  73. package/src/wrapper/streamer/3dtext/3dTextEvent.ts +70 -0
  74. package/src/wrapper/streamer/3dtext/base3DText.ts +184 -0
  75. package/src/wrapper/streamer/3dtext/index.ts +2 -0
  76. package/src/wrapper/streamer/actor/actorBus.ts +8 -0
  77. package/src/wrapper/streamer/actor/actorEvent.ts +95 -0
  78. package/src/wrapper/streamer/actor/baseActor.ts +278 -0
  79. package/src/wrapper/streamer/actor/index.ts +2 -0
  80. package/src/wrapper/streamer/area/areaBus.ts +8 -0
  81. package/src/wrapper/streamer/area/areaEvent.ts +99 -0
  82. package/src/wrapper/streamer/area/baseArea.ts +450 -0
  83. package/src/wrapper/streamer/area/index.ts +2 -0
  84. package/src/wrapper/streamer/checkpoint/baseCheckpoint.ts +136 -0
  85. package/src/wrapper/streamer/checkpoint/checkPointBus.ts +8 -0
  86. package/src/wrapper/streamer/checkpoint/checkPointEvent.ts +100 -0
  87. package/src/wrapper/streamer/checkpoint/index.ts +2 -0
  88. package/src/wrapper/streamer/common/index.ts +318 -0
  89. package/src/wrapper/streamer/index.ts +9 -0
  90. package/src/wrapper/streamer/mapIcon/baseMapIcon.ts +128 -0
  91. package/src/wrapper/streamer/mapIcon/index.ts +2 -0
  92. package/src/wrapper/streamer/mapIcon/mapIconBus.ts +8 -0
  93. package/src/wrapper/streamer/mapIcon/mapIconEvent.ts +67 -0
  94. package/src/wrapper/streamer/object/baseObject.ts +415 -0
  95. package/src/wrapper/streamer/object/index.ts +2 -0
  96. package/src/wrapper/streamer/object/objectBus.ts +8 -0
  97. package/src/wrapper/streamer/object/objectEvent.ts +177 -0
  98. package/src/wrapper/streamer/pickup/basePickup.ts +114 -0
  99. package/src/wrapper/streamer/pickup/index.ts +2 -0
  100. package/src/wrapper/streamer/pickup/pickupBus.ts +8 -0
  101. package/src/wrapper/streamer/pickup/pickupEvent.ts +84 -0
  102. package/src/wrapper/streamer/raceCP/baseRaceCP.ts +151 -0
  103. package/src/wrapper/streamer/raceCP/index.ts +2 -0
  104. package/src/wrapper/streamer/raceCP/raceCPBus.ts +8 -0
  105. package/src/wrapper/streamer/raceCP/raceCPEvent.ts +100 -0
  106. package/tsconfig.json +16 -0
@@ -0,0 +1,503 @@
1
+ import type { CarModTypeEnum, VehicleModelInfoEnum } from "@/enums";
2
+ import { LimitsEnum } from "@/enums";
3
+ import type { TPos } from "@/types";
4
+ import type { IVehicle } from "@/interfaces";
5
+ import type { Player } from "../player";
6
+ import { logger } from "@/logger";
7
+ import { isValidPaintJob, isValidVehComponent } from "@/utils/vehicleUtils";
8
+ import { vehicleBus, vehicleHooks } from "./vehicleBus";
9
+ import * as vehFunc from "@/wrapper/native/functions";
10
+
11
+ import { rgba } from "@/utils/colorUtils";
12
+ import {
13
+ GetVehicleMatrix,
14
+ GetVehicleTrainSpeed,
15
+ GetVehicleHydraReactorAngle,
16
+ GetVehicleLandingGearState,
17
+ GetVehicleSirenState,
18
+ GetVehicleModelsUsed,
19
+ GetVehicleDriver,
20
+ GetVehicleLastDriver,
21
+ GetVehicleModelCount,
22
+ IsVehicleSirenEnabled,
23
+ ToggleVehicleSirenEnabled,
24
+ IsVehicleDead,
25
+ GetVehicleRespawnTick,
26
+ IsVehicleOccupied,
27
+ HasVehicleBeenOccupied,
28
+ GetVehicleOccupiedTick,
29
+ GetVehicleCab,
30
+ GetVehicleRespawnDelay,
31
+ SetVehicleRespawnDelay,
32
+ GetVehicleNumberPlate,
33
+ GetVehicleInterior,
34
+ GetVehiclePaintjob,
35
+ GetVehicleColours,
36
+ SetVehicleSpawnInfo,
37
+ GetVehicleSpawnInfo,
38
+ } from "@infernus/wrapper";
39
+
40
+ export class Vehicle {
41
+ private _id = -1;
42
+ private static createdCount = 0;
43
+ private readonly sourceInfo: IVehicle;
44
+ private readonly isStatic: boolean;
45
+ get id(): number {
46
+ return this._id;
47
+ }
48
+ constructor(veh: IVehicle, isStatic = false) {
49
+ this.sourceInfo = veh;
50
+ this.isStatic = isStatic;
51
+ }
52
+ create(ignoreRange = false): void {
53
+ if (this.id !== -1)
54
+ return logger.warn("[Vehicle]: Unable to create the vehicle again");
55
+ if (Vehicle.createdCount === LimitsEnum.MAX_VEHICLES)
56
+ return logger.warn(
57
+ "[Vehicle]: Unable to continue to create vehicle, maximum allowable quantity has been reached"
58
+ );
59
+ const {
60
+ modelid,
61
+ x,
62
+ y,
63
+ z,
64
+ z_angle,
65
+ colour1,
66
+ colour2,
67
+ respawn_delay,
68
+ addsiren,
69
+ } = this.sourceInfo;
70
+ if (!ignoreRange && (modelid < 400 || modelid > 611)) return;
71
+ if (this.isStatic) {
72
+ if (respawn_delay === undefined) {
73
+ this._id = vehFunc.AddStaticVehicle(
74
+ modelid,
75
+ x,
76
+ y,
77
+ z,
78
+ z_angle,
79
+ colour1,
80
+ colour2
81
+ );
82
+ return;
83
+ }
84
+ this._id = vehFunc.AddStaticVehicleEx(
85
+ modelid,
86
+ x,
87
+ y,
88
+ z,
89
+ z_angle,
90
+ colour1,
91
+ colour2,
92
+ respawn_delay || -1,
93
+ addsiren || false
94
+ );
95
+ } else {
96
+ this._id = vehFunc.CreateVehicle(
97
+ modelid,
98
+ x,
99
+ y,
100
+ z,
101
+ z_angle,
102
+ colour1,
103
+ colour2,
104
+ respawn_delay || -1,
105
+ addsiren || false
106
+ );
107
+ }
108
+ Vehicle.createdCount++;
109
+ vehicleBus.emit(vehicleHooks.created, this);
110
+ }
111
+ destroy(): void {
112
+ if (this.id === -1)
113
+ return logger.warn(
114
+ "[Vehicle]: Unable to destroy the vehicle before create"
115
+ );
116
+ vehFunc.DestroyVehicle(this.id);
117
+ Vehicle.createdCount--;
118
+ vehicleBus.emit(vehicleHooks.destroyed, this);
119
+ this._id = -1;
120
+ }
121
+ addComponent(componentid: number): number {
122
+ if (this.id === -1) return 0;
123
+ if (!isValidVehComponent(this.getModel(), componentid)) {
124
+ logger.warn(
125
+ `[Vehicle]: Invalid component id ${componentid} attempted to attach to the vehicle ${this}`
126
+ );
127
+ return 0;
128
+ }
129
+ return vehFunc.AddVehicleComponent(this.id, componentid);
130
+ }
131
+ removeComponent(componentid: number): number {
132
+ if (this.getComponentInSlot(Vehicle.getComponentType(componentid)) === 0) {
133
+ logger.warn(
134
+ `[Vehicle]: component id ${componentid} does not exist on this vehicle`
135
+ );
136
+ return 0;
137
+ }
138
+ return vehFunc.RemoveVehicleComponent(this.id, componentid);
139
+ }
140
+ getComponentInSlot(slot: CarModTypeEnum) {
141
+ return vehFunc.GetVehicleComponentInSlot(this.id, slot);
142
+ }
143
+ static getComponentType(component: number) {
144
+ return vehFunc.GetVehicleComponentType(component);
145
+ }
146
+ linkToInterior(interiorId: number): number {
147
+ if (this.id === -1) return 0;
148
+ return vehFunc.LinkVehicleToInterior(this.id, interiorId);
149
+ }
150
+ setVirtualWorld(worldId: number): number {
151
+ if (this.id === -1) return 0;
152
+ return vehFunc.SetVehicleVirtualWorld(this.id, worldId);
153
+ }
154
+ getVirtualWorld(): number {
155
+ if (this.id === -1) return 0;
156
+ return vehFunc.GetVehicleVirtualWorld(this.id);
157
+ }
158
+ repair(): number {
159
+ if (this.id === -1) return 0;
160
+ return vehFunc.RepairVehicle(this.id);
161
+ }
162
+ setPos(x: number, y: number, z: number): number {
163
+ if (this.id === -1) return 0;
164
+ return vehFunc.SetVehiclePos(this.id, x, y, z);
165
+ }
166
+ getPos(): void | TPos {
167
+ if (this.id === -1) return;
168
+ return vehFunc.GetVehiclePos(this.id);
169
+ }
170
+ getHealth(): number {
171
+ if (this.id === -1) return 0;
172
+ return vehFunc.GetVehicleHealth(this.id);
173
+ }
174
+ setHealth(health: number): number {
175
+ if (this.id === -1) return 0;
176
+ return vehFunc.SetVehicleHealth(this.id, health);
177
+ }
178
+ isPlayerIn<P extends Player>(player: P): boolean {
179
+ if (this.id === -1) return false;
180
+ return vehFunc.IsPlayerInVehicle(player.id, this.id);
181
+ }
182
+ putPlayerIn<P extends Player>(player: P, seatid: number): number {
183
+ if (this.id === -1) return 0;
184
+ if (seatid < 0) return 0;
185
+ if (seatid > 4) {
186
+ logger.warn(
187
+ "[Vehicle]: If the seat is invalid or is taken, will cause a crash when they EXIT the vehicle."
188
+ );
189
+ }
190
+ return vehFunc.PutPlayerInVehicle(player.id, this.id, seatid);
191
+ }
192
+ getZAngle(): number {
193
+ if (this.id === -1) return 0;
194
+ return vehFunc.GetVehicleZAngle(this.id);
195
+ }
196
+ setZAngle(z_angle: number): number {
197
+ if (this.id === -1) return 0;
198
+ return vehFunc.SetVehicleZAngle(this.id, z_angle);
199
+ }
200
+ setNumberPlate(numberplate: string): number {
201
+ if (this.id === -1) return 0;
202
+ if (numberplate.length < 1 || numberplate.length > 32) {
203
+ logger.error(
204
+ "[Vehicle]: The length of the number plate ranges from 32 characters"
205
+ );
206
+ return 0;
207
+ }
208
+ if (!/^[a-zA-Z0-9]+$/.test(numberplate)) {
209
+ logger.error("[Vehicle]: number plates only allow letters and numbers");
210
+ return 0;
211
+ }
212
+ return vehFunc.SetVehicleNumberPlate(this.id, numberplate);
213
+ }
214
+ static getPoolSize(): number {
215
+ return vehFunc.GetVehiclePoolSize();
216
+ }
217
+ changeColours(colour1: string | number, colour2: string | number): number {
218
+ if (this.id === -1) return 0;
219
+ return vehFunc.ChangeVehicleColours(this.id, colour1, colour2);
220
+ }
221
+ setVelocity(X: number, Y: number, Z: number): number {
222
+ if (this.id === -1) return 0;
223
+ return vehFunc.SetVehicleVelocity(this.id, X, Y, Z);
224
+ }
225
+ getVelocity(): void | TPos {
226
+ if (this.id === -1) return;
227
+ const [x, y, z] = vehFunc.GetVehicleVelocity(this.id);
228
+ return { x, y, z };
229
+ }
230
+ setAngularVelocity(X: number, Y: number, Z: number): number {
231
+ if (this.id === -1) return 0;
232
+ return vehFunc.SetVehicleAngularVelocity(this.id, X, Y, Z);
233
+ }
234
+ getDamageStatus() {
235
+ if (this.id === -1) return;
236
+ return vehFunc.GetVehicleDamageStatus(this.id);
237
+ }
238
+ updateDamageStatus(
239
+ panels: number,
240
+ doors: number,
241
+ lights: number,
242
+ tires: number
243
+ ): void {
244
+ if (this.id === -1) return;
245
+ vehFunc.UpdateVehicleDamageStatus(this.id, panels, doors, lights, tires);
246
+ }
247
+ getDistanceFromPoint(X: number, Y: number, Z: number): number {
248
+ return vehFunc.GetVehicleDistanceFromPoint(this.id, X, Y, Z);
249
+ }
250
+ getModel(): number {
251
+ return vehFunc.GetVehicleModel(this.id);
252
+ }
253
+ static getModelInfo(
254
+ vehiclemodel: number,
255
+ infotype: VehicleModelInfoEnum
256
+ ): TPos {
257
+ return vehFunc.GetVehicleModelInfo(vehiclemodel, infotype);
258
+ }
259
+ getModelInfo(infotype: VehicleModelInfoEnum): void | TPos {
260
+ if (this.id === -1) return;
261
+ return Vehicle.getModelInfo(this.getModel(), infotype);
262
+ }
263
+ getRotationQuat() {
264
+ if (this.id === -1) return;
265
+ const [w, x, y, z] = vehFunc.GetVehicleRotationQuat(this.id);
266
+ return { w, x, y, z };
267
+ }
268
+ setRespawn(): number {
269
+ if (this.id === -1) return 0;
270
+ return vehFunc.SetVehicleToRespawn(this.id);
271
+ }
272
+ isStreamedIn<P extends Player>(forplayer: P): boolean {
273
+ if (this.id === -1) return false;
274
+ return vehFunc.IsVehicleStreamedIn(this.id, forplayer.id);
275
+ }
276
+ setParamsCarDoors(
277
+ driver: boolean,
278
+ passenger: boolean,
279
+ backleft: boolean,
280
+ backright: boolean
281
+ ): number {
282
+ if (this.id === -1) return 0;
283
+ return vehFunc.SetVehicleParamsCarDoors(
284
+ this.id,
285
+ driver,
286
+ passenger,
287
+ backleft,
288
+ backright
289
+ );
290
+ }
291
+ setParamsCarWindows(
292
+ driver: boolean,
293
+ passenger: boolean,
294
+ backleft: boolean,
295
+ backright: boolean
296
+ ) {
297
+ if (this.id === -1) return 0;
298
+ return vehFunc.SetVehicleParamsCarWindows(
299
+ this.id,
300
+ driver,
301
+ passenger,
302
+ backleft,
303
+ backright
304
+ );
305
+ }
306
+ getParamsCarDoors() {
307
+ if (this.id === -1) return undefined;
308
+ return vehFunc.GetVehicleParamsCarDoors(this.id);
309
+ }
310
+ getParamsCarWindows() {
311
+ if (this.id === -1) return undefined;
312
+ return vehFunc.GetVehicleParamsCarWindows(this.id);
313
+ }
314
+ setParamsEx(
315
+ engine: boolean,
316
+ lights: boolean,
317
+ alarm: boolean,
318
+ doors: boolean,
319
+ bonnet: boolean,
320
+ boot: boolean,
321
+ objective: boolean
322
+ ): number {
323
+ if (this.id === -1) return 0;
324
+ return vehFunc.SetVehicleParamsEx(
325
+ this.id,
326
+ engine,
327
+ lights,
328
+ alarm,
329
+ doors,
330
+ bonnet,
331
+ boot,
332
+ objective
333
+ );
334
+ }
335
+ getParamsEx() {
336
+ if (this.id === -1) return undefined;
337
+ const [engine, lights, alarm, doors, bonnet, boot, objective] =
338
+ vehFunc.GetVehicleParamsEx(this.id);
339
+ return { engine, lights, alarm, doors, bonnet, boot, objective };
340
+ }
341
+ getParamsSirenState(): number {
342
+ if (this.id === -1) return -2;
343
+ return vehFunc.GetVehicleParamsSirenState(this.id);
344
+ }
345
+ setParamsForPlayer<P extends Player>(
346
+ player: P,
347
+ objective: boolean,
348
+ doorslocked: boolean
349
+ ): number {
350
+ if (this.id === -1) return 0;
351
+ return vehFunc.SetVehicleParamsForPlayer(
352
+ this.id,
353
+ player.id,
354
+ objective,
355
+ doorslocked
356
+ );
357
+ }
358
+ isTrailerAttached(): boolean {
359
+ if (this.id === -1) return false;
360
+ return vehFunc.IsTrailerAttachedToVehicle(this.id);
361
+ }
362
+ changePaintjob(paintjobid: 0 | 1 | 2): number {
363
+ if (this.id === -1) return 0;
364
+ if (!isValidPaintJob(this.getModel(), paintjobid)) return 0;
365
+ this.changeColours("#fff", "#fff");
366
+ vehFunc.ChangeVehiclePaintjob(this.id, paintjobid);
367
+ return 1;
368
+ }
369
+ attachTrailer<V extends Vehicle>(trailer: V): number {
370
+ if (this.id === -1) return 0;
371
+ return vehFunc.AttachTrailerToVehicle(trailer.id, this.id);
372
+ }
373
+ detachTrailer() {
374
+ if (this.id === -1) return;
375
+ if (this.isTrailerAttached()) vehFunc.DetachTrailerFromVehicle(this.id);
376
+ }
377
+ getTrailer<V extends Vehicle>(vehicles: Array<V>): V | undefined {
378
+ if (this.id === -1) return;
379
+ return vehicles.find((v) => v.id === vehFunc.GetVehicleTrailer(this.id));
380
+ }
381
+ isValid(): boolean {
382
+ return vehFunc.IsValidVehicle(this.id);
383
+ }
384
+ static isValid(id: number): boolean {
385
+ return vehFunc.IsValidVehicle(id);
386
+ }
387
+ getMatrix() {
388
+ if (this.id === -1) return;
389
+ return GetVehicleMatrix(this.id);
390
+ }
391
+ getTrainSpeed(): number {
392
+ if (this.id === -1) return 0;
393
+ return GetVehicleTrainSpeed(this.id);
394
+ }
395
+ getHydraReactorAngle(): number {
396
+ if (this.id === -1) return 0;
397
+ return GetVehicleHydraReactorAngle(this.id);
398
+ }
399
+ getLandingGearState(): number {
400
+ if (this.id === -1) return 0;
401
+ return GetVehicleLandingGearState(this.id);
402
+ }
403
+ getSirenState(): number {
404
+ if (this.id === -1) return 0;
405
+ return GetVehicleSirenState(this.id);
406
+ }
407
+ static getModelsUsed = GetVehicleModelsUsed;
408
+ getDriver<P extends Player>(players: Map<number, P>): P | undefined {
409
+ if (this.id === -1) return;
410
+ return players.get(GetVehicleDriver(this.id));
411
+ }
412
+ getLastDriver<P extends Player>(players: Map<number, P>): P | undefined {
413
+ if (this.id === -1) return;
414
+ return players.get(GetVehicleLastDriver(this.id));
415
+ }
416
+ static getModelCount = GetVehicleModelCount;
417
+ isSirenEnabled(): boolean {
418
+ return IsVehicleSirenEnabled(this.id);
419
+ }
420
+ toggleSirenEnabled(enabled: boolean): number {
421
+ if (this.id === -1) return 0;
422
+ return ToggleVehicleSirenEnabled(this.id, enabled);
423
+ }
424
+ isDead(): boolean {
425
+ if (this.id === -1) return true;
426
+ return IsVehicleDead(this.id);
427
+ }
428
+ getRespawnTick(): number {
429
+ if (this.id === -1) return 0;
430
+ return GetVehicleRespawnTick(this.id);
431
+ }
432
+ isOccupied(): boolean {
433
+ if (this.id === -1) return false;
434
+ return IsVehicleOccupied(this.id);
435
+ }
436
+ hasBeenOccupied(): boolean {
437
+ if (this.id === -1) return false;
438
+ return HasVehicleBeenOccupied(this.id);
439
+ }
440
+ getOccupiedTick(): number {
441
+ if (this.id === -1) return 0;
442
+ return GetVehicleOccupiedTick(this.id);
443
+ }
444
+ getCab(): number {
445
+ if (this.id === -1) return 0;
446
+ return GetVehicleCab(this.id);
447
+ }
448
+ getRespawnDelay(): number {
449
+ if (this.id === -1) return 0;
450
+ return GetVehicleRespawnDelay(this.id);
451
+ }
452
+ setRespawnDelay(delay: number): number {
453
+ if (this.id === -1) return 0;
454
+ return SetVehicleRespawnDelay(this.id, delay);
455
+ }
456
+ getNumberPlate(): string {
457
+ if (this.id === -1) return "";
458
+ return GetVehicleNumberPlate(this.id);
459
+ }
460
+ getInterior(): number {
461
+ if (this.id === -1) return 0;
462
+ return GetVehicleInterior(this.id);
463
+ }
464
+ getPaintjob(): number {
465
+ if (this.id === -1) return -1;
466
+ return GetVehiclePaintjob(this.id);
467
+ }
468
+ getColours() {
469
+ if (this.id === -1) return;
470
+ return GetVehicleColours(this.id);
471
+ }
472
+ setSpawnInfo(
473
+ modelid: number,
474
+ fX: number,
475
+ fY: number,
476
+ fZ: number,
477
+ fAngle: number,
478
+ colour1: string | number,
479
+ colour2: string | number,
480
+ respawntime = -2,
481
+ interior = -2,
482
+ ignoreRange = false
483
+ ): number {
484
+ if (this.id === -1) return 0;
485
+ if (!ignoreRange && (modelid < 400 || modelid > 611)) return 0;
486
+ return SetVehicleSpawnInfo(
487
+ this.id,
488
+ modelid,
489
+ fX,
490
+ fY,
491
+ fZ,
492
+ fAngle,
493
+ rgba(colour1),
494
+ rgba(colour2),
495
+ respawntime,
496
+ interior
497
+ );
498
+ }
499
+ getSpawnInfo() {
500
+ if (this.id === -1) return;
501
+ return GetVehicleSpawnInfo(this.id);
502
+ }
503
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./baseVehicle";
2
+ export * from "./vehicleEvent";
@@ -0,0 +1,8 @@
1
+ import { EventBus } from "@/utils/eventBus";
2
+
3
+ export enum vehicleHooks {
4
+ created = "OnVehicleCreate",
5
+ destroyed = "OnVehicleDestroy",
6
+ }
7
+
8
+ export const vehicleBus = new EventBus();
@@ -0,0 +1,201 @@
1
+ import type { TCommonCallback } from "@/types";
2
+ import { promisifyCallback } from "@/utils/helperUtils";
3
+ import {
4
+ OnNPCEnterVehicle,
5
+ OnNPCExitVehicle,
6
+ OnPlayerEnterVehicle,
7
+ OnPlayerExitVehicle,
8
+ OnVehicleDamageStatusUpdate,
9
+ OnVehicleDeath,
10
+ OnVehicleMod,
11
+ OnVehiclePaintjob,
12
+ OnVehicleRespray,
13
+ OnVehicleSirenStateChange,
14
+ OnVehicleSpawn,
15
+ OnVehicleStreamIn,
16
+ OnVehicleStreamOut,
17
+ OnTrailerUpdate,
18
+ OnGameModeExit,
19
+ } from "@/wrapper/native/callbacks";
20
+ import type { Player } from "../player";
21
+ import type { Vehicle } from "./baseVehicle";
22
+ import { vehicleBus, vehicleHooks } from "./vehicleBus";
23
+
24
+ export class VehicleEvent<P extends Player, V extends Vehicle> {
25
+ private readonly vehicles = new Map<number, V>();
26
+ private readonly players;
27
+
28
+ constructor(playersMap: Map<number, P>, destroyOnExit = true) {
29
+ this.players = playersMap;
30
+ // The class event is extended through the event bus
31
+ vehicleBus.on(vehicleHooks.created, (veh: V) => {
32
+ this.vehicles.set(veh.id, veh);
33
+ });
34
+ vehicleBus.on(vehicleHooks.destroyed, (veh: V) => {
35
+ this.vehicles.delete(veh.id);
36
+ });
37
+ if (destroyOnExit) {
38
+ OnGameModeExit(() => {
39
+ this.vehicles.forEach((v) => v.destroy());
40
+ this.vehicles.clear();
41
+ });
42
+ }
43
+ OnVehicleDamageStatusUpdate((vehicleid, playerid): number => {
44
+ const v = this.findVehicleById(vehicleid);
45
+ if (!v) return 0;
46
+ const p = this.findPlayerById(playerid);
47
+ if (!p) return 0;
48
+ const pFn = promisifyCallback(
49
+ this,
50
+ "onDamageStatusUpdate",
51
+ "OnVehicleDamageStatusUpdate"
52
+ );
53
+ return pFn(v, p);
54
+ });
55
+ OnVehicleDeath((vehicleid, killerid): number => {
56
+ const v = this.findVehicleById(vehicleid);
57
+ if (!v) return 0;
58
+ const k = this.findPlayerById(killerid);
59
+ if (!k) return 0;
60
+ const pFn = promisifyCallback(this, "onDeath", "OnVehicleDeath");
61
+ return pFn(v, k);
62
+ });
63
+ OnVehicleMod((playerid, vehicleid, componentid): number => {
64
+ const p = this.findPlayerById(playerid);
65
+ if (!p) return 1;
66
+ const v = this.findVehicleById(vehicleid);
67
+ if (!v) return 1;
68
+ const pFn = promisifyCallback(this, "onMod", "OnVehicleMod");
69
+ return pFn(p, v, componentid);
70
+ });
71
+ OnVehiclePaintjob((playerid, vehicleid, paintjobid): number => {
72
+ const p = this.findPlayerById(playerid);
73
+ if (!p) return 1;
74
+ const v = this.findVehicleById(vehicleid);
75
+ if (!v) return 1;
76
+ const pFn = promisifyCallback(this, "onPaintjob", "OnVehiclePaintjob");
77
+ return pFn(p, v, paintjobid);
78
+ });
79
+ OnVehicleRespray((playerid, vehicleid, colour1, colour2): number => {
80
+ const p = this.findPlayerById(playerid);
81
+ if (!p) return 1;
82
+ const v = this.findVehicleById(vehicleid);
83
+ if (!v) return 1;
84
+ const pFn = promisifyCallback(this, "onRespray", "OnVehicleRespray");
85
+ return pFn(p, v, colour1, colour2);
86
+ });
87
+ OnVehicleSirenStateChange((playerid, vehicleid, newstate): number => {
88
+ const p = this.findPlayerById(playerid);
89
+ if (!p) return 0;
90
+ const v = this.findVehicleById(vehicleid);
91
+ if (!v) return 0;
92
+ const pFn = promisifyCallback(
93
+ this,
94
+ "onSirenStateChange",
95
+ "OnVehicleSirenStateChange"
96
+ );
97
+ return pFn(p, v, Boolean(newstate));
98
+ });
99
+ OnVehicleSpawn((vehicleid): number => {
100
+ const v = this.findVehicleById(vehicleid);
101
+ if (!v) return 1;
102
+ const pFn = promisifyCallback(this, "onSpawn", "OnVehicleSpawn");
103
+ return pFn(v);
104
+ });
105
+ OnVehicleStreamIn((vehicleid, forplayerid): number => {
106
+ const v = this.findVehicleById(vehicleid);
107
+ if (!v) return 0;
108
+ const p = this.findPlayerById(forplayerid);
109
+ if (!p) return 0;
110
+ const pFn = promisifyCallback(this, "onStreamIn", "OnVehicleStreamIn");
111
+ return pFn(v, p);
112
+ });
113
+ OnVehicleStreamOut((vehicleid, forplayerid): number => {
114
+ const v = this.findVehicleById(vehicleid);
115
+ if (!v) return 0;
116
+ const p = this.findPlayerById(forplayerid);
117
+ if (!p) return 0;
118
+ const pFn = promisifyCallback(this, "onStreamOut", "OnVehicleStreamOut");
119
+ return pFn(v, p);
120
+ });
121
+ OnPlayerEnterVehicle((playerid, vehicleid, ispassenger): number => {
122
+ const p = this.findPlayerById(playerid);
123
+ if (!p) return 0;
124
+ const v = this.findVehicleById(vehicleid);
125
+ if (!v) return 0;
126
+ const pFn = promisifyCallback(
127
+ this,
128
+ "onPlayerEnter",
129
+ "OnPlayerEnterVehicle"
130
+ );
131
+ return pFn(p, v, Boolean(ispassenger));
132
+ });
133
+ OnPlayerExitVehicle((playerid, vehicleid): number => {
134
+ const p = this.findPlayerById(playerid);
135
+ if (!p) return 0;
136
+ const v = this.findVehicleById(vehicleid);
137
+ if (!v) return 0;
138
+ const pFn = promisifyCallback(
139
+ this,
140
+ "onPlayerExit",
141
+ "OnPlayerExitVehicle"
142
+ );
143
+ return pFn(p, v);
144
+ });
145
+ OnNPCEnterVehicle((vehicleid, seatid): number => {
146
+ const v = this.findVehicleById(vehicleid);
147
+ if (!v) return 0;
148
+ const pFn = promisifyCallback(this, "onNpcEnter", "OnNPCEnterVehicle");
149
+ return pFn(v, seatid);
150
+ });
151
+ OnNPCExitVehicle(promisifyCallback(this, "onNpcExit", "OnNPCExitVehicle"));
152
+ OnTrailerUpdate((playerid, vehicleid): number => {
153
+ const p = this.findPlayerById(playerid);
154
+ if (!p) return 0;
155
+ const v = this.findVehicleById(vehicleid);
156
+ if (!v) return 0;
157
+ const pFn = promisifyCallback(this, "onTrailerUpdate");
158
+ return pFn(p, v);
159
+ });
160
+ }
161
+
162
+ onDamageStatusUpdate?(vehicle: V, player: P): TCommonCallback;
163
+ onDeath?(vehicle: V, killer: P): TCommonCallback;
164
+ onMod?(player: P, vehicle: V, componentid: number): TCommonCallback;
165
+ onPaintjob?(player: P, vehicle: V, paintjobid: number): TCommonCallback;
166
+ onRespray?(
167
+ player: P,
168
+ vehicle: V,
169
+ colour1: number,
170
+ colour2: number
171
+ ): TCommonCallback;
172
+ onSirenStateChange?(
173
+ player: P,
174
+ vehicle: V,
175
+ newstate: boolean
176
+ ): TCommonCallback;
177
+ onSpawn?(vehicle: V): TCommonCallback;
178
+ onStreamIn?(vehicle: V, forplayer: P): TCommonCallback;
179
+ onStreamOut?(vehicle: V, forplayer: P): TCommonCallback;
180
+ onPlayerEnter?(player: P, vehicle: V, isPassenger: boolean): TCommonCallback;
181
+ onPlayerExit?(player: P, vehicle: V): TCommonCallback;
182
+ onNpcEnter?(vehicle: V, seatid: number): TCommonCallback;
183
+ onNpcExit?(): TCommonCallback;
184
+ onTrailerUpdate?(player: P, vehicle: V): TCommonCallback;
185
+
186
+ findVehicleById(vehicleid: number) {
187
+ return this.vehicles.get(vehicleid);
188
+ }
189
+
190
+ private findPlayerById(playerid: number) {
191
+ return this.players.get(playerid);
192
+ }
193
+
194
+ getVehiclesArr(): Array<V> {
195
+ return [...this.vehicles.values()];
196
+ }
197
+
198
+ getVehiclesMap(): Map<number, V> {
199
+ return this.vehicles;
200
+ }
201
+ }