@infernus/core 0.8.7 → 0.9.1

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/dist/bundle.d.ts +1553 -1551
  2. package/dist/bundle.js +1 -1
  3. package/dist/bundle.mjs +1 -0
  4. package/package.json +10 -3
  5. package/rollup.config.mjs +5 -2
  6. package/.eslintrc +0 -3
  7. package/src/controllers/command/index.ts +0 -57
  8. package/src/controllers/filterscript/index.ts +0 -69
  9. package/src/controllers/gamemode/index.ts +0 -277
  10. package/src/controllers/gamemode/settings.ts +0 -3
  11. package/src/controllers/gametext/index.ts +0 -61
  12. package/src/controllers/gangzone/baseGangZone.ts +0 -284
  13. package/src/controllers/gangzone/gangZoneBus.ts +0 -8
  14. package/src/controllers/gangzone/gangZoneEvent.ts +0 -91
  15. package/src/controllers/gangzone/index.ts +0 -2
  16. package/src/controllers/i18n/index.ts +0 -81
  17. package/src/controllers/index.ts +0 -12
  18. package/src/controllers/menu/baseMenu.ts +0 -203
  19. package/src/controllers/menu/index.ts +0 -2
  20. package/src/controllers/menu/menuBus.ts +0 -8
  21. package/src/controllers/menu/menuEvent.ts +0 -76
  22. package/src/controllers/netstats/index.ts +0 -43
  23. package/src/controllers/npc/index.ts +0 -2
  24. package/src/controllers/npc/npcEvent.ts +0 -26
  25. package/src/controllers/npc/npcFunc.ts +0 -64
  26. package/src/controllers/player/basePlayer.ts +0 -980
  27. package/src/controllers/player/index.ts +0 -3
  28. package/src/controllers/player/pauseChecker.ts +0 -39
  29. package/src/controllers/player/playerBus.ts +0 -9
  30. package/src/controllers/player/playerEvent.ts +0 -468
  31. package/src/controllers/promise/client/index.ts +0 -31
  32. package/src/controllers/promise/dialog/index.ts +0 -143
  33. package/src/controllers/textdraw/baseTextDraw.ts +0 -416
  34. package/src/controllers/textdraw/index.ts +0 -2
  35. package/src/controllers/textdraw/textdrawBus.ts +0 -8
  36. package/src/controllers/textdraw/textdrawEvent.ts +0 -61
  37. package/src/controllers/vehicle/baseVehicle.ts +0 -503
  38. package/src/controllers/vehicle/index.ts +0 -2
  39. package/src/controllers/vehicle/vehicleBus.ts +0 -8
  40. package/src/controllers/vehicle/vehicleEvent.ts +0 -201
  41. package/src/enums/artwork.ts +0 -5
  42. package/src/enums/clickSources.ts +0 -3
  43. package/src/enums/dialogStyles.ts +0 -8
  44. package/src/enums/editResponseTypes.ts +0 -5
  45. package/src/enums/index.ts +0 -18
  46. package/src/enums/invalid.ts +0 -13
  47. package/src/enums/keys.ts +0 -25
  48. package/src/enums/limits.ts +0 -18
  49. package/src/enums/marker.ts +0 -5
  50. package/src/enums/netstat.ts +0 -11
  51. package/src/enums/npc.ts +0 -11
  52. package/src/enums/object.ts +0 -25
  53. package/src/enums/player.ts +0 -92
  54. package/src/enums/record.ts +0 -5
  55. package/src/enums/specialActions.ts +0 -22
  56. package/src/enums/streamer.ts +0 -10
  57. package/src/enums/textdrawFonts.ts +0 -23
  58. package/src/enums/vehicle.ts +0 -32
  59. package/src/enums/weapon.ts +0 -82
  60. package/src/interfaces/index.ts +0 -233
  61. package/src/logger/index.ts +0 -24
  62. package/src/main.ts +0 -6
  63. package/src/types/index.ts +0 -48
  64. package/src/utils/EventBus.ts +0 -60
  65. package/src/utils/animateUtils.ts +0 -2504
  66. package/src/utils/colorUtils.ts +0 -43
  67. package/src/utils/helperUtils.ts +0 -403
  68. package/src/utils/vehicleUtils.ts +0 -321
  69. package/src/wrapper/native/callbacks/index.ts +0 -395
  70. package/src/wrapper/native/functions/index.ts +0 -3131
  71. package/src/wrapper/streamer/3dtext/3dTextBus.ts +0 -8
  72. package/src/wrapper/streamer/3dtext/3dTextEvent.ts +0 -70
  73. package/src/wrapper/streamer/3dtext/base3DText.ts +0 -184
  74. package/src/wrapper/streamer/3dtext/index.ts +0 -2
  75. package/src/wrapper/streamer/actor/actorBus.ts +0 -8
  76. package/src/wrapper/streamer/actor/actorEvent.ts +0 -95
  77. package/src/wrapper/streamer/actor/baseActor.ts +0 -278
  78. package/src/wrapper/streamer/actor/index.ts +0 -2
  79. package/src/wrapper/streamer/area/areaBus.ts +0 -8
  80. package/src/wrapper/streamer/area/areaEvent.ts +0 -99
  81. package/src/wrapper/streamer/area/baseArea.ts +0 -450
  82. package/src/wrapper/streamer/area/index.ts +0 -2
  83. package/src/wrapper/streamer/checkpoint/baseCheckpoint.ts +0 -136
  84. package/src/wrapper/streamer/checkpoint/checkPointBus.ts +0 -8
  85. package/src/wrapper/streamer/checkpoint/checkPointEvent.ts +0 -100
  86. package/src/wrapper/streamer/checkpoint/index.ts +0 -2
  87. package/src/wrapper/streamer/common/index.ts +0 -318
  88. package/src/wrapper/streamer/index.ts +0 -9
  89. package/src/wrapper/streamer/mapIcon/baseMapIcon.ts +0 -128
  90. package/src/wrapper/streamer/mapIcon/index.ts +0 -2
  91. package/src/wrapper/streamer/mapIcon/mapIconBus.ts +0 -8
  92. package/src/wrapper/streamer/mapIcon/mapIconEvent.ts +0 -67
  93. package/src/wrapper/streamer/object/baseObject.ts +0 -415
  94. package/src/wrapper/streamer/object/index.ts +0 -2
  95. package/src/wrapper/streamer/object/objectBus.ts +0 -8
  96. package/src/wrapper/streamer/object/objectEvent.ts +0 -177
  97. package/src/wrapper/streamer/pickup/basePickup.ts +0 -114
  98. package/src/wrapper/streamer/pickup/index.ts +0 -2
  99. package/src/wrapper/streamer/pickup/pickupBus.ts +0 -8
  100. package/src/wrapper/streamer/pickup/pickupEvent.ts +0 -84
  101. package/src/wrapper/streamer/raceCP/baseRaceCP.ts +0 -151
  102. package/src/wrapper/streamer/raceCP/index.ts +0 -2
  103. package/src/wrapper/streamer/raceCP/raceCPBus.ts +0 -8
  104. package/src/wrapper/streamer/raceCP/raceCPEvent.ts +0 -100
  105. package/tsconfig.json +0 -16
  106. /package/{LICENSE → LICENSE.md} +0 -0
