@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,980 @@
1
+ import type { IClientResRaw } from "@/interfaces";
2
+ import {
3
+ BanEx,
4
+ GetPlayerName,
5
+ SendClientMessage,
6
+ SendClientMessageToAll,
7
+ SendPlayerMessageToAll,
8
+ SendPlayerMessageToPlayer,
9
+ SetPlayerName,
10
+ } from "@/utils/helperUtils";
11
+ import * as playerFunc from "@/wrapper/native/functions";
12
+ import { logger } from "@/logger";
13
+ import type {
14
+ BoneIdsEnum,
15
+ CameraModesEnum,
16
+ FightingStylesEnum,
17
+ WeaponEnum,
18
+ WeaponSkillsEnum,
19
+ WeaponStatesEnum,
20
+ } from "@/enums";
21
+ import {
22
+ CameraCutStylesEnum,
23
+ DamageDeathReasonEnum,
24
+ InvalidEnum,
25
+ PlayerStateEnum,
26
+ SpecialActionsEnum,
27
+ SpectateModesEnum,
28
+ } from "@/enums";
29
+ import type { Vehicle } from "../vehicle";
30
+ import type { TPos } from "@/types";
31
+
32
+ import { getAnimateDurationByLibName } from "@/utils/animateUtils";
33
+ import type { DynamicObject } from "../../wrapper/streamer";
34
+ import { ccWaitingQueue, delCCTask } from "../promise/client";
35
+ import {
36
+ GetPlayerWeather,
37
+ TogglePlayerWidescreen,
38
+ IsPlayerWidescreenToggled,
39
+ GetSpawnInfo,
40
+ GetPlayerSkillLevel,
41
+ IsPlayerCheckpointActive,
42
+ GetPlayerCheckpoint,
43
+ IsPlayerRaceCheckpointActive,
44
+ GetPlayerRaceCheckpoint,
45
+ GetPlayerWorldBounds,
46
+ IsPlayerInModShop,
47
+ GetPlayerSirenState,
48
+ GetPlayerLandingGearState,
49
+ GetPlayerHydraReactorAngle,
50
+ GetPlayerTrainSpeed,
51
+ GetPlayerZAim,
52
+ GetPlayerSurfingOffsets,
53
+ GetPlayerRotationQuat,
54
+ GetPlayerDialogID,
55
+ GetPlayerSpectateID,
56
+ GetPlayerSpectateType,
57
+ GetPlayerRawIp,
58
+ SetPlayerGravity,
59
+ GetPlayerGravity,
60
+ SetPlayerAdmin,
61
+ IsPlayerSpawned,
62
+ IsPlayerControllable,
63
+ IsPlayerCameraTargetEnabled,
64
+ TogglePlayerGhostMode,
65
+ GetPlayerGhostMode,
66
+ GetPlayerBuildingsRemoved,
67
+ GetPlayerAttachedObject,
68
+ RemovePlayerWeapon,
69
+ IsPlayerUsingOfficialClient,
70
+ AllowPlayerTeleport,
71
+ IsPlayerTeleportAllowed,
72
+ AllowPlayerWeapons,
73
+ ArePlayerWeaponsAllowed,
74
+ } from "@infernus/wrapper";
75
+ import { defaultCharset, defaultLocale } from "../gamemode/settings";
76
+ import { playerBus, playerHooks } from "./playerBus";
77
+
78
+ export class Player {
79
+ private _id: number;
80
+ private _isNpc: boolean;
81
+ private _locale: string = defaultLocale;
82
+ private _charset: string = defaultCharset;
83
+ private _isRecording = false;
84
+
85
+ lastDrunkLevel = 0;
86
+ lastFps = 0;
87
+ isPaused = false;
88
+ lastUpdateTick = 0;
89
+
90
+ get id(): number {
91
+ return this._id;
92
+ }
93
+ get locale(): string {
94
+ return this._locale;
95
+ }
96
+ set locale(value: string) {
97
+ playerBus.emit(playerHooks.setCommonProp, {
98
+ player: this,
99
+ prop: "_locale",
100
+ value,
101
+ });
102
+ }
103
+ get charset(): string {
104
+ return this._charset;
105
+ }
106
+ set charset(value: string) {
107
+ playerBus.emit(playerHooks.setCommonProp, {
108
+ player: this,
109
+ prop: "_charset",
110
+ value,
111
+ });
112
+ }
113
+ get isRecording() {
114
+ return this._isRecording;
115
+ }
116
+ set isRecording(value) {
117
+ playerBus.emit(playerHooks.setCommonProp, {
118
+ player: this,
119
+ prop: "_isRecording",
120
+ value,
121
+ });
122
+ }
123
+
124
+ constructor(id: number) {
125
+ this._id = id;
126
+ this._isNpc = playerFunc.IsPlayerNPC(this.id);
127
+ }
128
+
129
+ sendClientMessage(colour: string | number, msg: string): number {
130
+ return SendClientMessage(this, colour, msg);
131
+ }
132
+
133
+ static sendClientMessageToAll<P extends Player>(
134
+ players: Array<P>,
135
+ colour: string | number,
136
+ msg: string
137
+ ) {
138
+ SendClientMessageToAll(players, colour, msg);
139
+ }
140
+
141
+ sendPlayerMessage<P extends Player>(player: P, message: string): number {
142
+ return SendPlayerMessageToPlayer(player, this.id, message);
143
+ }
144
+
145
+ sendPlayerMessageToAll<P extends Player>(
146
+ players: Array<P>,
147
+ message: string
148
+ ): number {
149
+ return SendPlayerMessageToAll(players, this.id, message);
150
+ }
151
+
152
+ isNpc(): boolean {
153
+ return this._isNpc;
154
+ }
155
+
156
+ // first call will return 0;
157
+ // should be called at one second intervals, implemented internally by throttling
158
+ getFps(): number {
159
+ return this.lastFps;
160
+ }
161
+ getDrunkLevel(): number {
162
+ return playerFunc.GetPlayerDrunkLevel(this.id);
163
+ }
164
+ setDrunkLevel(level: number): void {
165
+ if (level < 0 || level > 50000)
166
+ return logger.error(
167
+ new Error("[Player]: player's drunk level ranges from 0 to 50000")
168
+ );
169
+ playerFunc.SetPlayerDrunkLevel(this.id, level);
170
+ }
171
+ allowTeleport(allow: boolean): void {
172
+ AllowPlayerTeleport(this.id, allow);
173
+ }
174
+ isTeleportAllowed() {
175
+ return IsPlayerTeleportAllowed(this.id);
176
+ }
177
+ enableCameraTarget(enable: boolean): void {
178
+ playerFunc.EnablePlayerCameraTarget(this.id, enable);
179
+ }
180
+ enableStuntBonus(enable: boolean): void {
181
+ playerFunc.EnableStuntBonusForPlayer(this.id, enable);
182
+ }
183
+ getInterior(): number {
184
+ return playerFunc.GetPlayerInterior(this.id);
185
+ }
186
+ setInterior(interiorId: number): number {
187
+ return playerFunc.SetPlayerInterior(this.id, interiorId);
188
+ }
189
+ showPlayerNameTag<P extends Player>(showPlayer: P, show: boolean): void {
190
+ playerFunc.ShowPlayerNameTagForPlayer(this.id, showPlayer.id, show);
191
+ }
192
+ setColor(colour: string | number): void {
193
+ playerFunc.SetPlayerColor(this.id, colour);
194
+ }
195
+ getColor(): number {
196
+ return playerFunc.GetPlayerColor(this.id);
197
+ }
198
+ setPlayerMarker<P extends Player>(showPlayer: P, colour: string | number) {
199
+ playerFunc.SetPlayerMarkerForPlayer(this.id, showPlayer.id, colour);
200
+ }
201
+ resetMoney(): number {
202
+ return playerFunc.ResetPlayerMoney(this.id);
203
+ }
204
+ getMoney(): number {
205
+ return playerFunc.GetPlayerMoney(this.id);
206
+ }
207
+ giveMoney(money: number): number {
208
+ return playerFunc.GivePlayerMoney(this.id, money);
209
+ }
210
+ resetWeapons(): number {
211
+ return playerFunc.ResetPlayerWeapons(this.id);
212
+ }
213
+ spawn(): number {
214
+ if (this.isSpectating()) {
215
+ this.toggleSpectating(false);
216
+ return 1;
217
+ }
218
+ return playerFunc.SpawnPlayer(this.id);
219
+ }
220
+ setHealth(health: number): number {
221
+ return playerFunc.SetPlayerHealth(this.id, health);
222
+ }
223
+ getHealth(): number {
224
+ return playerFunc.GetPlayerHealth(this.id);
225
+ }
226
+ toggleClock(toggle: boolean): number {
227
+ return playerFunc.TogglePlayerClock(this.id, toggle);
228
+ }
229
+ toggleControllable(toggle: boolean): number {
230
+ return playerFunc.TogglePlayerControllable(this.id, toggle);
231
+ }
232
+ toggleSpectating(toggle: boolean): number {
233
+ return playerFunc.TogglePlayerSpectating(this.id, toggle);
234
+ }
235
+ spectatePlayer<P extends Player>(
236
+ targetPlayer: P,
237
+ mode = SpectateModesEnum.NORMAL
238
+ ) {
239
+ return playerFunc.PlayerSpectatePlayer(this.id, targetPlayer.id, mode);
240
+ }
241
+ spectateVehicle<V extends Vehicle>(
242
+ targetVehicle: V,
243
+ mode = SpectateModesEnum.NORMAL
244
+ ) {
245
+ return playerFunc.PlayerSpectateVehicle(this.id, targetVehicle.id, mode);
246
+ }
247
+ forceClassSelection(): void {
248
+ playerFunc.ForceClassSelection(this.id);
249
+ }
250
+ kick(): void {
251
+ playerFunc.Kick(this.id);
252
+ }
253
+ ban(): void {
254
+ playerFunc.Ban(this.id);
255
+ }
256
+ banEx(reason: string, charset: string): void {
257
+ BanEx(this.id, reason, charset);
258
+ }
259
+ isAdmin() {
260
+ return playerFunc.IsPlayerAdmin(this.id);
261
+ }
262
+ isInRangeOfPoint(range: number, x: number, y: number, z: number) {
263
+ return playerFunc.IsPlayerInRangeOfPoint(this.id, range, x, y, z);
264
+ }
265
+ isStreamedIn<P extends Player>(forplayer: P) {
266
+ return playerFunc.IsPlayerStreamedIn(this.id, forplayer.id);
267
+ }
268
+ setSkin(skinId: number, ignoreRange = false): number {
269
+ if (!ignoreRange && (skinId < 0 || skinId > 311 || skinId == 74)) return 0;
270
+ if (this.getHealth() <= 0) return 0;
271
+ if (this.isInAnyVehicle()) return 0;
272
+ if (this.getSpecialAction() === SpecialActionsEnum.DUCK) return 0;
273
+ return playerFunc.SetPlayerSkin(this.id, skinId);
274
+ }
275
+ getSkin(): number {
276
+ return playerFunc.GetPlayerSkin(this.id);
277
+ }
278
+ isInAnyVehicle(): boolean {
279
+ return playerFunc.IsPlayerInAnyVehicle(this.id);
280
+ }
281
+ getSpecialAction(): SpecialActionsEnum {
282
+ return playerFunc.GetPlayerSpecialAction(this.id);
283
+ }
284
+ setSpecialAction(actionId: SpecialActionsEnum): number {
285
+ return playerFunc.SetPlayerSpecialAction(this.id, actionId);
286
+ }
287
+ setScore(score: number): number {
288
+ return playerFunc.SetPlayerScore(this.id, score);
289
+ }
290
+ getScore(): number {
291
+ return playerFunc.GetPlayerScore(this.id);
292
+ }
293
+ getPing(): number {
294
+ return playerFunc.GetPlayerPing(this.id) || 0;
295
+ }
296
+ setPos(x: number, y: number, z: number): number {
297
+ return playerFunc.SetPlayerPos(this.id, x, y, z);
298
+ }
299
+ getPos(): TPos | undefined {
300
+ if (
301
+ this.isSpectating() ||
302
+ this.isWasted() ||
303
+ this.getState() === PlayerStateEnum.NONE
304
+ )
305
+ return undefined;
306
+ const [x, y, z] = playerFunc.GetPlayerPos(this.id);
307
+ return { x, y, z };
308
+ }
309
+ isSpectating(): boolean {
310
+ return this.getState() === PlayerStateEnum.SPECTATING;
311
+ }
312
+ isWasted(): boolean {
313
+ return this.getState() === PlayerStateEnum.WASTED;
314
+ }
315
+ getState(): PlayerStateEnum {
316
+ return playerFunc.GetPlayerState(this.id);
317
+ }
318
+ getVersion(): string {
319
+ if (this.isNpc()) return "";
320
+ return playerFunc.GetPlayerVersion(this.id);
321
+ }
322
+ setVirtualWorld(worldId: number): number {
323
+ return playerFunc.SetPlayerVirtualWorld(this.id, worldId);
324
+ }
325
+ getVirtualWorld(): number {
326
+ return playerFunc.GetPlayerVirtualWorld(this.id);
327
+ }
328
+ removeFromVehicle(): number {
329
+ return playerFunc.RemovePlayerFromVehicle(this.id);
330
+ }
331
+ setWantedLevel(level: number): number {
332
+ if (level < 0 || level > 6) {
333
+ logger.error("[Player]: player's wanted level ranges from 0 to 6");
334
+ return 0;
335
+ }
336
+ return playerFunc.SetPlayerWantedLevel(this.id, level);
337
+ }
338
+ getWantedLevel(): number {
339
+ return playerFunc.GetPlayerWantedLevel(this.id);
340
+ }
341
+ setFacingAngle(ang: number): number {
342
+ return playerFunc.SetPlayerFacingAngle(this.id, ang);
343
+ }
344
+ getFacingAngle(): number {
345
+ return playerFunc.GetPlayerFacingAngle(this.id);
346
+ }
347
+ setWeather(weather: number): void {
348
+ if (weather < 0 || weather > 255) {
349
+ logger.warn("[Player]: The valid weather value is only 0 to 255");
350
+ return;
351
+ }
352
+ playerFunc.SetPlayerWeather(this.id, weather);
353
+ }
354
+ getWeather(): number {
355
+ return GetPlayerWeather(this.id);
356
+ }
357
+ setTime(hour: number, minute: number): void | number {
358
+ if (hour < 0 || hour > 23) {
359
+ logger.warn("[Player]: The valid hour value is only 0 to 23");
360
+ return;
361
+ }
362
+ if (minute < 0 || minute > 59) {
363
+ logger.warn("[Player]: The valid minute value is only 0 to 59");
364
+ return;
365
+ }
366
+ return playerFunc.SetPlayerTime(this.id, hour, minute);
367
+ }
368
+ getTime() {
369
+ const [hour, minute] = playerFunc.GetPlayerTime(this.id);
370
+ return { hour, minute };
371
+ }
372
+ removeBuilding(
373
+ modelid: number,
374
+ fX: number,
375
+ fY: number,
376
+ fZ: number,
377
+ fRadius: number
378
+ ): void {
379
+ playerFunc.RemoveBuildingForPlayer(this.id, modelid, fX, fY, fZ, fRadius);
380
+ }
381
+ setTeam(team: number): void {
382
+ if (team < 0 || team > InvalidEnum.NO_TEAM) return;
383
+ playerFunc.SetPlayerTeam(this.id, team);
384
+ }
385
+ getTeam(): number {
386
+ return playerFunc.GetPlayerTeam(this.id);
387
+ }
388
+ setSkillLevel(skill: WeaponSkillsEnum, level: number): void {
389
+ if (level < 0 || level > 999) {
390
+ logger.warn("[Player]: The valid skill level is only 0 to 999");
391
+ return;
392
+ }
393
+ playerFunc.SetPlayerSkillLevel(this.id, skill, level);
394
+ }
395
+ getName(): string {
396
+ return GetPlayerName(this);
397
+ }
398
+ setName(name: string): number {
399
+ return SetPlayerName(this, name);
400
+ }
401
+ setVelocity(x: number, y: number, z: number): number {
402
+ return playerFunc.SetPlayerVelocity(this.id, x, y, z);
403
+ }
404
+ getVelocity(): TPos {
405
+ const [x, y, z] = playerFunc.GetPlayerVelocity(this.id);
406
+ return { x, y, z };
407
+ }
408
+ getKeys() {
409
+ const [keys, updown, leftright] = playerFunc.GetPlayerKeys(this.id);
410
+ return { keys, updown, leftright };
411
+ }
412
+ getIp(): string {
413
+ return playerFunc.GetPlayerIp(this.id);
414
+ }
415
+ getFightingStyle(): FightingStylesEnum {
416
+ return playerFunc.GetPlayerFightingStyle(this.id);
417
+ }
418
+ setFightingStyle(style: FightingStylesEnum): void {
419
+ playerFunc.SetPlayerFightingStyle(this.id, style);
420
+ }
421
+ setArmour(armour: number): number {
422
+ return playerFunc.SetPlayerArmour(this.id, armour);
423
+ }
424
+ getArmour(): number {
425
+ return playerFunc.GetPlayerArmour(this.id);
426
+ }
427
+ setCameraBehind(): number {
428
+ return playerFunc.SetCameraBehindPlayer(this.id);
429
+ }
430
+ setCameraPos(x: number, y: number, z: number): number {
431
+ return playerFunc.SetPlayerCameraPos(this.id, x, y, z);
432
+ }
433
+ setCameraLookAt(
434
+ x: number,
435
+ y: number,
436
+ z: number,
437
+ cut: CameraCutStylesEnum
438
+ ): number {
439
+ return playerFunc.SetPlayerCameraLookAt(this.id, x, y, z, cut);
440
+ }
441
+ getCameraAspectRatio(): number {
442
+ return playerFunc.GetPlayerCameraAspectRatio(this.id);
443
+ }
444
+ getCameraFrontVector(): TPos {
445
+ const [x, y, z] = playerFunc.GetPlayerCameraFrontVector(this.id);
446
+ return { x, y, z };
447
+ }
448
+ getCameraMode(): CameraModesEnum {
449
+ return playerFunc.GetPlayerCameraMode(this.id);
450
+ }
451
+ getCameraPos(): TPos {
452
+ const [x, y, z] = playerFunc.GetPlayerCameraPos(this.id);
453
+ return { x, y, z };
454
+ }
455
+ getCameraTargetPlayer<P extends Player>(players: Array<P>): P | undefined {
456
+ const target = playerFunc.GetPlayerCameraTargetPlayer(this.id);
457
+ return players.find((p) => p.id === target);
458
+ }
459
+ getCameraTargetVehicle<V extends Vehicle>(vehicles: Array<V>): V | undefined {
460
+ const target = playerFunc.GetPlayerCameraTargetVehicle(this.id);
461
+ return vehicles.find((v) => v.id === target);
462
+ }
463
+ getCameraZoom(): number {
464
+ return playerFunc.GetPlayerCameraZoom(this.id);
465
+ }
466
+ playAudioStream(
467
+ url: string,
468
+ posX = 0.0,
469
+ posY = 0.0,
470
+ posZ = 0.0,
471
+ distance = 5.0
472
+ ): number {
473
+ let usepos = false;
474
+ if (posX !== 0.0 || posY !== 0.0 || posZ !== 0.0) {
475
+ usepos = true;
476
+ }
477
+ return playerFunc.PlayAudioStreamForPlayer(
478
+ this.id,
479
+ url,
480
+ posX,
481
+ posY,
482
+ posZ,
483
+ distance,
484
+ usepos
485
+ );
486
+ }
487
+ stopAudioStream(): void {
488
+ playerFunc.StopAudioStreamForPlayer(this.id);
489
+ }
490
+ playSound(
491
+ soundid: number,
492
+ relativeX = 0.0,
493
+ relativeY = 0.0,
494
+ relativeZ = 0.0
495
+ ): number {
496
+ return playerFunc.PlayerPlaySound(
497
+ this.id,
498
+ soundid,
499
+ relativeX,
500
+ relativeY,
501
+ relativeZ
502
+ );
503
+ }
504
+ static getPoolSize(): number {
505
+ return playerFunc.GetPlayerPoolSize();
506
+ }
507
+ static getMaxPlayers(): number {
508
+ return playerFunc.GetMaxPlayers();
509
+ }
510
+ playCrimeReport<P extends Player>(suspect: P, crimeId: number): number {
511
+ if (crimeId < 3 || crimeId > 22) {
512
+ logger.warn("[Player]: Available crime ids range from 3 to 22");
513
+ return 0;
514
+ }
515
+ return playerFunc.PlayCrimeReportForPlayer(this.id, suspect.id, crimeId);
516
+ }
517
+ interpolateCameraPos(
518
+ FromX: number,
519
+ FromY: number,
520
+ FromZ: number,
521
+ ToX: number,
522
+ ToY: number,
523
+ ToZ: number,
524
+ time: number,
525
+ cut: CameraCutStylesEnum = CameraCutStylesEnum.CUT
526
+ ): void {
527
+ playerFunc.InterpolateCameraPos(
528
+ this.id,
529
+ FromX,
530
+ FromY,
531
+ FromZ,
532
+ ToX,
533
+ ToY,
534
+ ToZ,
535
+ time,
536
+ cut
537
+ );
538
+ }
539
+ interpolateCameraLookAt(
540
+ FromX: number,
541
+ FromY: number,
542
+ FromZ: number,
543
+ ToX: number,
544
+ ToY: number,
545
+ ToZ: number,
546
+ time: number,
547
+ cut: CameraCutStylesEnum = CameraCutStylesEnum.CUT
548
+ ): void {
549
+ playerFunc.InterpolateCameraLookAt(
550
+ this.id,
551
+ FromX,
552
+ FromY,
553
+ FromZ,
554
+ ToX,
555
+ ToY,
556
+ ToZ,
557
+ time,
558
+ cut
559
+ );
560
+ }
561
+ createExplosion(
562
+ X: number,
563
+ Y: number,
564
+ Z: number,
565
+ type: number,
566
+ Radius: number
567
+ ): number {
568
+ if (type < 0 || type > 13) {
569
+ logger.error("[Player]: The valid explosion type value is only 0 to 13");
570
+ return 0;
571
+ }
572
+ return playerFunc.CreateExplosionForPlayer(this.id, X, Y, Z, type, Radius);
573
+ }
574
+ static isConnected(id: number): boolean {
575
+ return playerFunc.IsPlayerConnected(id);
576
+ }
577
+ isConnected(): boolean {
578
+ return playerFunc.IsPlayerConnected(this.id);
579
+ }
580
+ disableRemoteVehicleCollisions(disable: boolean) {
581
+ return playerFunc.DisableRemoteVehicleCollisions(this.id, disable);
582
+ }
583
+ getVehicle<V extends Vehicle>(vehicles: Array<V>): V | undefined {
584
+ if (!this.isInAnyVehicle()) return undefined;
585
+ const vehId: number = playerFunc.GetPlayerVehicleID(this.id);
586
+ return vehicles.find((v) => v.id === vehId);
587
+ }
588
+ getVehicleSeat(): number {
589
+ return playerFunc.GetPlayerVehicleSeat(this.id);
590
+ }
591
+ getSurfingVehicle<V extends Vehicle>(vehicles: Array<V>): V | undefined {
592
+ const vehId = playerFunc.GetPlayerSurfingVehicleID(this.id);
593
+ if (vehId === InvalidEnum.VEHICLE_ID) return undefined;
594
+ return vehicles.find((v) => v.id === vehId);
595
+ }
596
+ applyAnimation(
597
+ animLib: string,
598
+ animName: string,
599
+ loop = false,
600
+ lockX = true,
601
+ lockY = true,
602
+ freeze = false,
603
+ forceSync = false
604
+ ): void {
605
+ const duration = getAnimateDurationByLibName(animLib, animName);
606
+ if (duration === undefined)
607
+ return logger.error("[Player]: Invalid anim library or name");
608
+ playerFunc.ApplyAnimation(
609
+ this.id,
610
+ animLib,
611
+ animName,
612
+ 4.1,
613
+ loop,
614
+ lockX,
615
+ lockY,
616
+ freeze,
617
+ loop ? 0 : duration,
618
+ forceSync
619
+ );
620
+ }
621
+ clearAnimations(forceSync = false): void {
622
+ playerFunc.ClearAnimations(this.id, forceSync);
623
+ }
624
+ getAnimationIndex(): number {
625
+ return playerFunc.GetPlayerAnimationIndex(this.id);
626
+ }
627
+ getAnimationName() {
628
+ const [animLib, animName] = playerFunc.GetAnimationName(
629
+ this.getAnimationIndex()
630
+ );
631
+ return { animLib, animName };
632
+ }
633
+ setShopName(shopName: string): void {
634
+ playerFunc.SetPlayerShopName(this.id, shopName);
635
+ }
636
+ setPosFindZ(x: number, y: number, z = 150): Promise<number> {
637
+ return new Promise<number>((resolve) => {
638
+ playerFunc.SetPlayerPos(this.id, x, y, z);
639
+ setTimeout(() => resolve(playerFunc.SetPlayerPosFindZ(this.id, x, y, z)));
640
+ });
641
+ }
642
+ setWorldBounds(
643
+ x_max: number,
644
+ x_min: number,
645
+ y_max: number,
646
+ y_min: number
647
+ ): void {
648
+ playerFunc.SetPlayerWorldBounds(this.id, x_max, x_min, y_max, y_min);
649
+ }
650
+ setChatBubble(
651
+ text: string,
652
+ colour: string | number,
653
+ drawDistance: number,
654
+ expireTime: number
655
+ ): void {
656
+ playerFunc.SetPlayerChatBubble(
657
+ this.id,
658
+ text,
659
+ colour,
660
+ drawDistance,
661
+ expireTime
662
+ );
663
+ }
664
+ getDistanceFromPoint(X: number, Y: number, Z: number): number {
665
+ return playerFunc.GetPlayerDistanceFromPoint(this.id, X, Y, Z);
666
+ }
667
+ getCustomSkin(): number {
668
+ return playerFunc.GetPlayerCustomSkin(this.id);
669
+ }
670
+ getTargetPlayer<P extends Player>(players: Array<P>): undefined | P {
671
+ const pid = playerFunc.GetPlayerTargetPlayer(this.id);
672
+ if (pid === InvalidEnum.PLAYER_ID) return undefined;
673
+ return players.find((p) => p.id === pid);
674
+ }
675
+ getLastShotVectors() {
676
+ const [fOriginX, fOriginY, fOriginZ, fHitPosX, fHitPosY, fHitPosZ] =
677
+ playerFunc.GetPlayerLastShotVectors(this.id);
678
+ return { fOriginX, fOriginY, fOriginZ, fHitPosX, fHitPosY, fHitPosZ };
679
+ }
680
+ getWeapon(): WeaponEnum | -1 {
681
+ return playerFunc.GetPlayerWeapon(this.id);
682
+ }
683
+ getWeaponData(slot: number) {
684
+ if (slot < 0 || slot > 12) {
685
+ logger.error("[Player]: weapon slots range from 0 to 12");
686
+ return;
687
+ }
688
+ const [weapons, ammo] = playerFunc.GetPlayerWeaponData(this.id, slot);
689
+ return { weapons, ammo };
690
+ }
691
+ getWeaponState(): WeaponStatesEnum {
692
+ return playerFunc.GetPlayerWeaponState(this.id);
693
+ }
694
+ giveWeapon(weaponid: WeaponEnum, ammo: number): number {
695
+ return playerFunc.GivePlayerWeapon(this.id, weaponid, ammo);
696
+ }
697
+ setAmmo(weaponid: number, ammo: number) {
698
+ return playerFunc.SetPlayerAmmo(this.id, weaponid, ammo);
699
+ }
700
+ getAmmo(): number {
701
+ return playerFunc.GetPlayerAmmo(this.id);
702
+ }
703
+ setArmedWeapon(weaponid: number): number {
704
+ return playerFunc.SetPlayerArmedWeapon(this.id, weaponid);
705
+ }
706
+ // not test
707
+ clearDeathMessage() {
708
+ for (let i = 0; i < 5; i++) {
709
+ this.sendDeathMessageToPlayer(
710
+ InvalidEnum.PLAYER_ID,
711
+ InvalidEnum.PLAYER_ID,
712
+ DamageDeathReasonEnum.CONNECT
713
+ );
714
+ }
715
+ }
716
+ sendDeathMessage<P extends Player>(
717
+ killer: P | InvalidEnum.PLAYER_ID,
718
+ weapon: WeaponEnum | DamageDeathReasonEnum
719
+ ): void {
720
+ playerFunc.SendDeathMessage(
721
+ killer === InvalidEnum.PLAYER_ID ? killer : killer.id,
722
+ this.id,
723
+ weapon
724
+ );
725
+ }
726
+ sendDeathMessageToPlayer<P extends Player>(
727
+ killer: P | InvalidEnum.PLAYER_ID,
728
+ killee: P | InvalidEnum.PLAYER_ID,
729
+ weapon: WeaponEnum | DamageDeathReasonEnum
730
+ ): void {
731
+ playerFunc.SendDeathMessageToPlayer(
732
+ this.id,
733
+ killer === InvalidEnum.PLAYER_ID ? killer : killer.id,
734
+ killee === InvalidEnum.PLAYER_ID ? killee : killee.id,
735
+ weapon
736
+ );
737
+ }
738
+ setSpawnInfo(
739
+ team: number,
740
+ skin: number,
741
+ x: number,
742
+ y: number,
743
+ z: number,
744
+ rotation: number,
745
+ weapon1: WeaponEnum,
746
+ weapon1_ammo: number,
747
+ weapon2: WeaponEnum,
748
+ weapon2_ammo: number,
749
+ weapon3: WeaponEnum,
750
+ weapon3_ammo: number
751
+ ): void {
752
+ if (team < 0 || team > InvalidEnum.NO_TEAM) return;
753
+ if (skin < 0 || skin > 311 || skin == 74) return;
754
+ if (weapon1_ammo < 0 || weapon2_ammo < 0 || weapon3_ammo < 0) return;
755
+ playerFunc.SetSpawnInfo(
756
+ this.id,
757
+ team,
758
+ skin,
759
+ x,
760
+ y,
761
+ z,
762
+ rotation,
763
+ weapon1,
764
+ weapon1_ammo,
765
+ weapon2,
766
+ weapon2_ammo,
767
+ weapon3,
768
+ weapon3_ammo
769
+ );
770
+ }
771
+ redirectDownload(url: string) {
772
+ return playerFunc.RedirectDownload(this.id, url);
773
+ }
774
+ sendClientCheck(
775
+ type: number,
776
+ memAddr: number,
777
+ memOffset: number,
778
+ byteCount: number
779
+ ): void | Promise<IClientResRaw> {
780
+ const validTypes = [2, 5, 69, 70, 71, 72];
781
+ if (!validTypes.includes(type)) {
782
+ return logger.error(
783
+ `[Player]: sendClientCheck valid types are ${validTypes.toString()}`
784
+ );
785
+ }
786
+
787
+ return new Promise((resolve, reject) => {
788
+ delCCTask(this.id, true);
789
+ if (this.isPaused)
790
+ return reject(
791
+ "[Player]: An attempt to check the player client response, but the player paused the game"
792
+ );
793
+ const p = new Promise<IClientResRaw>((clientResolve, clientReject) => {
794
+ const ping = this.getPing();
795
+ const shouldResTime = (ping >= 200 ? 0 : ping) + 200;
796
+ ccWaitingQueue.set(this.id, {
797
+ resolve: clientResolve,
798
+ reject: clientReject,
799
+ timeout: setTimeout(() => delCCTask(this.id, true), shouldResTime),
800
+ });
801
+ playerFunc.SendClientCheck(
802
+ this.id,
803
+ type,
804
+ memAddr,
805
+ memOffset,
806
+ byteCount
807
+ );
808
+ });
809
+ p.then(resolve, reject);
810
+ p.finally(() => delCCTask(this.id));
811
+ });
812
+ }
813
+ selectTextDraw(colour: string | number): void {
814
+ playerFunc.SelectTextDraw(this.id, colour);
815
+ }
816
+ cancelSelectTextDraw(): void {
817
+ playerFunc.CancelSelectTextDraw(this.id);
818
+ }
819
+ beginObjectSelecting(): void {
820
+ playerFunc.BeginObjectSelecting(this.id);
821
+ }
822
+ endObjectEditing(): void {
823
+ playerFunc.EndObjectEditing(this.id);
824
+ }
825
+ getSurfingObject<O extends DynamicObject>(objects: Map<number, O>): void | O {
826
+ const id: number = playerFunc.GetPlayerSurfingObjectID(this.id);
827
+ if (id === InvalidEnum.OBJECT_ID) return;
828
+ return objects.get(id);
829
+ }
830
+ isAttachedObjectSlotUsed(index: number): boolean {
831
+ return playerFunc.IsPlayerAttachedObjectSlotUsed(this.id, index);
832
+ }
833
+ setAttachedObject(
834
+ index: number,
835
+ modelid: number,
836
+ bone: BoneIdsEnum,
837
+ fOffsetX: number,
838
+ fOffsetY: number,
839
+ fOffsetZ: number,
840
+ fRotX: number,
841
+ fRotY: number,
842
+ fRotZ: number,
843
+ fScaleX: number,
844
+ fScaleY: number,
845
+ fScaleZ: number,
846
+ materialcolour1: string | number,
847
+ materialcolour2: string | number
848
+ ): void | number {
849
+ if (this.isAttachedObjectSlotUsed(index)) return 0;
850
+ return playerFunc.SetPlayerAttachedObject(
851
+ this.id,
852
+ index,
853
+ modelid,
854
+ bone,
855
+ fOffsetX,
856
+ fOffsetY,
857
+ fOffsetZ,
858
+ fRotX,
859
+ fRotY,
860
+ fRotZ,
861
+ fScaleX,
862
+ fScaleY,
863
+ fScaleZ,
864
+ materialcolour1,
865
+ materialcolour2
866
+ );
867
+ }
868
+ removeAttachedObject(index: number): number {
869
+ if (!this.isAttachedObjectSlotUsed(index)) return 0;
870
+ return playerFunc.RemovePlayerAttachedObject(this.id, index);
871
+ }
872
+ toggleWidescreen(set: boolean): number {
873
+ return TogglePlayerWidescreen(this.id, set);
874
+ }
875
+ isPlayerWidescreenToggled(): boolean {
876
+ return IsPlayerWidescreenToggled(this.id);
877
+ }
878
+ getSpawnInfo() {
879
+ return GetSpawnInfo(this.id);
880
+ }
881
+ getSkillLevel(skill: WeaponSkillsEnum): number {
882
+ return GetPlayerSkillLevel(this.id, skill);
883
+ }
884
+ isCheckpointActive(): boolean {
885
+ return IsPlayerCheckpointActive(this.id);
886
+ }
887
+ getCheckpoint() {
888
+ return GetPlayerCheckpoint(this.id);
889
+ }
890
+ isRaceCheckpointActive(): boolean {
891
+ return IsPlayerRaceCheckpointActive(this.id);
892
+ }
893
+ getRaceCheckpoint() {
894
+ return GetPlayerRaceCheckpoint(this.id);
895
+ }
896
+ getWorldBounds() {
897
+ GetPlayerWorldBounds(this.id);
898
+ }
899
+ isInModShop(): boolean {
900
+ return IsPlayerInModShop(this.id);
901
+ }
902
+ getSirenState(): number {
903
+ return GetPlayerSirenState(this.id);
904
+ }
905
+ getLandingGearState(): number {
906
+ return GetPlayerLandingGearState(this.id);
907
+ }
908
+ getHydraReactorAngle(): number {
909
+ return GetPlayerHydraReactorAngle(this.id);
910
+ }
911
+ getTrainSpeed(): number {
912
+ return GetPlayerTrainSpeed(this.id);
913
+ }
914
+ getZAim(): number {
915
+ return GetPlayerZAim(this.id);
916
+ }
917
+ getSurfingOffsets() {
918
+ return GetPlayerSurfingOffsets(this.id);
919
+ }
920
+ getRotationQuat() {
921
+ return GetPlayerRotationQuat(this.id);
922
+ }
923
+ getDialogID(): number {
924
+ return GetPlayerDialogID(this.id);
925
+ }
926
+ getSpectateID(): number {
927
+ return GetPlayerSpectateID(this.id);
928
+ }
929
+ getSpectateType(): SpectateModesEnum {
930
+ return GetPlayerSpectateType(this.id);
931
+ }
932
+ getRawIp(): string {
933
+ return GetPlayerRawIp(this.id);
934
+ }
935
+ setGravity(gravity: number): number {
936
+ return SetPlayerGravity(this.id, gravity);
937
+ }
938
+ getGravity(): number {
939
+ return GetPlayerGravity(this.id);
940
+ }
941
+ setAdmin(admin: boolean) {
942
+ return SetPlayerAdmin(this.id, admin);
943
+ }
944
+ isSpawned(): boolean {
945
+ return IsPlayerSpawned(this.id);
946
+ }
947
+ isControllable(): boolean {
948
+ return IsPlayerControllable(this.id);
949
+ }
950
+ isCameraTargetEnabled(): boolean {
951
+ return IsPlayerCameraTargetEnabled(this.id);
952
+ }
953
+ toggleGhostMode(toggle: boolean) {
954
+ return TogglePlayerGhostMode(this.id, toggle);
955
+ }
956
+ getGhostMode(): boolean {
957
+ return GetPlayerGhostMode(this.id);
958
+ }
959
+ getBuildingsRemoved(): number {
960
+ return GetPlayerBuildingsRemoved(this.id);
961
+ }
962
+ getAttachedObject(index: number) {
963
+ return GetPlayerAttachedObject(this.id, index);
964
+ }
965
+ removeWeapon(weaponid: number): number {
966
+ return RemovePlayerWeapon(this.id, weaponid);
967
+ }
968
+ isUsingOfficialClient() {
969
+ return IsPlayerUsingOfficialClient(this.id);
970
+ }
971
+ allowWeapons(allow: boolean) {
972
+ return AllowPlayerWeapons(this.id, allow);
973
+ }
974
+ areWeaponsAllowed() {
975
+ return ArePlayerWeaponsAllowed(this.id);
976
+ }
977
+ gpci(charset?: string) {
978
+ return playerFunc.GPCI(this.id, charset);
979
+ }
980
+ }