@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.
- package/.eslintrc +3 -0
- package/LICENSE +21 -0
- package/README.md +5 -0
- package/dist/bundle.d.ts +1668 -0
- package/dist/bundle.js +1 -0
- package/package.json +37 -0
- package/rollup.config.mjs +29 -0
- package/src/controllers/command/index.ts +57 -0
- package/src/controllers/filterscript/index.ts +69 -0
- package/src/controllers/gamemode/index.ts +277 -0
- package/src/controllers/gamemode/settings.ts +3 -0
- package/src/controllers/gametext/index.ts +61 -0
- package/src/controllers/gangzone/baseGangZone.ts +284 -0
- package/src/controllers/gangzone/gangZoneBus.ts +8 -0
- package/src/controllers/gangzone/gangZoneEvent.ts +91 -0
- package/src/controllers/gangzone/index.ts +2 -0
- package/src/controllers/i18n/index.ts +81 -0
- package/src/controllers/index.ts +12 -0
- package/src/controllers/menu/baseMenu.ts +203 -0
- package/src/controllers/menu/index.ts +2 -0
- package/src/controllers/menu/menuBus.ts +8 -0
- package/src/controllers/menu/menuEvent.ts +76 -0
- package/src/controllers/netstats/index.ts +43 -0
- package/src/controllers/npc/index.ts +2 -0
- package/src/controllers/npc/npcEvent.ts +26 -0
- package/src/controllers/npc/npcFunc.ts +64 -0
- package/src/controllers/player/basePlayer.ts +980 -0
- package/src/controllers/player/index.ts +3 -0
- package/src/controllers/player/pauseChecker.ts +39 -0
- package/src/controllers/player/playerBus.ts +9 -0
- package/src/controllers/player/playerEvent.ts +468 -0
- package/src/controllers/promise/client/index.ts +31 -0
- package/src/controllers/promise/dialog/index.ts +143 -0
- package/src/controllers/textdraw/baseTextDraw.ts +416 -0
- package/src/controllers/textdraw/index.ts +2 -0
- package/src/controllers/textdraw/textdrawBus.ts +8 -0
- package/src/controllers/textdraw/textdrawEvent.ts +61 -0
- package/src/controllers/vehicle/baseVehicle.ts +503 -0
- package/src/controllers/vehicle/index.ts +2 -0
- package/src/controllers/vehicle/vehicleBus.ts +8 -0
- package/src/controllers/vehicle/vehicleEvent.ts +201 -0
- package/src/enums/artwork.ts +5 -0
- package/src/enums/clickSources.ts +3 -0
- package/src/enums/dialogStyles.ts +8 -0
- package/src/enums/editResponseTypes.ts +5 -0
- package/src/enums/index.ts +18 -0
- package/src/enums/invalid.ts +13 -0
- package/src/enums/keys.ts +25 -0
- package/src/enums/limits.ts +18 -0
- package/src/enums/marker.ts +5 -0
- package/src/enums/netstat.ts +11 -0
- package/src/enums/npc.ts +11 -0
- package/src/enums/object.ts +25 -0
- package/src/enums/player.ts +92 -0
- package/src/enums/record.ts +5 -0
- package/src/enums/specialActions.ts +22 -0
- package/src/enums/streamer.ts +10 -0
- package/src/enums/textdrawFonts.ts +23 -0
- package/src/enums/vehicle.ts +32 -0
- package/src/enums/weapon.ts +82 -0
- package/src/interfaces/index.ts +233 -0
- package/src/logger/index.ts +24 -0
- package/src/main.ts +6 -0
- package/src/types/index.ts +48 -0
- package/src/utils/EventBus.ts +60 -0
- package/src/utils/animateUtils.ts +2504 -0
- package/src/utils/colorUtils.ts +43 -0
- package/src/utils/helperUtils.ts +403 -0
- package/src/utils/vehicleUtils.ts +321 -0
- package/src/wrapper/native/callbacks/index.ts +395 -0
- package/src/wrapper/native/functions/index.ts +3131 -0
- package/src/wrapper/streamer/3dtext/3dTextBus.ts +8 -0
- package/src/wrapper/streamer/3dtext/3dTextEvent.ts +70 -0
- package/src/wrapper/streamer/3dtext/base3DText.ts +184 -0
- package/src/wrapper/streamer/3dtext/index.ts +2 -0
- package/src/wrapper/streamer/actor/actorBus.ts +8 -0
- package/src/wrapper/streamer/actor/actorEvent.ts +95 -0
- package/src/wrapper/streamer/actor/baseActor.ts +278 -0
- package/src/wrapper/streamer/actor/index.ts +2 -0
- package/src/wrapper/streamer/area/areaBus.ts +8 -0
- package/src/wrapper/streamer/area/areaEvent.ts +99 -0
- package/src/wrapper/streamer/area/baseArea.ts +450 -0
- package/src/wrapper/streamer/area/index.ts +2 -0
- package/src/wrapper/streamer/checkpoint/baseCheckpoint.ts +136 -0
- package/src/wrapper/streamer/checkpoint/checkPointBus.ts +8 -0
- package/src/wrapper/streamer/checkpoint/checkPointEvent.ts +100 -0
- package/src/wrapper/streamer/checkpoint/index.ts +2 -0
- package/src/wrapper/streamer/common/index.ts +318 -0
- package/src/wrapper/streamer/index.ts +9 -0
- package/src/wrapper/streamer/mapIcon/baseMapIcon.ts +128 -0
- package/src/wrapper/streamer/mapIcon/index.ts +2 -0
- package/src/wrapper/streamer/mapIcon/mapIconBus.ts +8 -0
- package/src/wrapper/streamer/mapIcon/mapIconEvent.ts +67 -0
- package/src/wrapper/streamer/object/baseObject.ts +415 -0
- package/src/wrapper/streamer/object/index.ts +2 -0
- package/src/wrapper/streamer/object/objectBus.ts +8 -0
- package/src/wrapper/streamer/object/objectEvent.ts +177 -0
- package/src/wrapper/streamer/pickup/basePickup.ts +114 -0
- package/src/wrapper/streamer/pickup/index.ts +2 -0
- package/src/wrapper/streamer/pickup/pickupBus.ts +8 -0
- package/src/wrapper/streamer/pickup/pickupEvent.ts +84 -0
- package/src/wrapper/streamer/raceCP/baseRaceCP.ts +151 -0
- package/src/wrapper/streamer/raceCP/index.ts +2 -0
- package/src/wrapper/streamer/raceCP/raceCPBus.ts +8 -0
- package/src/wrapper/streamer/raceCP/raceCPEvent.ts +100 -0
- 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,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
|
+
}
|