@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,70 @@
|
|
|
1
|
+
import type { Player } from "@/controllers/player";
|
|
2
|
+
import type { TCommonCallback } from "@/types";
|
|
3
|
+
import { StreamerItemTypes } from "@infernus/streamer";
|
|
4
|
+
import { Streamer } from "../common";
|
|
5
|
+
import type { Dynamic3DTextLabel } from "./base3DText";
|
|
6
|
+
|
|
7
|
+
import { _3dTextBus, _3dTextHooks } from "./3dTextBus";
|
|
8
|
+
import { OnGameModeExit } from "@/wrapper/native/callbacks";
|
|
9
|
+
import { promisifyCallback } from "@/utils/helperUtils";
|
|
10
|
+
|
|
11
|
+
export class Dynamic3dTextLabelEvent<
|
|
12
|
+
P extends Player,
|
|
13
|
+
D extends Dynamic3DTextLabel
|
|
14
|
+
> {
|
|
15
|
+
private readonly _3dTexts = new Map<number, D>();
|
|
16
|
+
private readonly players;
|
|
17
|
+
|
|
18
|
+
constructor(playersMap: Map<number, P>, destroyOnExit = true) {
|
|
19
|
+
this.players = playersMap;
|
|
20
|
+
_3dTextBus.on(_3dTextHooks.created, (_3dText: D) => {
|
|
21
|
+
this._3dTexts.set(_3dText.id, _3dText);
|
|
22
|
+
});
|
|
23
|
+
_3dTextBus.on(_3dTextHooks.destroyed, (_3dText: D) => {
|
|
24
|
+
this._3dTexts.delete(_3dText.id);
|
|
25
|
+
});
|
|
26
|
+
if (destroyOnExit) {
|
|
27
|
+
OnGameModeExit(() => {
|
|
28
|
+
this._3dTexts.forEach((t) => t.destroy());
|
|
29
|
+
this._3dTexts.clear();
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
Streamer.onItemStreamIn((type, item, player) => {
|
|
33
|
+
if (type === StreamerItemTypes.TEXT_3D_LABEL) {
|
|
34
|
+
const tl = this._3dTexts.get(item);
|
|
35
|
+
const p = this.players.get(player);
|
|
36
|
+
if (tl && p)
|
|
37
|
+
return promisifyCallback(
|
|
38
|
+
this,
|
|
39
|
+
"onStreamIn",
|
|
40
|
+
"Streamer_OnItemStreamIn"
|
|
41
|
+
)(tl, p);
|
|
42
|
+
}
|
|
43
|
+
return 1;
|
|
44
|
+
});
|
|
45
|
+
Streamer.onItemStreamOut((type, item, player) => {
|
|
46
|
+
if (type === StreamerItemTypes.TEXT_3D_LABEL) {
|
|
47
|
+
const tl = this._3dTexts.get(item);
|
|
48
|
+
const p = this.players.get(player);
|
|
49
|
+
if (tl && p)
|
|
50
|
+
return promisifyCallback(
|
|
51
|
+
this,
|
|
52
|
+
"onStreamOut",
|
|
53
|
+
"Streamer_OnItemStreamOut"
|
|
54
|
+
)(tl, p);
|
|
55
|
+
}
|
|
56
|
+
return 1;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
onStreamIn?(label: D, player: P): TCommonCallback;
|
|
61
|
+
onStreamOut?(label: D, player: P): TCommonCallback;
|
|
62
|
+
|
|
63
|
+
get3dTextLabelsArr(): Array<D> {
|
|
64
|
+
return [...this._3dTexts.values()];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
get3dTextLabelsMap(): Map<number, D> {
|
|
68
|
+
return this._3dTexts;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { defaultCharset } from "@/controllers/gamemode/settings";
|
|
2
|
+
import { InvalidEnum } from "@/enums";
|
|
3
|
+
import type { IDynamic3DTextLabel } from "@/interfaces";
|
|
4
|
+
import { logger } from "@/logger";
|
|
5
|
+
import { rgba } from "@/utils/colorUtils";
|
|
6
|
+
import {
|
|
7
|
+
CreateDynamic3DTextLabel,
|
|
8
|
+
CreateDynamic3DTextLabelEx,
|
|
9
|
+
GetDynamic3DTextLabelText,
|
|
10
|
+
UpdateDynamic3DTextLabelText,
|
|
11
|
+
} from "@/utils/helperUtils";
|
|
12
|
+
import {
|
|
13
|
+
DestroyDynamic3DTextLabel,
|
|
14
|
+
IsValidDynamic3DTextLabel,
|
|
15
|
+
StreamerDistances,
|
|
16
|
+
StreamerItemTypes,
|
|
17
|
+
} from "@infernus/streamer";
|
|
18
|
+
import { Streamer } from "../common";
|
|
19
|
+
import { _3dTextBus, _3dTextHooks } from "./3dTextBus";
|
|
20
|
+
|
|
21
|
+
export class Dynamic3DTextLabel {
|
|
22
|
+
private sourceInfo: IDynamic3DTextLabel;
|
|
23
|
+
private _id = -1;
|
|
24
|
+
get id(): number {
|
|
25
|
+
return this._id;
|
|
26
|
+
}
|
|
27
|
+
constructor(textLabel: IDynamic3DTextLabel) {
|
|
28
|
+
this.sourceInfo = textLabel;
|
|
29
|
+
}
|
|
30
|
+
create(): void | this {
|
|
31
|
+
if (this.id !== -1)
|
|
32
|
+
return logger.warn("[Streamer3DTextLabel]: Unable to create again");
|
|
33
|
+
let {
|
|
34
|
+
attachedplayer,
|
|
35
|
+
attachedvehicle,
|
|
36
|
+
testlos,
|
|
37
|
+
streamdistance,
|
|
38
|
+
worldid,
|
|
39
|
+
interiorid,
|
|
40
|
+
playerid,
|
|
41
|
+
areaid,
|
|
42
|
+
priority,
|
|
43
|
+
} = this.sourceInfo;
|
|
44
|
+
const { charset, text, colour, drawdistance, x, y, z, extended } =
|
|
45
|
+
this.sourceInfo;
|
|
46
|
+
|
|
47
|
+
attachedplayer ??= InvalidEnum.PLAYER_ID;
|
|
48
|
+
attachedvehicle ??= InvalidEnum.VEHICLE_ID;
|
|
49
|
+
streamdistance ??= StreamerDistances.TEXT_3D_LABEL_SD;
|
|
50
|
+
testlos ??= false;
|
|
51
|
+
priority ??= 0;
|
|
52
|
+
|
|
53
|
+
if (extended) {
|
|
54
|
+
if (typeof worldid === "number") worldid = [-1];
|
|
55
|
+
else worldid ??= [-1];
|
|
56
|
+
if (typeof interiorid === "number") interiorid = [-1];
|
|
57
|
+
else interiorid ??= [-1];
|
|
58
|
+
if (typeof playerid === "number") playerid = [-1];
|
|
59
|
+
else playerid ??= [-1];
|
|
60
|
+
if (typeof areaid === "number") areaid = [-1];
|
|
61
|
+
else areaid ??= [-1];
|
|
62
|
+
|
|
63
|
+
this._id = CreateDynamic3DTextLabelEx(
|
|
64
|
+
text,
|
|
65
|
+
rgba(colour),
|
|
66
|
+
x,
|
|
67
|
+
y,
|
|
68
|
+
z,
|
|
69
|
+
drawdistance,
|
|
70
|
+
attachedplayer,
|
|
71
|
+
attachedvehicle,
|
|
72
|
+
testlos,
|
|
73
|
+
streamdistance,
|
|
74
|
+
worldid,
|
|
75
|
+
interiorid,
|
|
76
|
+
playerid,
|
|
77
|
+
areaid,
|
|
78
|
+
priority,
|
|
79
|
+
charset || defaultCharset
|
|
80
|
+
);
|
|
81
|
+
} else {
|
|
82
|
+
if (Array.isArray(worldid)) worldid = -1;
|
|
83
|
+
else worldid ??= -1;
|
|
84
|
+
if (Array.isArray(interiorid)) interiorid = -1;
|
|
85
|
+
else interiorid ??= -1;
|
|
86
|
+
if (Array.isArray(playerid)) playerid = -1;
|
|
87
|
+
else playerid ??= -1;
|
|
88
|
+
if (Array.isArray(areaid)) areaid = -1;
|
|
89
|
+
else areaid ??= -1;
|
|
90
|
+
|
|
91
|
+
this._id = CreateDynamic3DTextLabel(
|
|
92
|
+
charset || defaultCharset,
|
|
93
|
+
text,
|
|
94
|
+
rgba(colour),
|
|
95
|
+
x,
|
|
96
|
+
y,
|
|
97
|
+
z,
|
|
98
|
+
drawdistance,
|
|
99
|
+
attachedplayer,
|
|
100
|
+
attachedvehicle,
|
|
101
|
+
testlos,
|
|
102
|
+
worldid,
|
|
103
|
+
interiorid,
|
|
104
|
+
playerid,
|
|
105
|
+
streamdistance,
|
|
106
|
+
areaid,
|
|
107
|
+
priority
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
_3dTextBus.emit(_3dTextHooks.created, this);
|
|
111
|
+
return this;
|
|
112
|
+
}
|
|
113
|
+
destroy(): void | this {
|
|
114
|
+
if (this.id === -1)
|
|
115
|
+
return logger.warn(
|
|
116
|
+
"[Streamer3DTextLabel]: Unable to destroy before create"
|
|
117
|
+
);
|
|
118
|
+
DestroyDynamic3DTextLabel(this.id);
|
|
119
|
+
_3dTextBus.emit(_3dTextHooks.destroyed, this);
|
|
120
|
+
return this;
|
|
121
|
+
}
|
|
122
|
+
isValid(): boolean {
|
|
123
|
+
return IsValidDynamic3DTextLabel(this.id);
|
|
124
|
+
}
|
|
125
|
+
getColour(): void | string | number {
|
|
126
|
+
if (this.id === -1)
|
|
127
|
+
return logger.warn(
|
|
128
|
+
"[Streamer3DTextLabel]: Unable to get colour before create"
|
|
129
|
+
);
|
|
130
|
+
return this.sourceInfo.colour;
|
|
131
|
+
}
|
|
132
|
+
getCharset(): void | string {
|
|
133
|
+
if (this.id === -1)
|
|
134
|
+
return logger.warn(
|
|
135
|
+
"[Streamer3DTextLabel]: Unable to get charset before create"
|
|
136
|
+
);
|
|
137
|
+
return this.sourceInfo.charset;
|
|
138
|
+
}
|
|
139
|
+
getText(): void | string {
|
|
140
|
+
if (this.id === -1)
|
|
141
|
+
return logger.warn(
|
|
142
|
+
"[Streamer3DTextLabel]: Unable to get text before create"
|
|
143
|
+
);
|
|
144
|
+
return GetDynamic3DTextLabelText(
|
|
145
|
+
this.id,
|
|
146
|
+
this.sourceInfo.charset || defaultCharset
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
updateText(
|
|
150
|
+
colour: string | number,
|
|
151
|
+
text: string,
|
|
152
|
+
charset = this.sourceInfo.charset
|
|
153
|
+
): void | number {
|
|
154
|
+
if (this.id === -1)
|
|
155
|
+
return logger.warn(
|
|
156
|
+
"[Streamer3DTextLabel]: Unable to update text before create"
|
|
157
|
+
);
|
|
158
|
+
this.sourceInfo.charset = charset;
|
|
159
|
+
return UpdateDynamic3DTextLabelText(
|
|
160
|
+
this.id,
|
|
161
|
+
rgba(colour),
|
|
162
|
+
text,
|
|
163
|
+
charset || defaultCharset
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
toggleCallbacks(toggle = true): void | number {
|
|
167
|
+
if (this.id === -1)
|
|
168
|
+
return logger.warn(
|
|
169
|
+
"[Streamer3DTextLabel]: Unable to toggle callbacks before create"
|
|
170
|
+
);
|
|
171
|
+
return Streamer.toggleItemCallbacks(
|
|
172
|
+
StreamerItemTypes.TEXT_3D_LABEL,
|
|
173
|
+
this.id,
|
|
174
|
+
toggle
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
isToggleCallbacks(): boolean {
|
|
178
|
+
if (this.id === -1) false;
|
|
179
|
+
return Streamer.isToggleItemCallbacks(
|
|
180
|
+
StreamerItemTypes.TEXT_3D_LABEL,
|
|
181
|
+
this.id
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { Player } from "@/controllers/player";
|
|
2
|
+
import type { BodyPartsEnum } from "@/enums";
|
|
3
|
+
import type { TCommonCallback } from "@/types";
|
|
4
|
+
import { promisifyCallback } from "@/utils/helperUtils";
|
|
5
|
+
import { OnGameModeExit } from "@/wrapper/native/callbacks";
|
|
6
|
+
import {
|
|
7
|
+
OnDynamicActorStreamIn,
|
|
8
|
+
OnDynamicActorStreamOut,
|
|
9
|
+
OnPlayerGiveDamageDynamicActor,
|
|
10
|
+
} from "@infernus/streamer";
|
|
11
|
+
import { actorBus, actorHooks } from "./actorBus";
|
|
12
|
+
import type { DynamicActor } from "./baseActor";
|
|
13
|
+
|
|
14
|
+
export class DynamicActorEvent<P extends Player, A extends DynamicActor> {
|
|
15
|
+
private readonly actors = new Map<number, A>();
|
|
16
|
+
private readonly players;
|
|
17
|
+
|
|
18
|
+
constructor(playersMap: Map<number, P>, destroyOnExit = true) {
|
|
19
|
+
this.players = playersMap;
|
|
20
|
+
actorBus.on(actorHooks.created, (actor: A) => {
|
|
21
|
+
this.actors.set(actor.id, actor);
|
|
22
|
+
});
|
|
23
|
+
actorBus.on(actorHooks.destroyed, (actor: A) => {
|
|
24
|
+
this.actors.delete(actor.id);
|
|
25
|
+
});
|
|
26
|
+
if (destroyOnExit) {
|
|
27
|
+
OnGameModeExit(() => {
|
|
28
|
+
this.actors.forEach((a) => a.destroy());
|
|
29
|
+
this.actors.clear();
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
OnDynamicActorStreamIn((actorid: number, forplayerid: number): number => {
|
|
33
|
+
const act = this.actors.get(actorid);
|
|
34
|
+
if (!act) return 0;
|
|
35
|
+
const p = this.players.get(forplayerid);
|
|
36
|
+
if (!p) return 0;
|
|
37
|
+
const pFn = promisifyCallback(
|
|
38
|
+
this,
|
|
39
|
+
"onStreamIn",
|
|
40
|
+
"OnDynamicActorStreamIn"
|
|
41
|
+
);
|
|
42
|
+
return pFn(act, p);
|
|
43
|
+
});
|
|
44
|
+
OnDynamicActorStreamOut((actorid: number, forplayerid: number): number => {
|
|
45
|
+
const act = this.actors.get(actorid);
|
|
46
|
+
if (!act) return 0;
|
|
47
|
+
const p = this.players.get(forplayerid);
|
|
48
|
+
if (!p) return 0;
|
|
49
|
+
const pFn = promisifyCallback(
|
|
50
|
+
this,
|
|
51
|
+
"onStreamOut",
|
|
52
|
+
"OnDynamicActorStreamOut"
|
|
53
|
+
);
|
|
54
|
+
return pFn(act, p);
|
|
55
|
+
});
|
|
56
|
+
OnPlayerGiveDamageDynamicActor(
|
|
57
|
+
(
|
|
58
|
+
playerid: number,
|
|
59
|
+
actorid: number,
|
|
60
|
+
amount: number,
|
|
61
|
+
weaponid: number,
|
|
62
|
+
bodypart: number
|
|
63
|
+
): number => {
|
|
64
|
+
const act = this.actors.get(actorid);
|
|
65
|
+
if (!act) return 0;
|
|
66
|
+
const p = this.players.get(playerid);
|
|
67
|
+
if (!p) return 0;
|
|
68
|
+
const pFn = promisifyCallback(
|
|
69
|
+
this,
|
|
70
|
+
"onPlayerGiveDamage",
|
|
71
|
+
"OnPlayerGiveDamageDynamicActor"
|
|
72
|
+
);
|
|
73
|
+
return pFn(p, act, amount, weaponid, bodypart);
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
onStreamIn?(actor: A, player: P): TCommonCallback;
|
|
79
|
+
onStreamOut?(actor: A, player: P): TCommonCallback;
|
|
80
|
+
onPlayerGiveDamage?(
|
|
81
|
+
player: P,
|
|
82
|
+
actor: A,
|
|
83
|
+
amount: number,
|
|
84
|
+
weaponid: number,
|
|
85
|
+
bodypart: BodyPartsEnum
|
|
86
|
+
): TCommonCallback;
|
|
87
|
+
|
|
88
|
+
getActorsArr(): Array<A> {
|
|
89
|
+
return [...this.actors.values()];
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
getActorsMap(): Map<number, A> {
|
|
93
|
+
return this.actors;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import type { Player } from "@/controllers/player";
|
|
2
|
+
import type { IDynamicActor } from "@/interfaces";
|
|
3
|
+
import { logger } from "@/logger";
|
|
4
|
+
import { getAnimateDurationByLibName } from "@/utils/animateUtils";
|
|
5
|
+
import {
|
|
6
|
+
GetActorSkin,
|
|
7
|
+
SetActorSkin,
|
|
8
|
+
GetActorSpawnInfo,
|
|
9
|
+
GetActorAnimation,
|
|
10
|
+
} from "@infernus/wrapper";
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
ApplyDynamicActorAnimation,
|
|
14
|
+
ClearDynamicActorAnimations,
|
|
15
|
+
CreateDynamicActor,
|
|
16
|
+
CreateDynamicActorEx,
|
|
17
|
+
DestroyDynamicActor,
|
|
18
|
+
GetDynamicActorFacingAngle,
|
|
19
|
+
GetDynamicActorHealth,
|
|
20
|
+
GetDynamicActorPos,
|
|
21
|
+
GetDynamicActorVirtualWorld,
|
|
22
|
+
GetPlayerCameraTargetDynActor,
|
|
23
|
+
GetPlayerTargetDynamicActor,
|
|
24
|
+
IsDynamicActorInvulnerable,
|
|
25
|
+
IsDynamicActorStreamedIn,
|
|
26
|
+
IsValidDynamicActor,
|
|
27
|
+
SetDynamicActorFacingAngle,
|
|
28
|
+
SetDynamicActorHealth,
|
|
29
|
+
SetDynamicActorInvulnerable,
|
|
30
|
+
SetDynamicActorPos,
|
|
31
|
+
SetDynamicActorVirtualWorld,
|
|
32
|
+
StreamerDistances,
|
|
33
|
+
StreamerItemTypes,
|
|
34
|
+
} from "@infernus/streamer";
|
|
35
|
+
import { Streamer } from "../common";
|
|
36
|
+
import { actorBus, actorHooks } from "./actorBus";
|
|
37
|
+
|
|
38
|
+
export class DynamicActor {
|
|
39
|
+
private sourceInfo: IDynamicActor;
|
|
40
|
+
private _id = -1;
|
|
41
|
+
get id(): number {
|
|
42
|
+
return this._id;
|
|
43
|
+
}
|
|
44
|
+
constructor(actor: IDynamicActor) {
|
|
45
|
+
this.sourceInfo = actor;
|
|
46
|
+
}
|
|
47
|
+
create(): void | this {
|
|
48
|
+
if (this.id !== -1)
|
|
49
|
+
return logger.warn("[StreamerActor]: Unable to create actor again");
|
|
50
|
+
let { streamdistance, worldid, interiorid, playerid, areaid, priority } =
|
|
51
|
+
this.sourceInfo;
|
|
52
|
+
const { modelid, x, y, z, r, invulnerable, health, extended } =
|
|
53
|
+
this.sourceInfo;
|
|
54
|
+
|
|
55
|
+
streamdistance ??= StreamerDistances.ACTOR_SD;
|
|
56
|
+
priority ??= 0;
|
|
57
|
+
|
|
58
|
+
if (extended) {
|
|
59
|
+
if (typeof worldid === "number") worldid = [0];
|
|
60
|
+
else worldid ??= [0];
|
|
61
|
+
if (typeof interiorid === "number") interiorid = [-1];
|
|
62
|
+
else interiorid ??= [-1];
|
|
63
|
+
if (typeof playerid === "number") playerid = [-1];
|
|
64
|
+
else playerid ??= [-1];
|
|
65
|
+
if (typeof areaid === "number") areaid = [-1];
|
|
66
|
+
else areaid ??= [-1];
|
|
67
|
+
|
|
68
|
+
this._id = CreateDynamicActorEx(
|
|
69
|
+
modelid,
|
|
70
|
+
x,
|
|
71
|
+
y,
|
|
72
|
+
z,
|
|
73
|
+
r,
|
|
74
|
+
invulnerable,
|
|
75
|
+
health,
|
|
76
|
+
streamdistance,
|
|
77
|
+
worldid,
|
|
78
|
+
interiorid,
|
|
79
|
+
playerid,
|
|
80
|
+
areaid,
|
|
81
|
+
priority
|
|
82
|
+
);
|
|
83
|
+
} else {
|
|
84
|
+
if (Array.isArray(worldid)) worldid = 0;
|
|
85
|
+
else worldid ??= 0;
|
|
86
|
+
if (Array.isArray(interiorid)) interiorid = -1;
|
|
87
|
+
else interiorid ??= -1;
|
|
88
|
+
if (Array.isArray(playerid)) playerid = -1;
|
|
89
|
+
else playerid ??= -1;
|
|
90
|
+
if (Array.isArray(areaid)) areaid = -1;
|
|
91
|
+
else areaid ??= -1;
|
|
92
|
+
|
|
93
|
+
this._id = CreateDynamicActor(
|
|
94
|
+
modelid,
|
|
95
|
+
x,
|
|
96
|
+
y,
|
|
97
|
+
z,
|
|
98
|
+
r,
|
|
99
|
+
invulnerable,
|
|
100
|
+
health,
|
|
101
|
+
worldid,
|
|
102
|
+
interiorid,
|
|
103
|
+
playerid,
|
|
104
|
+
streamdistance,
|
|
105
|
+
areaid,
|
|
106
|
+
priority
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
actorBus.emit(actorHooks.created, this);
|
|
111
|
+
return this;
|
|
112
|
+
}
|
|
113
|
+
destroy(): void | this {
|
|
114
|
+
if (this.id === -1)
|
|
115
|
+
return logger.warn(
|
|
116
|
+
"[StreamerActor]: Unable to destroy the actor before create"
|
|
117
|
+
);
|
|
118
|
+
DestroyDynamicActor(this.id);
|
|
119
|
+
actorBus.emit(actorHooks.destroyed, this);
|
|
120
|
+
return this;
|
|
121
|
+
}
|
|
122
|
+
isValid(): boolean {
|
|
123
|
+
return IsValidDynamicActor(this.id);
|
|
124
|
+
}
|
|
125
|
+
isStreamedIn<P extends Player>(forplayer: P): boolean {
|
|
126
|
+
if (this.id === -1) return false;
|
|
127
|
+
return IsDynamicActorStreamedIn(this.id, forplayer.id);
|
|
128
|
+
}
|
|
129
|
+
getVirtualWorld(): void | number {
|
|
130
|
+
if (this.id === -1)
|
|
131
|
+
return logger.warn(
|
|
132
|
+
"[StreamerActor]: Unable to get virtual world before create"
|
|
133
|
+
);
|
|
134
|
+
return GetDynamicActorVirtualWorld(this.id);
|
|
135
|
+
}
|
|
136
|
+
setVirtualWorld(vworld: number): void | number {
|
|
137
|
+
if (this.id === -1)
|
|
138
|
+
return logger.warn(
|
|
139
|
+
"[StreamerActor]: Unable to set virtual world before create"
|
|
140
|
+
);
|
|
141
|
+
return SetDynamicActorVirtualWorld(this.id, vworld);
|
|
142
|
+
}
|
|
143
|
+
applyAnimation(
|
|
144
|
+
animLib: string,
|
|
145
|
+
animName: string,
|
|
146
|
+
loop = false,
|
|
147
|
+
lockX = true,
|
|
148
|
+
lockY = true,
|
|
149
|
+
freeze = false
|
|
150
|
+
): void | number {
|
|
151
|
+
if (this.id === -1)
|
|
152
|
+
return logger.warn(
|
|
153
|
+
"[StreamerActor]: Unable to apply animation before create"
|
|
154
|
+
);
|
|
155
|
+
const duration = getAnimateDurationByLibName(animLib, animName);
|
|
156
|
+
if (duration === undefined)
|
|
157
|
+
return logger.error("[StreamerActor]: Invalid anim library or name");
|
|
158
|
+
return ApplyDynamicActorAnimation(
|
|
159
|
+
this.id,
|
|
160
|
+
animLib,
|
|
161
|
+
animName,
|
|
162
|
+
4.1,
|
|
163
|
+
loop,
|
|
164
|
+
lockX,
|
|
165
|
+
lockY,
|
|
166
|
+
freeze,
|
|
167
|
+
loop ? 0 : duration
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
clearAnimations(): void | number {
|
|
171
|
+
if (this.id === -1)
|
|
172
|
+
return logger.warn(
|
|
173
|
+
"[StreamerActor]: Unable to clear animation before create"
|
|
174
|
+
);
|
|
175
|
+
return ClearDynamicActorAnimations(this.id);
|
|
176
|
+
}
|
|
177
|
+
getFacingAngle(): void | number {
|
|
178
|
+
if (this.id === -1)
|
|
179
|
+
return logger.warn(
|
|
180
|
+
"[StreamerActor]: Unable to get facing angle before create"
|
|
181
|
+
);
|
|
182
|
+
return GetDynamicActorFacingAngle(this.id);
|
|
183
|
+
}
|
|
184
|
+
setFacingAngle(ang: number): void | number {
|
|
185
|
+
if (this.id === -1)
|
|
186
|
+
return logger.warn(
|
|
187
|
+
"[StreamerActor]: Unable to set facing angle before create"
|
|
188
|
+
);
|
|
189
|
+
return SetDynamicActorFacingAngle(this.id, ang);
|
|
190
|
+
}
|
|
191
|
+
getPos() {
|
|
192
|
+
if (this.id === -1)
|
|
193
|
+
return logger.warn("[StreamerActor]: Unable to get pos before create");
|
|
194
|
+
return GetDynamicActorPos(this.id);
|
|
195
|
+
}
|
|
196
|
+
setPos(x: number, y: number, z: number): void | number {
|
|
197
|
+
if (this.id === -1)
|
|
198
|
+
return logger.warn("[StreamerActor]: Unable to set pos before create");
|
|
199
|
+
return SetDynamicActorPos(this.id, x, y, z);
|
|
200
|
+
}
|
|
201
|
+
getHealth(): void | number {
|
|
202
|
+
if (this.id === -1)
|
|
203
|
+
return logger.warn("[StreamerActor]: Unable to get health before create");
|
|
204
|
+
return GetDynamicActorHealth(this.id);
|
|
205
|
+
}
|
|
206
|
+
setHealth(health: number): void | number {
|
|
207
|
+
if (this.id === -1)
|
|
208
|
+
return logger.warn("[StreamerActor]: Unable to set health before create");
|
|
209
|
+
return SetDynamicActorHealth(this.id, health);
|
|
210
|
+
}
|
|
211
|
+
isInvulnerable(): boolean {
|
|
212
|
+
if (this.id === -1) return false;
|
|
213
|
+
return IsDynamicActorInvulnerable(this.id);
|
|
214
|
+
}
|
|
215
|
+
setInvulnerable(invulnerable = true): void | number {
|
|
216
|
+
if (this.id === -1)
|
|
217
|
+
return logger.warn(
|
|
218
|
+
"[StreamerActor]: Unable to set invulnerable before create"
|
|
219
|
+
);
|
|
220
|
+
return SetDynamicActorInvulnerable(this.id, invulnerable);
|
|
221
|
+
}
|
|
222
|
+
getPlayerTarget<P extends Player, A extends DynamicActor>(
|
|
223
|
+
player: P,
|
|
224
|
+
actors: Map<number, A>
|
|
225
|
+
): void | A {
|
|
226
|
+
if (this.id === -1) return undefined;
|
|
227
|
+
const actorId = GetPlayerTargetDynamicActor(player.id);
|
|
228
|
+
return actors.get(actorId);
|
|
229
|
+
}
|
|
230
|
+
getPlayerCameraTarget<P extends Player, A extends DynamicActor>(
|
|
231
|
+
player: P,
|
|
232
|
+
actors: Map<number, A>
|
|
233
|
+
): void | A {
|
|
234
|
+
if (this.id === -1) return undefined;
|
|
235
|
+
const actorId = GetPlayerCameraTargetDynActor(player.id);
|
|
236
|
+
return actors.get(actorId);
|
|
237
|
+
}
|
|
238
|
+
getSkin(): void | number {
|
|
239
|
+
if (this.id === -1)
|
|
240
|
+
return logger.warn("[StreamerActor]: Unable to get skin before create");
|
|
241
|
+
return GetActorSkin(this.id);
|
|
242
|
+
}
|
|
243
|
+
setSkin(model: number, ignoreRange = false): void | number {
|
|
244
|
+
if (this.id === -1)
|
|
245
|
+
return logger.warn("[StreamerActor]: Unable to set skin before create");
|
|
246
|
+
if (!ignoreRange && (model < 0 || model > 311 || model == 74)) return 0;
|
|
247
|
+
return SetActorSkin(this.id, model);
|
|
248
|
+
}
|
|
249
|
+
getSpawnInfo() {
|
|
250
|
+
if (this.id === -1)
|
|
251
|
+
return logger.warn(
|
|
252
|
+
"[StreamerActor]: Unable to get spawn info before create"
|
|
253
|
+
);
|
|
254
|
+
return GetActorSpawnInfo(this.id);
|
|
255
|
+
}
|
|
256
|
+
getAnimation() {
|
|
257
|
+
if (this.id === -1)
|
|
258
|
+
return logger.warn(
|
|
259
|
+
"[StreamerActor]: Unable to get animation before create"
|
|
260
|
+
);
|
|
261
|
+
return GetActorAnimation(this.id);
|
|
262
|
+
}
|
|
263
|
+
toggleCallbacks(toggle = true): void | number {
|
|
264
|
+
if (this.id === -1)
|
|
265
|
+
return logger.warn(
|
|
266
|
+
"[StreamerActor]: Unable to toggle callbacks before create"
|
|
267
|
+
);
|
|
268
|
+
return Streamer.toggleItemCallbacks(
|
|
269
|
+
StreamerItemTypes.ACTOR,
|
|
270
|
+
this.id,
|
|
271
|
+
toggle
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
isToggleCallbacks(): boolean {
|
|
275
|
+
if (this.id === -1) false;
|
|
276
|
+
return Streamer.isToggleItemCallbacks(StreamerItemTypes.ACTOR, this.id);
|
|
277
|
+
}
|
|
278
|
+
}
|