@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,415 @@
1
+ import { InvalidEnum } from "@/enums";
2
+ import type { IDynamicObject } from "@/interfaces";
3
+ import type { Vehicle } from "@/controllers/vehicle";
4
+ import type { Player } from "@/controllers/player";
5
+ import { logger } from "@/logger";
6
+ import { objectBus, objectHooks } from "./objectBus";
7
+ import { rgba } from "@/utils/colorUtils";
8
+ import {
9
+ GetDynamicObjectMaterialText,
10
+ SetDynamicObjectMaterialText,
11
+ } from "@/utils/helperUtils";
12
+ import {
13
+ AttachCameraToDynamicObject,
14
+ AttachDynamicObjectToObject,
15
+ AttachDynamicObjectToPlayer,
16
+ AttachDynamicObjectToVehicle,
17
+ CreateDynamicObject,
18
+ CreateDynamicObjectEx,
19
+ DestroyDynamicObject,
20
+ EditDynamicObject,
21
+ GetDynamicObjectMaterial,
22
+ GetDynamicObjectPos,
23
+ GetDynamicObjectRot,
24
+ GetPlayerCameraTargetDynObject,
25
+ IsDynamicObjectMaterialTextUsed,
26
+ IsDynamicObjectMaterialUsed,
27
+ IsDynamicObjectMoving,
28
+ IsValidDynamicObject,
29
+ MaterialTextSizes,
30
+ MoveDynamicObject,
31
+ RemoveDynamicObjectMaterial,
32
+ RemoveDynamicObjectMaterialText,
33
+ SetDynamicObjectMaterial,
34
+ SetDynamicObjectPos,
35
+ SetDynamicObjectRot,
36
+ StopDynamicObject,
37
+ StreamerDistances,
38
+ StreamerItemTypes,
39
+ } from "@infernus/streamer";
40
+ import { Streamer } from "../common";
41
+ import { defaultCharset } from "@/controllers/gamemode/settings";
42
+
43
+ export class DynamicObject {
44
+ private sourceInfo: IDynamicObject;
45
+ private _id = -1;
46
+ get id(): number {
47
+ return this._id;
48
+ }
49
+
50
+ constructor(object: IDynamicObject) {
51
+ this.sourceInfo = object;
52
+ }
53
+
54
+ create(): void | this {
55
+ if (this.id !== -1)
56
+ return logger.warn("[StreamerObject]: Unable to create object again");
57
+ let {
58
+ streamdistance,
59
+ drawdistance,
60
+ worldid,
61
+ interiorid,
62
+ playerid,
63
+ areaid,
64
+ priority,
65
+ } = this.sourceInfo;
66
+ const { modelid, x, y, z, rx, ry, rz, extended } = this.sourceInfo;
67
+
68
+ streamdistance ??= StreamerDistances.OBJECT_SD;
69
+ drawdistance ??= StreamerDistances.OBJECT_DD;
70
+ priority ??= 0;
71
+
72
+ if (extended) {
73
+ if (typeof worldid === "number") worldid = [-1];
74
+ else worldid ??= [-1];
75
+ if (typeof interiorid === "number") interiorid = [-1];
76
+ else interiorid ??= [-1];
77
+ if (typeof playerid === "number") playerid = [-1];
78
+ else playerid ??= [-1];
79
+ if (typeof areaid === "number") areaid = [-1];
80
+ else areaid ??= [-1];
81
+
82
+ this._id = CreateDynamicObjectEx(
83
+ modelid,
84
+ x,
85
+ y,
86
+ z,
87
+ rx,
88
+ ry,
89
+ rz,
90
+ streamdistance,
91
+ drawdistance,
92
+ worldid,
93
+ interiorid,
94
+ playerid,
95
+ areaid,
96
+ priority
97
+ );
98
+ } else {
99
+ if (Array.isArray(worldid)) worldid = -1;
100
+ else worldid ??= -1;
101
+ if (Array.isArray(interiorid)) interiorid = -1;
102
+ else interiorid ??= -1;
103
+ if (Array.isArray(playerid)) playerid = -1;
104
+ else playerid ??= -1;
105
+ if (Array.isArray(areaid)) areaid = -1;
106
+ else areaid ??= -1;
107
+
108
+ this._id = CreateDynamicObject(
109
+ modelid,
110
+ x,
111
+ y,
112
+ z,
113
+ rx,
114
+ ry,
115
+ rz,
116
+ worldid,
117
+ interiorid,
118
+ playerid,
119
+ streamdistance,
120
+ drawdistance,
121
+ areaid,
122
+ priority
123
+ );
124
+ }
125
+
126
+ objectBus.emit(objectHooks.created, this);
127
+ return this;
128
+ }
129
+
130
+ destroy(): void | this {
131
+ if (this.id === -1)
132
+ return logger.warn(
133
+ "[StreamerObject]: Unable to destroy the object before create"
134
+ );
135
+ DestroyDynamicObject(this.id);
136
+ objectBus.emit(objectHooks.destroyed, this);
137
+ return this;
138
+ }
139
+
140
+ isValid(): boolean {
141
+ return IsValidDynamicObject(this.id);
142
+ }
143
+
144
+ getPos() {
145
+ if (this.id === -1)
146
+ return logger.warn("[StreamerObject]: Cannot get position before create");
147
+ return GetDynamicObjectPos(this.id);
148
+ }
149
+
150
+ setPos(x: number, y: number, z: number): void | number {
151
+ if (this.id === -1)
152
+ return logger.warn("[StreamerObject]: Cannot set position before create");
153
+ return SetDynamicObjectPos(this.id, x, y, z);
154
+ }
155
+
156
+ getRot() {
157
+ if (this.id === -1)
158
+ return logger.warn("[StreamerObject]: Cannot get rotation before create");
159
+ return GetDynamicObjectRot(this.id);
160
+ }
161
+
162
+ setRot(rx: number, ry: number, rz: number): void | number {
163
+ if (this.id === -1)
164
+ return logger.warn("[StreamerObject]: Cannot set rotation before create");
165
+ return SetDynamicObjectRot(this.id, rx, ry, rz);
166
+ }
167
+
168
+ move(
169
+ x: number,
170
+ y: number,
171
+ z: number,
172
+ speed: number,
173
+ rx = -1000,
174
+ ry = -1000,
175
+ rz = -1000
176
+ ): void | number {
177
+ if (this.id === -1)
178
+ return logger.warn("[StreamerObject]: Cannot start moving before create");
179
+ if (speed < 0) {
180
+ return logger.warn("[StreamerObject]: speed must not be less than 0");
181
+ }
182
+ if (speed > 120 * 1000)
183
+ logger.warn(
184
+ "[StreamerObject]: speed more than 120 seconds, warn if it's not intentional"
185
+ );
186
+ if (this.isMoving()) this.stop();
187
+ return MoveDynamicObject(this.id, x, y, z, speed, rx, ry, rz);
188
+ }
189
+
190
+ stop(): void | number {
191
+ if (this.id === -1)
192
+ return logger.warn("[StreamerObject]: Cannot stop moving before create");
193
+ return StopDynamicObject(this.id);
194
+ }
195
+
196
+ isMoving(): boolean {
197
+ if (this.id === -1) return false;
198
+ return IsDynamicObjectMoving(this.id);
199
+ }
200
+
201
+ attachCamera<P extends Player>(player: P): void | number {
202
+ if (this.id === -1 || player.id === -1)
203
+ return logger.warn(
204
+ "[StreamerObject]: Cannot attachCamera before both are created"
205
+ );
206
+ return AttachCameraToDynamicObject(player.id, this.id);
207
+ }
208
+
209
+ attachToObject<O extends DynamicObject>(
210
+ attachto: O,
211
+ offsetx: number,
212
+ offsety: number,
213
+ offsetz: number,
214
+ rx: number,
215
+ ry: number,
216
+ rz: number,
217
+ syncrotation = true
218
+ ): void | number {
219
+ if (this.id === -1 || attachto.id === -1)
220
+ return logger.warn(
221
+ "[StreamerObject]: Cannot attachToObject before both are created"
222
+ );
223
+ return AttachDynamicObjectToObject(
224
+ this.id,
225
+ attachto.id,
226
+ offsetx,
227
+ offsety,
228
+ offsetz,
229
+ rx,
230
+ ry,
231
+ rz,
232
+ syncrotation
233
+ );
234
+ }
235
+
236
+ attachToPlayer<P extends Player>(
237
+ player: P,
238
+ offsetx: number,
239
+ offsety: number,
240
+ offsetz: number,
241
+ rx: number,
242
+ ry: number,
243
+ rz: number
244
+ ): void | number {
245
+ if (this.id === -1 || player.id === -1)
246
+ return logger.warn(
247
+ "[StreamerObject]: Cannot attachToVehicle before both are created"
248
+ );
249
+ return AttachDynamicObjectToPlayer(
250
+ this.id,
251
+ player.id,
252
+ offsetx,
253
+ offsety,
254
+ offsetz,
255
+ rx,
256
+ ry,
257
+ rz
258
+ );
259
+ }
260
+
261
+ attachToVehicle<V extends Vehicle>(
262
+ vehicle: V,
263
+ offsetx: number,
264
+ offsety: number,
265
+ offsetz: number,
266
+ rx: number,
267
+ ry: number,
268
+ rz: number
269
+ ): void | number {
270
+ if (this.id === -1 || vehicle.id === -1)
271
+ return logger.warn(
272
+ "[StreamerObject]: Cannot attachToVehicle before both are created"
273
+ );
274
+ return AttachDynamicObjectToVehicle(
275
+ this.id,
276
+ vehicle.id,
277
+ offsetx,
278
+ offsety,
279
+ offsetz,
280
+ rx,
281
+ ry,
282
+ rz
283
+ );
284
+ }
285
+
286
+ edit<P extends Player>(player: P): void | number {
287
+ if (this.id === -1)
288
+ return logger.warn("[StreamerObject]: Unable to edit before create");
289
+ player.endObjectEditing();
290
+ return EditDynamicObject(player.id, this.id);
291
+ }
292
+
293
+ isMaterialUsed(materialIndex: number): boolean {
294
+ if (this.id === -1) return false;
295
+ return IsDynamicObjectMaterialUsed(this.id, materialIndex);
296
+ }
297
+
298
+ removeMaterial(materialIndex: number): number {
299
+ if (this.id === -1) return 0;
300
+ if (!this.isMaterialUsed(materialIndex)) return 0;
301
+ return RemoveDynamicObjectMaterial(this.id, materialIndex);
302
+ }
303
+
304
+ getMaterial(materialIndex: number, txdname: string, texturename: string) {
305
+ if (this.id === -1)
306
+ return logger.warn(
307
+ "[StreamerObject]: Unable to get material before create"
308
+ );
309
+ return GetDynamicObjectMaterial(
310
+ this.id,
311
+ materialIndex,
312
+ txdname,
313
+ texturename
314
+ );
315
+ }
316
+
317
+ setMaterial(
318
+ materialindex: number,
319
+ modelid: number,
320
+ txdname: string,
321
+ texturename: string,
322
+ materialcolour = "#000"
323
+ ): void | number {
324
+ if (this.id === -1)
325
+ return logger.warn(
326
+ "[StreamerObject]: Unable to set material before create"
327
+ );
328
+ return SetDynamicObjectMaterial(
329
+ this.id,
330
+ materialindex,
331
+ modelid,
332
+ txdname,
333
+ texturename,
334
+ rgba(materialcolour)
335
+ );
336
+ }
337
+
338
+ isMaterialTextUsed(materialIndex: number): boolean {
339
+ if (this.id === -1) return false;
340
+ return IsDynamicObjectMaterialTextUsed(this.id, materialIndex);
341
+ }
342
+
343
+ removeMaterialText(materialIndex: number) {
344
+ if (!this.isMaterialTextUsed(materialIndex)) return 0;
345
+ return RemoveDynamicObjectMaterialText(this.id, materialIndex);
346
+ }
347
+
348
+ getMaterialText(materialIndex: number) {
349
+ if (this.id === -1)
350
+ return logger.warn(
351
+ "[StreamerObject]: Unable to get material text before create"
352
+ );
353
+ return GetDynamicObjectMaterialText(
354
+ this.id,
355
+ materialIndex,
356
+ this.sourceInfo.charset || defaultCharset
357
+ );
358
+ }
359
+
360
+ setMaterialText(
361
+ charset = this.sourceInfo.charset,
362
+ materialIndex: number,
363
+ text: string,
364
+ materialSize: number = MaterialTextSizes.SIZE_256x128,
365
+ fontFace = "Arial",
366
+ fontSize = 24,
367
+ bold = 1,
368
+ fontColour = "#fff",
369
+ backColour = "#000",
370
+ textAlignment = 0
371
+ ): void | number {
372
+ if (this.id === -1)
373
+ return logger.warn(
374
+ "[StreamerObject]: Unable to set material text before create"
375
+ );
376
+ this.sourceInfo.charset = charset;
377
+ return SetDynamicObjectMaterialText(
378
+ charset || defaultCharset,
379
+ this.id,
380
+ materialIndex,
381
+ text,
382
+ materialSize,
383
+ fontFace,
384
+ fontSize,
385
+ bold,
386
+ rgba(fontColour),
387
+ rgba(backColour),
388
+ textAlignment
389
+ );
390
+ }
391
+
392
+ getPlayerCameraTarget<P extends Player, O extends DynamicObject>(
393
+ player: P,
394
+ objMap: Map<number, O>
395
+ ): void | O {
396
+ const dynId = GetPlayerCameraTargetDynObject(player.id);
397
+ if (dynId === InvalidEnum.OBJECT_ID) return;
398
+ return objMap.get(dynId);
399
+ }
400
+ toggleCallbacks(toggle = true): void | number {
401
+ if (this.id === -1)
402
+ return logger.warn(
403
+ "[StreamerObject]: Unable to toggle callbacks before create"
404
+ );
405
+ return Streamer.toggleItemCallbacks(
406
+ StreamerItemTypes.OBJECT,
407
+ this.id,
408
+ toggle
409
+ );
410
+ }
411
+ isToggleCallbacks(): boolean {
412
+ if (this.id === -1) false;
413
+ return Streamer.isToggleItemCallbacks(StreamerItemTypes.OBJECT, this.id);
414
+ }
415
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./baseObject";
2
+ export * from "./objectEvent";
@@ -0,0 +1,8 @@
1
+ import { EventBus } from "@/utils/eventBus";
2
+
3
+ export enum objectHooks {
4
+ created = "OnObjectCreate",
5
+ destroyed = "OnObjectDestroy",
6
+ }
7
+
8
+ export const objectBus = new EventBus();
@@ -0,0 +1,177 @@
1
+ import type { Player } from "@/controllers/player";
2
+ import type { EditResponseTypesEnum } from "@/enums";
3
+ import type { TCommonCallback } from "@/types";
4
+ import { promisifyCallback } from "@/utils/helperUtils";
5
+ import { OnGameModeExit } from "@/wrapper/native/callbacks";
6
+ import {
7
+ OnDynamicObjectMoved,
8
+ OnPlayerEditDynamicObject,
9
+ OnPlayerSelectDynamicObject,
10
+ OnPlayerShootDynamicObject,
11
+ StreamerItemTypes,
12
+ } from "@infernus/streamer";
13
+ import { Streamer } from "../common";
14
+ import type { DynamicObject } from "./baseObject";
15
+ import { objectBus, objectHooks } from "./objectBus";
16
+
17
+ export class DynamicObjectEvent<P extends Player, O extends DynamicObject> {
18
+ private readonly objects = new Map<number, O>();
19
+ private readonly players;
20
+
21
+ constructor(playersMap: Map<number, P>, destroyOnExit = true) {
22
+ this.players = playersMap;
23
+ objectBus.on(objectHooks.created, (object: O) => {
24
+ this.objects.set(object.id, object);
25
+ });
26
+ objectBus.on(objectHooks.destroyed, (object: O) => {
27
+ this.objects.delete(object.id);
28
+ });
29
+ if (destroyOnExit) {
30
+ OnGameModeExit(() => {
31
+ this.objects.forEach((o) => o.destroy());
32
+ this.objects.clear();
33
+ });
34
+ }
35
+ OnDynamicObjectMoved((id): number => {
36
+ const o = this.objects.get(id);
37
+ if (!o) return 0;
38
+ const pFn = promisifyCallback(this, "onMoved", "OnDynamicObjectMoved");
39
+ return pFn(o);
40
+ });
41
+ OnPlayerEditDynamicObject(
42
+ (
43
+ playerid: number,
44
+ objectid: number,
45
+ response: number,
46
+ x: number,
47
+ y: number,
48
+ z: number,
49
+ rx: number,
50
+ ry: number,
51
+ rz: number
52
+ ): number => {
53
+ const o = this.objects.get(objectid);
54
+ if (!o) return 0;
55
+ const p = this.players.get(playerid);
56
+ if (!p) return 0;
57
+ const pFn = promisifyCallback(
58
+ this,
59
+ "onPlayerEdit",
60
+ "OnPlayerEditDynamicObject"
61
+ );
62
+ return pFn(p, o, response, x, y, z, rx, ry, rz);
63
+ }
64
+ );
65
+ OnPlayerSelectDynamicObject(
66
+ (
67
+ playerid: number,
68
+ objectid: number,
69
+ modelid: number,
70
+ x: number,
71
+ y: number,
72
+ z: number
73
+ ) => {
74
+ const p = this.players.get(playerid);
75
+ if (!p) return 0;
76
+ const o = this.objects.get(objectid);
77
+ if (!o) return 0;
78
+ const pFn = promisifyCallback(
79
+ this,
80
+ "onPlayerSelect",
81
+ "OnPlayerSelectDynamicObject"
82
+ );
83
+ return pFn(p, o, modelid, x, y, z);
84
+ }
85
+ );
86
+ OnPlayerShootDynamicObject(
87
+ (
88
+ playerid: number,
89
+ weaponid: number,
90
+ objectid: number,
91
+ x: number,
92
+ y: number,
93
+ z: number
94
+ ) => {
95
+ const p = this.players.get(playerid);
96
+ if (!p) return 0;
97
+ const o = this.objects.get(objectid);
98
+ if (!o) return 0;
99
+ const pFn = promisifyCallback(
100
+ this,
101
+ "onPlayerShoot",
102
+ "OnPlayerShootDynamicObject"
103
+ );
104
+ return pFn(p, weaponid, o, x, y, z);
105
+ }
106
+ );
107
+ Streamer.onItemStreamIn((type, item, player) => {
108
+ if (type === StreamerItemTypes.OBJECT) {
109
+ const obj = this.objects.get(item);
110
+ const p = this.players.get(player);
111
+ if (obj && p)
112
+ return promisifyCallback(
113
+ this,
114
+ "onStreamIn",
115
+ "Streamer_OnItemStreamIn"
116
+ )(obj, p);
117
+ }
118
+ return 1;
119
+ });
120
+ Streamer.onItemStreamOut((type, item, player) => {
121
+ if (type === StreamerItemTypes.OBJECT) {
122
+ const obj = this.objects.get(item);
123
+ const p = this.players.get(player);
124
+ if (obj && p)
125
+ return promisifyCallback(
126
+ this,
127
+ "onStreamOut",
128
+ "Streamer_OnItemStreamOut"
129
+ )(obj, p);
130
+ }
131
+ return 1;
132
+ });
133
+ }
134
+
135
+ onMoved?(object: O): TCommonCallback;
136
+
137
+ onPlayerEdit?(
138
+ player: P,
139
+ object: O,
140
+ response: EditResponseTypesEnum,
141
+ x: number,
142
+ y: number,
143
+ z: number,
144
+ rx: number,
145
+ ry: number,
146
+ rz: number
147
+ ): TCommonCallback;
148
+
149
+ onPlayerSelect?(
150
+ player: P,
151
+ object: O,
152
+ modelid: number,
153
+ x: number,
154
+ y: number,
155
+ z: number
156
+ ): TCommonCallback;
157
+
158
+ onPlayerShoot?(
159
+ player: P,
160
+ weaponid: number,
161
+ object: O,
162
+ x: number,
163
+ y: number,
164
+ z: number
165
+ ): TCommonCallback;
166
+
167
+ onStreamIn?(object: O, player: P): TCommonCallback;
168
+ onStreamOut?(object: O, player: P): TCommonCallback;
169
+
170
+ getObjectsArr(): Array<O> {
171
+ return [...this.objects.values()];
172
+ }
173
+
174
+ getObjectsMap(): Map<number, O> {
175
+ return this.objects;
176
+ }
177
+ }
@@ -0,0 +1,114 @@
1
+ import type { IDynamicPickup } from "@/interfaces";
2
+ import { logger } from "@/logger";
3
+ import {
4
+ CreateDynamicPickup,
5
+ CreateDynamicPickupEx,
6
+ DestroyDynamicPickup,
7
+ IsValidDynamicPickup,
8
+ StreamerDistances,
9
+ StreamerItemTypes,
10
+ } from "@infernus/streamer";
11
+ import { Streamer } from "../common";
12
+ import { pickupBus, pickupHooks } from "./pickupBus";
13
+
14
+ export class DynamicPickup {
15
+ private sourceInfo: IDynamicPickup;
16
+ private _id = -1;
17
+ get id(): number {
18
+ return this._id;
19
+ }
20
+ constructor(pickup: IDynamicPickup) {
21
+ this.sourceInfo = pickup;
22
+ }
23
+ create(): void | this {
24
+ if (this.id !== -1)
25
+ return logger.warn("[StreamerPickup]: Unable to create pickup again");
26
+ let { streamdistance, worldid, interiorid, playerid, areaid, priority } =
27
+ this.sourceInfo;
28
+ const { type, modelid, x, y, z, extended } = this.sourceInfo;
29
+
30
+ if (type < 0 || type > 22)
31
+ return logger.error("[StreamerPickup]: Invalid pickup type");
32
+
33
+ streamdistance ??= StreamerDistances.PICKUP_SD;
34
+ priority ??= 0;
35
+
36
+ if (extended) {
37
+ if (typeof worldid === "number") worldid = [-1];
38
+ else worldid ??= [-1];
39
+ if (typeof interiorid === "number") interiorid = [-1];
40
+ else interiorid ??= [-1];
41
+ if (typeof playerid === "number") playerid = [-1];
42
+ else playerid ??= [-1];
43
+ if (typeof areaid === "number") areaid = [-1];
44
+ else areaid ??= [-1];
45
+
46
+ this._id = CreateDynamicPickupEx(
47
+ modelid,
48
+ type,
49
+ x,
50
+ y,
51
+ z,
52
+ streamdistance,
53
+ worldid,
54
+ interiorid,
55
+ playerid,
56
+ areaid,
57
+ priority
58
+ );
59
+ } else {
60
+ if (Array.isArray(worldid)) worldid = -1;
61
+ else worldid ??= -1;
62
+ if (Array.isArray(interiorid)) interiorid = -1;
63
+ else interiorid ??= -1;
64
+ if (Array.isArray(playerid)) playerid = -1;
65
+ else playerid ??= -1;
66
+ if (Array.isArray(areaid)) areaid = -1;
67
+ else areaid ??= -1;
68
+
69
+ this._id = CreateDynamicPickup(
70
+ modelid,
71
+ type,
72
+ x,
73
+ y,
74
+ z,
75
+ worldid,
76
+ interiorid,
77
+ playerid,
78
+ streamdistance,
79
+ areaid,
80
+ priority
81
+ );
82
+ }
83
+
84
+ pickupBus.emit(pickupHooks.created, this);
85
+ return this;
86
+ }
87
+ destroy(): void | this {
88
+ if (this.id === -1)
89
+ return logger.warn(
90
+ "[StreamerPickup]: Unable to destroy the pickup before create"
91
+ );
92
+ DestroyDynamicPickup(this.id);
93
+ pickupBus.emit(pickupHooks.destroyed, this);
94
+ return this;
95
+ }
96
+ isValid(): boolean {
97
+ return IsValidDynamicPickup(this.id);
98
+ }
99
+ toggleCallbacks(toggle = true): void | number {
100
+ if (this.id === -1)
101
+ return logger.warn(
102
+ "[StreamerPickup]: Unable to toggle callbacks before create"
103
+ );
104
+ return Streamer.toggleItemCallbacks(
105
+ StreamerItemTypes.PICKUP,
106
+ this.id,
107
+ toggle
108
+ );
109
+ }
110
+ isToggleCallbacks(): boolean {
111
+ if (this.id === -1) false;
112
+ return Streamer.isToggleItemCallbacks(StreamerItemTypes.PICKUP, this.id);
113
+ }
114
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./basePickup";
2
+ export * from "./pickupEvent";