@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,43 @@
|
|
|
1
|
+
// Reference to Peter Szombati's samp-node-lib
|
|
2
|
+
|
|
3
|
+
export const rgba = (value: string | number): number => {
|
|
4
|
+
if (typeof value === "number") return value;
|
|
5
|
+
if (typeof +value === "number" && !isNaN(+value)) return +value;
|
|
6
|
+
if (value.charAt(0) === "#") {
|
|
7
|
+
if (value.length === 4) {
|
|
8
|
+
return parseInt(
|
|
9
|
+
value.charAt(1) +
|
|
10
|
+
value.charAt(1) +
|
|
11
|
+
value.charAt(2) +
|
|
12
|
+
value.charAt(2) +
|
|
13
|
+
value.charAt(3) +
|
|
14
|
+
value.charAt(3) +
|
|
15
|
+
"FF",
|
|
16
|
+
16
|
|
17
|
+
);
|
|
18
|
+
} else if (value.length === 7) {
|
|
19
|
+
return parseInt(value.slice(1, value.length) + "FF", 16);
|
|
20
|
+
} else if (value.length === 9) {
|
|
21
|
+
return parseInt(value.slice(1, value.length), 16);
|
|
22
|
+
}
|
|
23
|
+
return 255;
|
|
24
|
+
}
|
|
25
|
+
const values: number[] = (value.match(/([0-9])+/g) || []).map((v) =>
|
|
26
|
+
parseInt(v, 10)
|
|
27
|
+
);
|
|
28
|
+
if (values.length !== 4 && values.length !== 3) {
|
|
29
|
+
return 255;
|
|
30
|
+
}
|
|
31
|
+
if (values.length === 3) {
|
|
32
|
+
values.push(255);
|
|
33
|
+
} else {
|
|
34
|
+
values[3] = values[3] < 1 ? Math.floor(values[3] * 255) : 255;
|
|
35
|
+
}
|
|
36
|
+
let n = 0;
|
|
37
|
+
values.reverse().forEach((n2, i) => {
|
|
38
|
+
if (n2 !== 0) {
|
|
39
|
+
n += Math.pow(16, i * 2) * n2;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
return n;
|
|
43
|
+
};
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import { rgba } from "./colorUtils";
|
|
2
|
+
import type { IDialog } from "@/interfaces";
|
|
3
|
+
import { LimitsEnum } from "@/enums";
|
|
4
|
+
import { I18n } from "@/controllers/i18n";
|
|
5
|
+
import type { Player } from "@/controllers/player";
|
|
6
|
+
import { defaultCharset } from "@/controllers/gamemode/settings";
|
|
7
|
+
import { camelCase, upperFirst } from "lodash";
|
|
8
|
+
|
|
9
|
+
type processTuple = [string, string | number[]];
|
|
10
|
+
|
|
11
|
+
export const processMsg = (msg: string, charset: string): processTuple => {
|
|
12
|
+
const res: string | number[] = ["utf8", "utf-8"].includes(charset)
|
|
13
|
+
? msg
|
|
14
|
+
: I18n.encodeToBuf(msg, charset);
|
|
15
|
+
const flag = res instanceof Array ? "a" : "s";
|
|
16
|
+
return [flag, res];
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// Here are some i18n functions used to override the original functions
|
|
20
|
+
export const SendClientMessage = <P extends Player>(
|
|
21
|
+
player: P,
|
|
22
|
+
colour: string | number,
|
|
23
|
+
msg: string
|
|
24
|
+
): number => {
|
|
25
|
+
const res = processMsg(msg, player.charset);
|
|
26
|
+
return callNative(
|
|
27
|
+
"SendClientMessage",
|
|
28
|
+
`ii${res[0]}`,
|
|
29
|
+
player.id,
|
|
30
|
+
rgba(colour),
|
|
31
|
+
res[1]
|
|
32
|
+
);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const SendClientMessageToAll = <P extends Player>(
|
|
36
|
+
fn: Array<P>,
|
|
37
|
+
colour: string | number,
|
|
38
|
+
msg: string
|
|
39
|
+
): number => {
|
|
40
|
+
fn.forEach((player) => SendClientMessage(player, colour, msg));
|
|
41
|
+
return 1;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const SendPlayerMessageToPlayer = <P extends Player>(
|
|
45
|
+
player: P,
|
|
46
|
+
senderId: number,
|
|
47
|
+
message: string
|
|
48
|
+
): number => {
|
|
49
|
+
const res = processMsg(message, player.charset);
|
|
50
|
+
return callNative(
|
|
51
|
+
"SendPlayerMessageToPlayer",
|
|
52
|
+
`ii${res[0]}`,
|
|
53
|
+
player.id,
|
|
54
|
+
senderId,
|
|
55
|
+
res[1]
|
|
56
|
+
);
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export const SendPlayerMessageToAll = <P extends Player>(
|
|
60
|
+
fn: Array<P>,
|
|
61
|
+
senderId: number,
|
|
62
|
+
message: string
|
|
63
|
+
): number => {
|
|
64
|
+
fn.forEach((player) => SendPlayerMessageToPlayer(player, senderId, message));
|
|
65
|
+
return 1;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const ShowPlayerDialog = <P extends Player>(
|
|
69
|
+
player: P,
|
|
70
|
+
id: number,
|
|
71
|
+
dialog: IDialog
|
|
72
|
+
): number => {
|
|
73
|
+
const { charset } = player;
|
|
74
|
+
const { style, caption, info, button1, button2 } = dialog;
|
|
75
|
+
const [flag, processCaption] = processMsg(caption || "", charset);
|
|
76
|
+
const [, processInfo] = processMsg(info || "", charset);
|
|
77
|
+
const [, processButton1] = processMsg(button1 || "", charset);
|
|
78
|
+
const [, processButton2] = processMsg(button2 || "", charset);
|
|
79
|
+
return callNative(
|
|
80
|
+
"ShowPlayerDialog",
|
|
81
|
+
`iii${flag.repeat(4)}`,
|
|
82
|
+
player.id,
|
|
83
|
+
id,
|
|
84
|
+
style,
|
|
85
|
+
processCaption,
|
|
86
|
+
processInfo,
|
|
87
|
+
processButton1,
|
|
88
|
+
processButton2
|
|
89
|
+
);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// see https://github.com/AmyrAhmady/samp-node/wiki/Events#sampnode_callevent.
|
|
93
|
+
// in short, when you write the flag a, you must add I after it, but this I will actually be ignored.
|
|
94
|
+
|
|
95
|
+
samp.registerEvent("OnPlayerTextI18n", "iai");
|
|
96
|
+
export const OnPlayerText = (
|
|
97
|
+
fn: (playerid: number, buf: number[]) => number
|
|
98
|
+
) => {
|
|
99
|
+
// get the player input text
|
|
100
|
+
// and you can decode with the player's charset;
|
|
101
|
+
samp.addEventListener("OnPlayerTextI18n", fn);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
samp.registerEvent("OnPlayerCommandTextI18n", "iai");
|
|
105
|
+
export const OnPlayerCommandText = (
|
|
106
|
+
fn: (playerid: number, buf: number[]) => number
|
|
107
|
+
) => {
|
|
108
|
+
samp.addEventListener("OnPlayerCommandTextI18n", fn);
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
samp.registerEvent("OnDialogResponseI18n", "iiiiai");
|
|
112
|
+
export const OnDialogResponse = (
|
|
113
|
+
fn: (
|
|
114
|
+
playerid: number,
|
|
115
|
+
dialogid: number,
|
|
116
|
+
response: number,
|
|
117
|
+
listitem: number,
|
|
118
|
+
inputbuf: number[]
|
|
119
|
+
) => number
|
|
120
|
+
) => {
|
|
121
|
+
samp.addEventListener("OnDialogResponseI18n", fn);
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
samp.registerEvent("OnClientMessageI18n", "iai");
|
|
125
|
+
export const OnClientMessage = (
|
|
126
|
+
fn: (colour: number, text: string) => number,
|
|
127
|
+
charset = defaultCharset
|
|
128
|
+
) => {
|
|
129
|
+
samp.addEventListener(
|
|
130
|
+
"OnClientMessageI18n",
|
|
131
|
+
(colour: number, buf: number[]): number => {
|
|
132
|
+
return fn(colour, I18n.decodeFromBuf(buf, charset));
|
|
133
|
+
}
|
|
134
|
+
);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
samp.registerEvent("OnRconCommandI18n", "ai");
|
|
138
|
+
export const OnRconCommand = (
|
|
139
|
+
fn: (cmd: string) => number,
|
|
140
|
+
charset = defaultCharset
|
|
141
|
+
) => {
|
|
142
|
+
samp.addEventListener("OnRconCommandI18n", (buf: number[]): number => {
|
|
143
|
+
return fn(I18n.decodeFromBuf(buf, charset));
|
|
144
|
+
});
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
samp.registerEvent("OnRconLoginAttemptI18n", "aiaii");
|
|
148
|
+
export const OnRconLoginAttempt = (
|
|
149
|
+
fn: (ip: string, password: string, success: boolean) => number,
|
|
150
|
+
charset = defaultCharset
|
|
151
|
+
) => {
|
|
152
|
+
samp.addEventListener(
|
|
153
|
+
"OnRconLoginAttemptI18n",
|
|
154
|
+
(ip: number[], password: number[], success: number): number => {
|
|
155
|
+
return fn(
|
|
156
|
+
I18n.decodeFromBuf(ip, charset),
|
|
157
|
+
I18n.decodeFromBuf(password, charset),
|
|
158
|
+
Boolean(success)
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
);
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
export const GetPlayerName = <P extends Player>(player: P): string => {
|
|
165
|
+
const buf: number[] = callNative(
|
|
166
|
+
"GetPlayerName",
|
|
167
|
+
"iAi",
|
|
168
|
+
player.id,
|
|
169
|
+
LimitsEnum.MAX_PLAYER_NAME
|
|
170
|
+
);
|
|
171
|
+
return I18n.decodeFromBuf(I18n.getValidStr(buf), player.charset);
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
export const SetPlayerName = <P extends Player>(
|
|
175
|
+
player: P,
|
|
176
|
+
name: string
|
|
177
|
+
): number => {
|
|
178
|
+
return callNative(
|
|
179
|
+
"SetPlayerName",
|
|
180
|
+
"ia",
|
|
181
|
+
player.id,
|
|
182
|
+
I18n.encodeToBuf(name, player.charset)
|
|
183
|
+
);
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
export const BanEx = (
|
|
187
|
+
playerid: number,
|
|
188
|
+
reason: string,
|
|
189
|
+
charset: string
|
|
190
|
+
): number => {
|
|
191
|
+
const buf = I18n.encodeToBuf(reason, charset);
|
|
192
|
+
return callNative("BanEx", "ia", playerid, buf);
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
export const CreateDynamic3DTextLabel = (
|
|
196
|
+
charset: string,
|
|
197
|
+
text: string,
|
|
198
|
+
colour: number,
|
|
199
|
+
x: number,
|
|
200
|
+
y: number,
|
|
201
|
+
z: number,
|
|
202
|
+
drawdistance: number,
|
|
203
|
+
attachedplayer: number,
|
|
204
|
+
attachedvehicle: number,
|
|
205
|
+
testlos: boolean,
|
|
206
|
+
worldid: number,
|
|
207
|
+
interiorid: number,
|
|
208
|
+
playerid: number,
|
|
209
|
+
streamdistance: number,
|
|
210
|
+
areaid: number,
|
|
211
|
+
priority: number
|
|
212
|
+
): number => {
|
|
213
|
+
const buf = I18n.encodeToBuf(text, charset);
|
|
214
|
+
return callNative(
|
|
215
|
+
"CreateDynamic3DTextLabel",
|
|
216
|
+
"aiffffiiiiiifii",
|
|
217
|
+
buf,
|
|
218
|
+
colour,
|
|
219
|
+
x,
|
|
220
|
+
y,
|
|
221
|
+
z,
|
|
222
|
+
drawdistance,
|
|
223
|
+
attachedplayer,
|
|
224
|
+
attachedvehicle,
|
|
225
|
+
testlos,
|
|
226
|
+
worldid,
|
|
227
|
+
interiorid,
|
|
228
|
+
playerid,
|
|
229
|
+
streamdistance,
|
|
230
|
+
areaid,
|
|
231
|
+
priority
|
|
232
|
+
);
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
export const CreateDynamic3DTextLabelEx = (
|
|
236
|
+
text: string,
|
|
237
|
+
colour: number,
|
|
238
|
+
x: number,
|
|
239
|
+
y: number,
|
|
240
|
+
z: number,
|
|
241
|
+
drawdistance: number,
|
|
242
|
+
attachedplayer: number,
|
|
243
|
+
attachedvehicle: number,
|
|
244
|
+
testlos: boolean,
|
|
245
|
+
streamdistance: number,
|
|
246
|
+
worlds: number[],
|
|
247
|
+
interiors: number[],
|
|
248
|
+
players: number[],
|
|
249
|
+
areas: number[],
|
|
250
|
+
priority: number,
|
|
251
|
+
charset: string
|
|
252
|
+
): number => {
|
|
253
|
+
const buf = I18n.encodeToBuf(text, charset);
|
|
254
|
+
return callNative(
|
|
255
|
+
"CreateDynamic3DTextLabelEx",
|
|
256
|
+
"aiffffiiifaaaaiiiii",
|
|
257
|
+
buf,
|
|
258
|
+
colour,
|
|
259
|
+
x,
|
|
260
|
+
y,
|
|
261
|
+
z,
|
|
262
|
+
drawdistance,
|
|
263
|
+
attachedplayer,
|
|
264
|
+
attachedvehicle,
|
|
265
|
+
testlos,
|
|
266
|
+
streamdistance,
|
|
267
|
+
worlds,
|
|
268
|
+
interiors,
|
|
269
|
+
players,
|
|
270
|
+
areas,
|
|
271
|
+
priority,
|
|
272
|
+
worlds.length,
|
|
273
|
+
interiors.length,
|
|
274
|
+
players.length,
|
|
275
|
+
areas.length
|
|
276
|
+
);
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
export const UpdateDynamic3DTextLabelText = (
|
|
280
|
+
id: number,
|
|
281
|
+
colour: number,
|
|
282
|
+
text: string,
|
|
283
|
+
charset: string
|
|
284
|
+
): number => {
|
|
285
|
+
const buf = I18n.encodeToBuf(text, charset);
|
|
286
|
+
return callNative("UpdateDynamic3DTextLabelText", "iia", id, colour, buf);
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
export const GetDynamic3DTextLabelText = (
|
|
290
|
+
id: number,
|
|
291
|
+
charset: string
|
|
292
|
+
): string => {
|
|
293
|
+
const buf: number[] = callNative(
|
|
294
|
+
"GetDynamic3DTextLabelText",
|
|
295
|
+
"iAi",
|
|
296
|
+
id,
|
|
297
|
+
1024
|
|
298
|
+
);
|
|
299
|
+
return I18n.decodeFromBuf(I18n.getValidStr(buf), charset);
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
export const SetDynamicObjectMaterialText = (
|
|
303
|
+
charset: string,
|
|
304
|
+
objectid: number,
|
|
305
|
+
materialindex: number,
|
|
306
|
+
text: string,
|
|
307
|
+
materialsize: number,
|
|
308
|
+
fontface: string,
|
|
309
|
+
fontsize: number,
|
|
310
|
+
bold: number,
|
|
311
|
+
fontcolour: number,
|
|
312
|
+
backcolour: number,
|
|
313
|
+
textalignment: number
|
|
314
|
+
): number => {
|
|
315
|
+
const textBuf = I18n.encodeToBuf(text, charset);
|
|
316
|
+
const fontFaceBuf = I18n.encodeToBuf(fontface, charset);
|
|
317
|
+
return callNative(
|
|
318
|
+
"SetDynamicObjectMaterialText",
|
|
319
|
+
"iiaiaiiiii",
|
|
320
|
+
objectid,
|
|
321
|
+
materialindex,
|
|
322
|
+
textBuf,
|
|
323
|
+
materialsize,
|
|
324
|
+
fontFaceBuf,
|
|
325
|
+
fontsize,
|
|
326
|
+
bold,
|
|
327
|
+
fontcolour,
|
|
328
|
+
backcolour,
|
|
329
|
+
textalignment
|
|
330
|
+
);
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
export const GetDynamicObjectMaterialText = (
|
|
334
|
+
objectid: number,
|
|
335
|
+
materialindex: number,
|
|
336
|
+
charset: string
|
|
337
|
+
) => {
|
|
338
|
+
const [
|
|
339
|
+
text,
|
|
340
|
+
materialsize,
|
|
341
|
+
fontface,
|
|
342
|
+
bold,
|
|
343
|
+
fontcolour,
|
|
344
|
+
backcolour,
|
|
345
|
+
textalignment,
|
|
346
|
+
]: [number[], number, number[], number, number, number, number] = callNative(
|
|
347
|
+
"GetDynamicObjectMaterialText",
|
|
348
|
+
"iiAIAIIIIIii",
|
|
349
|
+
objectid,
|
|
350
|
+
materialindex,
|
|
351
|
+
2048,
|
|
352
|
+
32
|
|
353
|
+
);
|
|
354
|
+
const textStr = I18n.decodeFromBuf(text, charset);
|
|
355
|
+
const fontFaceStr = I18n.decodeFromBuf(fontface, charset);
|
|
356
|
+
return {
|
|
357
|
+
text: textStr,
|
|
358
|
+
materialsize,
|
|
359
|
+
fontface: fontFaceStr,
|
|
360
|
+
bold,
|
|
361
|
+
fontcolour,
|
|
362
|
+
backcolour,
|
|
363
|
+
textalignment,
|
|
364
|
+
};
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
export const promisifyCallback = (
|
|
368
|
+
obj: any,
|
|
369
|
+
fnName: string,
|
|
370
|
+
naiveCbName?: string,
|
|
371
|
+
retNum = 1 // should return handled number or boolean
|
|
372
|
+
) => {
|
|
373
|
+
return (...args: any) => {
|
|
374
|
+
if (!obj[fnName]) return retNum;
|
|
375
|
+
|
|
376
|
+
const result = obj[fnName](...args);
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* This does not meet our expectations. When we use async or promise to return a result in a callback, it will not trigger the result we return asynchronously until the next time the same callback is triggered.
|
|
380
|
+
* One possible solution: pass the callback name and the result of the asynchronous wait through the CallRemoteFunction, determine if it was triggered manually before we receive the callback to the class itself, and return the result of the asynchronous wait directly if it was.
|
|
381
|
+
* CallRemoteFunction("OnPlayerText", "is", playerid, text);
|
|
382
|
+
*/
|
|
383
|
+
if (result instanceof Promise) {
|
|
384
|
+
result.then((value) => {
|
|
385
|
+
let parseNaiveCbName = naiveCbName;
|
|
386
|
+
if (!parseNaiveCbName) parseNaiveCbName = upperFirst(camelCase(fnName));
|
|
387
|
+
const promiseFn = () => {
|
|
388
|
+
samp.removeEventListener(parseNaiveCbName as string, promiseFn);
|
|
389
|
+
return value;
|
|
390
|
+
};
|
|
391
|
+
samp.addEventListener(parseNaiveCbName, promiseFn);
|
|
392
|
+
});
|
|
393
|
+
return retNum;
|
|
394
|
+
}
|
|
395
|
+
if (result === undefined) return retNum;
|
|
396
|
+
return Number(result);
|
|
397
|
+
};
|
|
398
|
+
};
|
|
399
|
+
|
|
400
|
+
export const NOOP = (cbName: string, unhandled = 0) =>
|
|
401
|
+
promisifyCallback({ NOOP: () => unhandled }, "NOOP", cbName);
|
|
402
|
+
|
|
403
|
+
export const { callNative, callNativeFloat } = samp;
|