@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,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;