@@ -1,3 +0,0 @@
1
- import "./pauseChecker";
2
- export * from "./basePlayer";
3
- export * from "./playerEvent";
@@ -1,39 +0,0 @@
1
- import { PlayerStateEnum } from "@/enums";
2
- import {
3
- OnPlayerConnect,
4
- OnPlayerDisconnect,
5
- } from "@/wrapper/native/callbacks";
6
- import { Player } from "./basePlayer";
7
- import { playerBus, playerHooks } from "./playerBus";
8
-
9
- let timer: null | NodeJS.Timer = null;
10
-
11
- let pausePlayers: Map<number, Player> | null = null;
12
-
13
- playerBus.on(playerHooks.create, (players: Map<number, Player>) => {
14
- if (pausePlayers === null) pausePlayers = players;
15
- });
16
-
17
- OnPlayerConnect(() => {
18
- if (!timer && pausePlayers && Player.getPoolSize() > -1) {
19
- timer = setInterval(() => {
20
- for (const item of pausePlayers as Map<number, Player>) {
21
- const p = item[1];
22
- if (
23
- !p.isNpc() &&
24
- !p.isPaused &&
25
- p.getState() !== PlayerStateEnum.NONE &&
26
- Date.now() - p.lastUpdateTick > 1000
27
- ) {
28
- playerBus.emit(playerHooks.pause, p);
29
- }
30
- }
31
- }, 500);
32
- }
33
- return 1;
34
- });
35
-
36
- OnPlayerDisconnect(() => {
37
- if (timer && Player.getPoolSize() <= 0) clearInterval(timer);
38
- return 1;
39
- });
@@ -1,9 +0,0 @@
1
- import { EventBus } from "@/utils/eventBus";
2
-
3
- export enum playerHooks {
4
- pause = "OnPlayerPause",
5
- create = "OnPlayerEventCreate",
6
- setCommonProp = "OnPlayerSetCommonProp",
7
- }
8
-
9
- export const playerBus = new EventBus();
@@ -1,468 +0,0 @@
1
- import {
2
- NOOP,
3
- OnPlayerCommandText,
4
- OnPlayerText,
5
- promisifyCallback,
6
- } from "@/utils/helperUtils";
7
- import * as cbs from "@/wrapper/native/callbacks";
8
- import { I18n } from "../i18n";
9
- import { Player } from "./basePlayer";
10
- import { CmdBus } from "../command";
11
- import type { ICmdErr } from "@/interfaces";
12
- import * as enums from "@/enums";
13
- import { throttle } from "lodash";
14
- import { Dialog } from "../promise/dialog";
15
- import { delCCTask } from "../promise/client";
16
- import { playerBus, playerHooks } from "./playerBus";
17
- import type { TCommonCallback, TEventFunc, TEventName } from "@/types";
18
-
19
- // Each instance can be called to callbacks, so you can split the logic.
20
-
21
- const ICmdErrInfo: Record<"format" | "notExist" | "rejected", ICmdErr> = {
22
- format: { code: 0, msg: "failed to recognize command (almost never)" },
23
- notExist: { code: 1, msg: "command does not exist" },
24
- rejected: { code: 2, msg: "rejected because true/1 was not returned" },
25
- };
26
-
27
- export class PlayerEvent<P extends Player> {
28
- private readonly players = new Map<number, P>();
29
- private static cmdBus = new CmdBus();
30
-
31
- constructor(newPlayerFn: (id: number) => P) {
32
- cbs.OnPlayerConnect((playerid: number): number => {
33
- const p = newPlayerFn(playerid);
34
- this.players.set(playerid, p);
35
- const pFn = promisifyCallback(this, "onConnect", "OnPlayerConnect");
36
- return pFn(p);
37
- });
38
-
39
- cbs.OnPlayerDisconnect((playerid: number, reason: number): number => {
40
- const p = this.findPlayerById(playerid);
41
- if (!p) return 0;
42
- Dialog.close(p);
43
- delCCTask(playerid, true);
44
- const pFn = promisifyCallback(this, "onDisconnect", "OnPlayerDisconnect");
45
- const result = pFn(p, reason);
46
- this.players.delete(playerid);
47
- return result;
48
- });
49
-
50
- OnPlayerText((playerid: number, byteArr: number[]): number => {
51
- const p = this.findPlayerById(playerid);
52
- if (!p) return 1;
53
- const pFn = promisifyCallback(this, "onText", "OnPlayerTextI18n", 0);
54
- return pFn(p, I18n.decodeFromBuf(byteArr, p.charset));
55
- });
56
-
57
- OnPlayerCommandText((playerid: number, buf: number[]): number => {
58
- const p = this.findPlayerById(playerid);
59
- if (!p) return 0;
60
- const cmdtext = I18n.decodeFromBuf(buf, p.charset);
61
- const regCmdtext = cmdtext.match(/[^/\s]+/gi);
62
- if (regCmdtext === null || regCmdtext.length === 0) {
63
- this.onCommandError &&
64
- this.onCommandError(p, cmdtext, ICmdErrInfo.format);
65
- return 0;
66
- }
67
- this.promiseCommand(p, regCmdtext);
68
- return 1;
69
- });
70
-
71
- cbs.OnEnterExitModShop(
72
- (playerid: number, enterexit: number, interior: number): number => {
73
- const p = this.findPlayerById(playerid);
74
- if (!p) return 0;
75
- const pFn = promisifyCallback(this, "onEnterExitModShop");
76
- return pFn(p, enterexit, interior);
77
- }
78
- );
79
-
80
- cbs.OnPlayerClickMap(
81
- (playerid: number, fX: number, fY: number, fZ: number): number => {
82
- const p = this.findPlayerById(playerid);
83
- if (!p) return 0;
84
- const pFn = promisifyCallback(this, "onClickMap", "OnPlayerClickMap");
85
- return pFn(p, fX, fY, fZ);
86
- }
87
- );
88
-
89
- cbs.OnPlayerClickPlayer(
90
- (playerid: number, clickedplayerid: number, source: number): number => {
91
- const p = this.findPlayerById(playerid);
92
- if (!p) return 0;
93
- const cp = this.findPlayerById(clickedplayerid);
94
- if (!cp) return 0;
95
- const pFn = promisifyCallback(
96
- this,
97
- "onClickPlayer",
98
- "OnPlayerClickPlayer"
99
- );
100
- return pFn(p, cp, source);
101
- }
102
- );
103
-
104
- cbs.OnPlayerDeath(
105
- (playerid: number, killerid: number, reason: number): number => {
106
- const pFn = promisifyCallback(this, "onDeath", "OnPlayerDeath");
107
- const p = this.findPlayerById(playerid);
108
- if (!p) return 0;
109
- if (killerid === enums.InvalidEnum.PLAYER_ID) {
110
- return pFn(p, killerid, reason);
111
- }
112
- const k = this.findPlayerById(killerid);
113
- if (!k) return 0;
114
- return pFn(p, k, reason);
115
- }
116
- );
117
-
118
- cbs.OnPlayerGiveDamage(
119
- (
120
- playerid: number,
121
- damageid: number,
122
- amount: number,
123
- weaponid: enums.WeaponEnum,
124
- bodypart: enums.BodyPartsEnum
125
- ): number => {
126
- const p = this.findPlayerById(playerid);
127
- if (!p) return 0;
128
- const d = this.findPlayerById(damageid);
129
- if (!d) return 0;
130
- const pFn = promisifyCallback(
131
- this,
132
- "onGiveDamage",
133
- "OnPlayerGiveDamage"
134
- );
135
- return pFn(p, d, amount, weaponid, bodypart);
136
- }
137
- );
138
-
139
- cbs.OnPlayerKeyStateChange(
140
- (playerid: number, newkeys: number, oldkeys: number): number => {
141
- const p = this.findPlayerById(playerid);
142
- if (!p) return 0;
143
- const pFn = promisifyCallback(
144
- this,
145
- "onKeyStateChange",
146
- "OnPlayerKeyStateChange"
147
- );
148
- return pFn(p, newkeys, oldkeys);
149
- }
150
- );
151
-
152
- cbs.OnPlayerRequestClass((playerid: number, classid: number): number => {
153
- const p = this.findPlayerById(playerid);
154
- if (!p) return 0;
155
- const pFn = promisifyCallback(
156
- this,
157
- "onRequestClass",
158
- "OnPlayerRequestClass"
159
- );
160
- return pFn(p, classid);
161
- });
162
-
163
- cbs.OnPlayerRequestSpawn((playerid: number): number => {
164
- const p = this.findPlayerById(playerid);
165
- if (!p) return 0;
166
- const pFn = promisifyCallback(
167
- this,
168
- "onRequestSpawn",
169
- "OnPlayerRequestSpawn"
170
- );
171
- return pFn(p);
172
- });
173
-
174
- cbs.OnPlayerSpawn((playerid: number): number => {
175
- const p = this.findPlayerById(playerid);
176
- if (!p) return 0;
177
- const pFn = promisifyCallback(this, "onSpawn", "OnPlayerSpawn");
178
- return pFn(p);
179
- });
180
-
181
- cbs.OnPlayerStateChange(
182
- (playerid: number, newstate: number, oldstate: number): number => {
183
- const p = this.findPlayerById(playerid);
184
- if (!p) return 0;
185
- if (oldstate === enums.PlayerStateEnum.NONE)
186
- p.lastUpdateTick = Date.now();
187
- const pFn = promisifyCallback(
188
- this,
189
- "onStateChange",
190
- "OnPlayerStateChange"
191
- );
192
- return pFn(p, newstate, oldstate);
193
- }
194
- );
195
-
196
- cbs.OnPlayerStreamIn((playerid: number, forplayerid: number): number => {
197
- const p = this.findPlayerById(playerid);
198
- if (!p) return 0;
199
- const fp = this.findPlayerById(forplayerid);
200
- if (!fp) return 0;
201
- const pFn = promisifyCallback(this, "onStreamIn", "OnPlayerStreamIn");
202
- return pFn(p, fp);
203
- });
204
-
205
- cbs.OnPlayerStreamOut((playerid: number, forplayerid: number): number => {
206
- const p = this.findPlayerById(playerid);
207
- if (!p) return 0;
208
- const fp = this.findPlayerById(forplayerid);
209
- if (!fp) return 0;
210
- const pFn = promisifyCallback(this, "onStreamOut", "OnPlayerStreamOut");
211
- return pFn(p, fp);
212
- });
213
-
214
- cbs.OnPlayerTakeDamage(
215
- (
216
- playerid: number,
217
- issuerid: number,
218
- amount: number,
219
- weaponid: enums.WeaponEnum,
220
- bodypart: enums.BodyPartsEnum
221
- ): number => {
222
- const p = this.findPlayerById(playerid);
223
- if (!p) return 0;
224
- if (issuerid === enums.InvalidEnum.PLAYER_ID) {
225
- const pFn = promisifyCallback(
226
- this,
227
- "onTakeDamage",
228
- "OnPlayerTakeDamage"
229
- );
230
- return pFn(p, issuerid, amount, weaponid, bodypart);
231
- }
232
- const i = this.findPlayerById(issuerid);
233
- if (!i) return 0;
234
- const pFn = promisifyCallback(
235
- this,
236
- "onTakeDamage",
237
- "OnPlayerTakeDamage"
238
- );
239
- return pFn(p, i, amount, weaponid, bodypart);
240
- }
241
- );
242
-
243
- /** 30 calls per second for a single player means a peak of 30,000 calls for 1000 players.
244
- * If there are 10 player event classes, that means there are 30,0000 calls per second.
245
- * By throttling down to 16.67 calls per second for a single player, performance should be optimized.
246
- */
247
- cbs.OnPlayerUpdate((playerid: number): number => {
248
- const p = this.findPlayerById(playerid);
249
- if (!p) return 0;
250
- if (!p.isNpc()) {
251
- const now = Date.now();
252
- if (p.isPaused) {
253
- p.isPaused = false;
254
- this.onResume && this.onResume(p, now - p.lastUpdateTick);
255
- }
256
- p.lastUpdateTick = now;
257
- PlayerEvent.fpsHeartbeat(p);
258
- }
259
- const pFn = promisifyCallback(this, "throttleUpdate", "OnPlayerUpdate");
260
- const res = pFn(p);
261
- if (res === undefined) return 0;
262
- return res;
263
- });
264
-
265
- cbs.OnPlayerInteriorChange(
266
- (
267
- playerid: number,
268
- newinteriorid: number,
269
- oldinteriorid: number
270
- ): number => {
271
- const p = this.findPlayerById(playerid);
272
- if (!p) return 0;
273
- const pFn = promisifyCallback(
274
- this,
275
- "onInteriorChange",
276
- "OnPlayerInteriorChange"
277
- );
278
- return pFn(p, newinteriorid, oldinteriorid);
279
- }
280
- );
281
-
282
- cbs.OnPlayerRequestDownload(
283
- (playerid: number, type: number, crc: number): number => {
284
- const p = this.findPlayerById(playerid);
285
- if (!p) return 0;
286
- const pFn = promisifyCallback(
287
- this,
288
- "onRequestDownload",
289
- "OnPlayerRequestDownload"
290
- );
291
- return pFn(p, type, crc);
292
- }
293
- );
294
-
295
- cbs.OnPlayerFinishedDownloading(
296
- (playerid: number, virtualworld: number): number => {
297
- const p = this.findPlayerById(playerid);
298
- if (!p) return 0;
299
- const pFn = promisifyCallback(
300
- this,
301
- "onFinishedDownloading",
302
- "OnPlayerFinishedDownloading"
303
- );
304
- return pFn(p, virtualworld);
305
- }
306
- );
307
- playerBus.emit(playerHooks.create, this.players);
308
- playerBus.on(playerHooks.pause, (player: P) => {
309
- player.isPaused = true;
310
- this.onPause && this.onPause(player, player.lastUpdateTick);
311
- });
312
-
313
- playerBus.on(playerHooks.setCommonProp, ({ player, prop, value }) => {
314
- Reflect.set(player, prop, value);
315
- this.players.set(player.id, player);
316
- });
317
- }
318
- findPlayerById(playerid: number) {
319
- return this.players.get(playerid);
320
- }
321
- getPlayersArr(): Array<P> {
322
- return [...this.players.values()];
323
- }
324
- getPlayersMap(): Map<number, P> {
325
- return this.players;
326
- }
327
- readonly throttleUpdate = throttle(
328
- (player: P) => this.onUpdate && this.onUpdate(player),
329
- 60
330
- );
331
- private static fpsHeartbeat = throttle((player: Player) => {
332
- if (!Player.isConnected(player.id)) return;
333
- const nowDrunkLevel = player.getDrunkLevel();
334
- if (nowDrunkLevel < 100) {
335
- player.setDrunkLevel(2000);
336
- player.lastDrunkLevel = 2000;
337
- player.lastFps = 0;
338
- return;
339
- }
340
- player.lastFps = player.lastDrunkLevel - nowDrunkLevel - 1;
341
- player.lastDrunkLevel = nowDrunkLevel;
342
- }, 1000);
343
-
344
- /**
345
- * Use eventBus to observe and subscribe to level 1 instructions,
346
- * support string and array pass, array used for alias.
347
- */
348
- readonly onCommandText = (
349
- name: TEventName,
350
- fn: TEventFunc<this, P> | TEventFunc<this, P>[]
351
- ): (() => void) => {
352
- return PlayerEvent.cmdBus.on(this, name, fn);
353
- };
354
-
355
- readonly offCommandText = (
356
- name: TEventName,
357
- fn: TEventFunc<this, P> | TEventFunc<this, P>[]
358
- ) => {
359
- PlayerEvent.cmdBus.off(this, name, fn);
360
- };
361
-
362
- private promiseCommand = async (
363
- p: P,
364
- cmd: RegExpMatchArray
365
- ): Promise<unknown> => {
366
- const fullCommand = cmd.join(" ");
367
- const firstLevel = cmd[0];
368
-
369
- const hasAnyRegistered = PlayerEvent.cmdBus.eventMap.get(firstLevel);
370
- if (!hasAnyRegistered && this.onCommandError) {
371
- this.onCommandError(p, fullCommand, ICmdErrInfo.notExist);
372
- return;
373
- }
374
-
375
- const hasInstanceFns = hasAnyRegistered?.get(this);
376
- if (!hasInstanceFns) return;
377
-
378
- let rFnRes =
379
- this.onCommandReceived && this.onCommandReceived(p, fullCommand);
380
-
381
- if (rFnRes !== undefined) {
382
- if (rFnRes instanceof Promise) rFnRes = await rFnRes;
383
- if (!rFnRes) return NOOP("OnPlayerCommandTextI18n");
384
- }
385
-
386
- // deliberately let the for loop not wait
387
- hasInstanceFns.forEach(async (fn) => {
388
- // CmdBus emit start
389
- let result = fn.call(this, p, ...cmd.slice(1));
390
- if (result instanceof Promise) result = await result;
391
- if (result === undefined || result === null) result = false;
392
- // CmdBus emit end
393
-
394
- if (result) {
395
- let pFnRes =
396
- this.onCommandPerformed && this.onCommandPerformed(p, fullCommand);
397
- if (pFnRes instanceof Promise) pFnRes = await pFnRes;
398
- if (!pFnRes) return NOOP("OnPlayerCommandTextI18n");
399
- return;
400
- }
401
-
402
- const pFn = promisifyCallback(
403
- this,
404
- "onCommandError",
405
- "OnPlayerCommandTextI18n"
406
- );
407
- pFn(p, fullCommand, ICmdErrInfo.rejected);
408
- });
409
- };
410
-
411
- onConnect?(player: P): TCommonCallback;
412
- onDisconnect?(player: P, reason: number): TCommonCallback;
413
- onText?(player: P, text: string): TCommonCallback;
414
- onCommandReceived?(player: P, command: string): TCommonCallback;
415
- onCommandPerformed?(player: P, command: string): TCommonCallback;
416
- onCommandError?(player: P, command: string, err: ICmdErr): TCommonCallback;
417
- onEnterExitModShop?(
418
- player: P,
419
- enterexit: number,
420
- interiorid: number
421
- ): TCommonCallback;
422
- onClickMap?(player: P, fX: number, fY: number, fZ: number): TCommonCallback;
423
- onClickPlayer?(player: P, clickedPlayer: P, source: number): TCommonCallback;
424
- onDeath?(
425
- player: P,
426
- killer: P | enums.InvalidEnum.PLAYER_ID,
427
- reason: number
428
- ): TCommonCallback;
429
- onGiveDamage?(
430
- player: P,
431
- damage: P,
432
- amount: number,
433
- weaponid: enums.WeaponEnum,
434
- bodypart: enums.BodyPartsEnum
435
- ): TCommonCallback;
436
- onKeyStateChange?(
437
- player: P,
438
- newkeys: enums.KeysEnum,
439
- oldkeys: enums.KeysEnum
440
- ): TCommonCallback;
441
- onRequestClass?(player: P, classid: number): TCommonCallback;
442
- onRequestSpawn?(player: P): TCommonCallback;
443
- onSpawn?(player: P): TCommonCallback;
444
- onStateChange?(
445
- player: P,
446
- newstate: enums.PlayerStateEnum,
447
- oldstate: enums.PlayerStateEnum
448
- ): TCommonCallback;
449
- onStreamIn?(player: P, forPlayer: P): TCommonCallback;
450
- onStreamOut?(player: P, forPlayer: P): TCommonCallback;
451
- onTakeDamage?(
452
- player: P,
453
- damage: P | enums.InvalidEnum.PLAYER_ID,
454
- amount: number,
455
- weaponid: enums.WeaponEnum,
456
- bodypart: enums.BodyPartsEnum
457
- ): TCommonCallback;
458
- onUpdate?(player: P): TCommonCallback;
459
- onInteriorChange?(
460
- player: P,
461
- newinteriorid: number,
462
- oldinteriorid: number
463
- ): TCommonCallback;
464
- onPause?(player: P, timestamp: number): TCommonCallback;
465
- onResume?(player: P, pauseMs: number): TCommonCallback;
466
- onRequestDownload?(player: P, type: number, crc: number): TCommonCallback;
467
- onFinishedDownloading?(player: P, virtualworld: number): TCommonCallback;
468
- }
@@ -1,31 +0,0 @@
1
- import type { IClientFuncQueue } from "@/interfaces";
2
- import { OnClientCheckResponse } from "@/wrapper/native/callbacks";
3
-
4
- export const ccWaitingQueue: Map<number, IClientFuncQueue> = new Map();
5
-
6
- export const delCCTask = (playerId: number, reject = false): boolean => {
7
- const task = ccWaitingQueue.get(playerId);
8
- if (!task) return false;
9
- if (reject)
10
- task.reject(
11
- "[Player]: An attempt to check the player client response timed out"
12
- );
13
- clearTimeout(task.timeout);
14
- ccWaitingQueue.delete(playerId);
15
- return true;
16
- };
17
-
18
- OnClientCheckResponse(
19
- (
20
- playerid: number,
21
- actionid: number,
22
- memaddr: number,
23
- retndata: number
24
- ): number => {
25
- const task = ccWaitingQueue.get(playerid);
26
- if (!task) return 0;
27
- clearTimeout(task.timeout);
28
- setTimeout(() => task.resolve({ actionid, memaddr, retndata }));
29
- return 1;
30
- }
31
- );
@@ -1,143 +0,0 @@
1
- import { DialogStylesEnum } from "@/enums";
2
- import { OnDialogResponse, ShowPlayerDialog } from "@/utils/helperUtils";
3
- import { HidePlayerDialog } from "@infernus/wrapper";
4
- import type { Player } from "../../player/basePlayer";
5
- import { I18n } from "../../i18n";
6
- import type {
7
- IDialog,
8
- IDialogFuncQueue,
9
- IDialogResRaw,
10
- IDialogResResult,
11
- } from "@/interfaces";
12
- import { logger } from "@/logger";
13
-
14
- /* You don't need to define the dialog id,
15
- but you need to pay attention to the fact that you shouldn't repeatedly new the dialog in the function,
16
- instead you should call the open method.
17
-
18
- If you need to change the value dynamically, you should do it by setter method
19
- */
20
-
21
- OnDialogResponse(
22
- (
23
- playerid: number,
24
- dialogid: number,
25
- response: number,
26
- listitem: number,
27
- inputbuf: number[]
28
- ): number => {
29
- const callback = Dialog.waitingQueue.get(playerid);
30
- if (!callback) return 0;
31
- // bug: does not trigger resolve of promise
32
- // fix: it only works if you put it in an event loop
33
- setTimeout(() => callback.resolve({ response, listitem, inputbuf }));
34
- return 1;
35
- }
36
- );
37
-
38
- export class Dialog<T extends Player> {
39
- private id: number;
40
- private static CREATED_ID = -1;
41
- private static MAX_DIALOGID = 32767;
42
- private dialog: IDialog;
43
- static waitingQueue: Map<number, IDialogFuncQueue> = new Map();
44
-
45
- constructor(
46
- dialog: IDialog = {
47
- style: DialogStylesEnum.MSGBOX,
48
- caption: "",
49
- info: "",
50
- button1: "",
51
- button2: "",
52
- }
53
- ) {
54
- if (Dialog.CREATED_ID < Dialog.MAX_DIALOGID) {
55
- Dialog.CREATED_ID++;
56
- } else {
57
- logger.warn("[Dialog]: The maximum number of dialogs is reached");
58
- }
59
- this.dialog = dialog;
60
- this.id = Dialog.CREATED_ID;
61
- }
62
-
63
- // #region
64
- get style(): DialogStylesEnum | undefined {
65
- return this.dialog.style;
66
- }
67
- set style(v: DialogStylesEnum | undefined) {
68
- this.dialog.style = v;
69
- }
70
-
71
- get caption(): string | undefined {
72
- return this.dialog.caption;
73
- }
74
- set caption(v: string | undefined) {
75
- this.dialog.caption = v;
76
- }
77
-
78
- get info(): string | undefined {
79
- return this.dialog.info;
80
- }
81
- set info(v: string | undefined) {
82
- this.dialog.info = v;
83
- }
84
-
85
- get button1(): string | undefined {
86
- return this.dialog.button1;
87
- }
88
- set button1(v: string | undefined) {
89
- this.dialog.button1 = v;
90
- }
91
-
92
- get button2(): string | undefined {
93
- return this.dialog.button2;
94
- }
95
- set button2(v: string | undefined) {
96
- this.dialog.button2 = v;
97
- }
98
-
99
- //#endregion
100
-
101
- private static delDialogTask<T extends Player>(
102
- player: T,
103
- reject = false
104
- ): boolean {
105
- // if player disconnect and still await response
106
- // should stop promise waiting
107
- const task = Dialog.waitingQueue.get(player.id);
108
- if (!task) return false;
109
- if (reject)
110
- task.reject(
111
- "[Dialog]: player timeout does not respond or second request show dialog"
112
- );
113
- Dialog.waitingQueue.delete(player.id);
114
- return true;
115
- }
116
-
117
- show(player: T) {
118
- return new Promise<IDialogResRaw>((resolve, reject) => {
119
- Dialog.close(player);
120
- Dialog.waitingQueue.set(player.id, { resolve, reject });
121
- ShowPlayerDialog(player, this.id, this.dialog);
122
- })
123
- .then((DialogRes: IDialogResRaw) => {
124
- const { response, listitem } = DialogRes;
125
- const inputtext = I18n.decodeFromBuf(
126
- DialogRes.inputbuf,
127
- player.charset
128
- );
129
- return Promise.resolve({
130
- response,
131
- listitem,
132
- inputtext,
133
- } as IDialogResResult);
134
- })
135
- .catch((e) => Promise.reject(e))
136
- .finally(() => Dialog.delDialogTask(player));
137
- }
138
-
139
- static close<T extends Player>(player: T) {
140
- Dialog.delDialogTask(player, true);
141
- HidePlayerDialog(player.id);
142
- }
143
- }