@amxts/core 0.2.4 → 0.3.0

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 (71) hide show
  1. package/README.md +5 -5
  2. package/README.ru.md +5 -5
  3. package/as/amxts.d.ts +13 -3
  4. package/as/entities.ts +571 -501
  5. package/as/events.ts +3323 -557
  6. package/as/facade.ts +3079 -718
  7. package/as/fetch.ts +2 -2
  8. package/as/fs.ts +352 -59
  9. package/as/hlds.ts +121 -120
  10. package/as/hooks.ts +10585 -5177
  11. package/as/lib/check.ts +3 -2
  12. package/as/natives.ts +856 -1272
  13. package/as/promise.ts +37 -27
  14. package/as/vector.ts +94 -14
  15. package/includes/order.txt +17 -19
  16. package/node_modules/assemblyscript/std/assembly/index.d.ts +1 -1
  17. package/package.json +9 -6
  18. package/runtime/deps/assemblyscript/dist/asc.js +136 -42
  19. package/runtime/deps/assemblyscript/dist/assemblyscript.js +141 -141
  20. package/runtime/licenses/README.md +9 -7
  21. package/runtime/licenses/ReGameDLL-LICENSE +21 -0
  22. package/runtime/licenses/ReHLDS-LICENSE +21 -0
  23. package/runtime/licenses/zlib-LICENSE +22 -0
  24. package/runtime/natives.txt +618 -523
  25. package/runtime/patches/README.md +87 -1
  26. package/runtime/patches/assemblyscript-0.28.20-amxts.patch +4838 -416
  27. package/runtime/patches/wamr-2.4.5-amxts.patch +417 -5
  28. package/scripts/auto-imports.ts +1 -1
  29. package/scripts/build-identity.ts +102 -65
  30. package/scripts/build-wasm.ts +12 -12
  31. package/scripts/check.ts +4 -1
  32. package/scripts/client-messages.ts +73 -1
  33. package/scripts/compile-cache.ts +11 -8
  34. package/scripts/compile-pool.ts +6 -3
  35. package/scripts/compile-worker.ts +23 -23
  36. package/scripts/compile.ts +142 -19
  37. package/scripts/docs/as/amxts.ts +10 -4
  38. package/scripts/docs/as/facade.ts +1779 -275
  39. package/scripts/docs/as/fetch.ts +2 -2
  40. package/scripts/docs/as/fs.ts +190 -6
  41. package/scripts/docs/as/vector.ts +81 -0
  42. package/scripts/docs/entities.ts +12 -0
  43. package/scripts/docs/events.ts +49 -13
  44. package/scripts/docs/game.ts +6 -0
  45. package/scripts/docs/messages.ts +10 -1
  46. package/scripts/hlds-events.ts +11 -11
  47. package/scripts/includes.ts +3 -4
  48. package/scripts/leaf-natives.ts +84 -0
  49. package/scripts/player-fields.ts +1 -1
  50. package/scripts/plugin-natives.ts +1 -1
  51. package/scripts/prebuilt.ts +41 -10
  52. package/scripts/project.ts +2 -3
  53. package/scripts/reapi-events.ts +9 -9
  54. package/scripts/server-env.ts +145 -0
  55. package/scripts/shared-modules.ts +23 -7
  56. package/scripts/system.ts +1 -1
  57. package/scripts/tracked-fs.ts +11 -2
  58. package/scripts/typed-commands.ts +153 -15
  59. package/scripts/upgrade-calls.ts +225 -0
  60. package/scripts/upgrade-names.ts +1 -4
  61. package/scripts/upgrade.ts +26 -11
  62. package/src/cli-api.mjs +3 -2
  63. package/src/system.mjs +21 -11
  64. package/src/testing/compile.ts +31 -8
  65. package/src/testing/coroutines.ts +0 -10
  66. package/src/testing/memory.ts +89 -2
  67. package/src/testing/natives.ts +67 -30
  68. package/src/testing/server.ts +1094 -155
  69. package/src/testing/tables.ts +23 -6
  70. package/src/typecheck.mjs +110 -0
  71. package/runtime/licenses/Bun-LICENSE.md +0 -84
package/as/events.ts CHANGED
@@ -1,20 +1,21 @@
1
- // GENERATED by scripts/generate-host.ts — do not edit
2
- // Source: includes/*.inc, through the forwards the host plugin relays
1
+ // GENERATED by scripts/generate-image.ts — do not edit
2
+ // Source: includes/*.inc, the forwards the module raises
3
3
  //
4
- // The events a server raises, one per forward the host plugin relays:
4
+ // The events a server raises, one per forward the module raises:
5
5
  //
6
- // server.addEventListener("putInServer", (event) => print(event.player, "Welcome!"));
6
+ // server.addEventListener("putInServer", (event) => event.player.print("Welcome!"));
7
7
  //
8
8
  // ServerEventMap is what an editor reads - the event's name to its type, as
9
9
  // the DOM's HTMLElementEventMap - and the compiler reads the same map through
10
10
  // a patch (runtime/patches: `K extends keyof M` and `M[K]`), so an untyped
11
11
  // `(event) => ...` gets the event's type. Underneath, each event keeps its
12
- // listeners in an array and relays its forward while the array has any.
13
- import { Client, ClientMessage, FadeDirection, Player, PlayerChangeEvent, StatusIconState, Team, VariantName, __forwardNumbers, __nativeCell, __nativeString, __nativeVector, __off } from "./facade";
12
+ // listeners in an array and listens to its forward while the array has any.
13
+ import { Client, ClientMessage, FadeDirection, Player, PlayerChangeEvent, __MessageOut, StatusIconState, Team, VariantName, __Listeners, __ServerEvent, __commandArgs, __commandName, __commandText, __forwardNumbers, __logArgs, __logText, __nativeCell, handled, __nativeString, __nativeVector, __off, __onDirect, __playbackBlock, __playbackTo, __playerOf } from "./facade";
14
14
  import { Vector } from "./vector";
15
15
  import { WeaponKind, weaponKindOf } from "./entities";
16
16
  import { DAMAGE, Damage, HIDE_HUD, HideHud, SCORE_STATUS, ScoreStatus } from "./flags";
17
17
  import { VguiMenu } from "./hooks";
18
+ import { emessage_end, ewrite_angle_f, ewrite_byte, ewrite_char, ewrite_coord_f, ewrite_long, ewrite_short, ewrite_string } from "./natives";
18
19
 
19
20
  // @ts-ignore: decorator
20
21
  @external("env", "on")
@@ -30,22 +31,6 @@ declare function _on(event: string, fn: i32, shape: i32): void;
30
31
  export class PluginInitEvent {
31
32
  }
32
33
 
33
- /**
34
- * An admin paused this plugin.
35
- *
36
- * Pawn: `plugin_pause()`
37
- */
38
- export class PluginPauseEvent {
39
- }
40
-
41
- /**
42
- * An admin resumed this plugin.
43
- *
44
- * Pawn: `plugin_unpause()`
45
- */
46
- export class PluginUnpauseEvent {
47
- }
48
-
49
34
  /**
50
35
  * The server is about to change the map.
51
36
  *
@@ -54,16 +39,31 @@ export class PluginUnpauseEvent {
54
39
  *
55
40
  * Pawn: `server_changelevel(map[])`
56
41
  */
57
- export class ServerChangelevelEvent {
42
+ export class ServerChangelevelEvent extends __ServerEvent {
43
+ private __map: string | null = null;
44
+
58
45
  /**
59
46
  * The map the server changes to, e.g. `"de_dust2"`.
60
47
  *
61
48
  * Pawn: `map[]`
62
49
  */
63
- map: string;
50
+ get map(): string {
51
+ return this.__kept ? this.__map! : __nativeString(0);
52
+ }
64
53
 
65
- constructor(map: string) {
66
- this.map = map;
54
+ set map(value: string) {
55
+ this.__keep();
56
+ this.__map = value;
57
+ }
58
+
59
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
60
+ __keep(): void {
61
+ if (this.__kept) return;
62
+ this.__map = __nativeString(0);
63
+ this.__kept = true;
64
+ if (changeLevelView != this) return;
65
+ changeLevelView = null;
66
+ changeLevelDirect();
67
67
  }
68
68
  }
69
69
 
@@ -78,7 +78,7 @@ export class PluginCfgEvent {
78
78
  }
79
79
 
80
80
  /**
81
- * The map is ending or the server is shutting down: save what has to survive.
81
+ * The plugin stops - the map ends, the server shuts down, or `amxts_reload`/`amxts_unload` stops it: save what has to survive.
82
82
  *
83
83
  * Note: The plugin is required to manually free Handles it has acquired, such as those from dynamic data structures. Failing to do that will result in the plugin and AMXX leaking memory.
84
84
  *
@@ -88,13 +88,59 @@ export class PluginEndEvent {
88
88
  }
89
89
 
90
90
  /**
91
- * Called when a message is about to be logged.
91
+ * A line the game writes to its log - a round's end, a kill, a bomb planted: `event.text` whole, `event.args` its parts.
92
92
  *
93
93
  * Note: Message data and information can be retrieved using the read_log* set of functions.
94
94
  *
95
- * Pawn: `plugin_log()`
95
+ * Pawn: `plugin_log(read_logdata, read_logargv)`
96
+ *
97
+ * @example
98
+ * server.addEventListener("log", (event) => {
99
+ * if (event.text.startsWith("World triggered")) console.log(event.args[1]);
100
+ * });
96
101
  */
97
- export class PluginLogEvent {
102
+ export class PluginLogEvent extends __ServerEvent {
103
+ private __text: string | null = null;
104
+ private __args: string[] | null = null;
105
+
106
+ /**
107
+ * The line as the game logs it, without the date: `World triggered "Round_Start"`.
108
+ *
109
+ * Pawn: `read_logdata`
110
+ */
111
+ get text(): string {
112
+ return this.__kept ? this.__text! : __logText();
113
+ }
114
+
115
+ set text(value: string) {
116
+ this.__keep();
117
+ this.__text = value;
118
+ }
119
+
120
+ /**
121
+ * The line in parts, as AMX Mod X splits it: a quoted text, a text in parentheses and the words between, each one part - `World triggered "Round_Draw"` is `["World triggered", "Round_Draw"]`.
122
+ *
123
+ * Pawn: `read_logargv`
124
+ */
125
+ get args(): string[] {
126
+ return this.__kept ? this.__args! : __logArgs();
127
+ }
128
+
129
+ set args(value: string[]) {
130
+ this.__keep();
131
+ this.__args = value;
132
+ }
133
+
134
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
135
+ __keep(): void {
136
+ if (this.__kept) return;
137
+ this.__text = __logText();
138
+ this.__args = __logArgs();
139
+ this.__kept = true;
140
+ if (logView != this) return;
141
+ logView = null;
142
+ logDirect();
143
+ }
98
144
  }
99
145
 
100
146
  /**
@@ -112,16 +158,31 @@ export class PluginPrecacheEvent {
112
158
  *
113
159
  * Pawn: `client_infochanged(id)`
114
160
  */
115
- export class ClientInfochangedEvent {
161
+ export class ClientInfochangedEvent extends __ServerEvent {
162
+ private __player: Player | null = null;
163
+
116
164
  /**
117
165
  * The player the event is about.
118
166
  *
119
167
  * Pawn: `id`
120
168
  */
121
- player: Player;
169
+ get player(): Player {
170
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
171
+ }
172
+
173
+ set player(value: Player) {
174
+ this.__keep();
175
+ this.__player = value;
176
+ }
122
177
 
123
- constructor(player: Player) {
124
- this.player = player;
178
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
179
+ __keep(): void {
180
+ if (this.__kept) return;
181
+ this.__player = __playerOf(__nativeCell(0));
182
+ this.__kept = true;
183
+ if (clientInfochangedView != this) return;
184
+ clientInfochangedView = null;
185
+ clientInfochangedDirect();
125
186
  }
126
187
  }
127
188
 
@@ -132,16 +193,31 @@ export class ClientInfochangedEvent {
132
193
  *
133
194
  * Pawn: `client_connect(id)`
134
195
  */
135
- export class ClientConnectEvent {
196
+ export class ClientConnectEvent extends __ServerEvent {
197
+ private __player: Client | null = null;
198
+
136
199
  /**
137
200
  * The player the event is about.
138
201
  *
139
202
  * Pawn: `id`
140
203
  */
141
- player: Client;
204
+ get player(): Client {
205
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
206
+ }
207
+
208
+ set player(value: Client) {
209
+ this.__keep();
210
+ this.__player = value;
211
+ }
142
212
 
143
- constructor(player: Client) {
144
- this.player = player;
213
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
214
+ __keep(): void {
215
+ if (this.__kept) return;
216
+ this.__player = __playerOf(__nativeCell(0));
217
+ this.__kept = true;
218
+ if (connectView != this) return;
219
+ connectView = null;
220
+ connectDirect();
145
221
  }
146
222
  }
147
223
 
@@ -152,37 +228,79 @@ export class ClientConnectEvent {
152
228
  *
153
229
  * Pawn: `client_connectex(id, name[], ip[], reason[128])`
154
230
  */
155
- export class ClientConnectexEvent {
231
+ export class ClientConnectexEvent extends __ServerEvent {
232
+ private __player: Client | null = null;
233
+ private __name: string | null = null;
234
+ private __ip: string | null = null;
235
+ private __reason: string | null = null;
236
+
156
237
  /**
157
238
  * The player the event is about.
158
239
  *
159
240
  * Pawn: `id`
160
241
  */
161
- player: Client;
242
+ get player(): Client {
243
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
244
+ }
245
+
246
+ set player(value: Client) {
247
+ this.__keep();
248
+ this.__player = value;
249
+ }
250
+
162
251
  /**
163
252
  * The name the player connects with.
164
253
  *
165
254
  * Pawn: `name[]`
166
255
  */
167
- name: string;
256
+ get name(): string {
257
+ return this.__kept ? this.__name! : __nativeString(1);
258
+ }
259
+
260
+ set name(value: string) {
261
+ this.__keep();
262
+ this.__name = value;
263
+ }
264
+
168
265
  /**
169
266
  * The player's address with the port, e.g. `"192.168.0.5:27005"`.
170
267
  *
171
268
  * Pawn: `ip[]`
172
269
  */
173
- ip: string;
270
+ get ip(): string {
271
+ return this.__kept ? this.__ip! : __nativeString(2);
272
+ }
273
+
274
+ set ip(value: string) {
275
+ this.__keep();
276
+ this.__ip = value;
277
+ }
278
+
174
279
  /**
175
280
  * The message the player sees if he is turned away.
176
281
  *
177
282
  * Pawn: `reason[128]`
178
283
  */
179
- reason: string;
284
+ get reason(): string {
285
+ return this.__kept ? this.__reason! : __nativeString(3);
286
+ }
287
+
288
+ set reason(value: string) {
289
+ this.__keep();
290
+ this.__reason = value;
291
+ }
180
292
 
181
- constructor(player: Client, name: string, ip: string, reason: string) {
182
- this.player = player;
183
- this.name = name;
184
- this.ip = ip;
185
- this.reason = reason;
293
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
294
+ __keep(): void {
295
+ if (this.__kept) return;
296
+ this.__player = __playerOf(__nativeCell(0));
297
+ this.__name = __nativeString(1);
298
+ this.__ip = __nativeString(2);
299
+ this.__reason = __nativeString(3);
300
+ this.__kept = true;
301
+ if (connectAttemptView != this) return;
302
+ connectAttemptView = null;
303
+ connectAttemptDirect();
186
304
  }
187
305
  }
188
306
 
@@ -193,23 +311,47 @@ export class ClientConnectexEvent {
193
311
  *
194
312
  * Pawn: `client_authorized(id, authid[])`
195
313
  */
196
- export class ClientAuthorizedEvent {
314
+ export class ClientAuthorizedEvent extends __ServerEvent {
315
+ private __player: Client | null = null;
316
+ private __steamId: string | null = null;
317
+
197
318
  /**
198
319
  * The player the event is about.
199
320
  *
200
321
  * Pawn: `id`
201
322
  */
202
- player: Client;
323
+ get player(): Client {
324
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
325
+ }
326
+
327
+ set player(value: Client) {
328
+ this.__keep();
329
+ this.__player = value;
330
+ }
331
+
203
332
  /**
204
333
  * The player's SteamID, e.g. `"STEAM_0:1:12345"`. A bot has `"BOT"`, HLTV has `"HLTV"`; on a LAN server it is `"STEAM_ID_LAN"`. With Reunion a game without Steam gets one made from its key: `"STEAM_..."` or `"VALVE_..."`, as the server's Reunion settings say.
205
334
  *
206
335
  * Pawn: `authid[]`
207
336
  */
208
- steamId: string;
337
+ get steamId(): string {
338
+ return this.__kept ? this.__steamId! : __nativeString(1);
339
+ }
340
+
341
+ set steamId(value: string) {
342
+ this.__keep();
343
+ this.__steamId = value;
344
+ }
209
345
 
210
- constructor(player: Client, steamId: string) {
211
- this.player = player;
212
- this.steamId = steamId;
346
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
347
+ __keep(): void {
348
+ if (this.__kept) return;
349
+ this.__player = __playerOf(__nativeCell(0));
350
+ this.__steamId = __nativeString(1);
351
+ this.__kept = true;
352
+ if (authorizedView != this) return;
353
+ authorizedView = null;
354
+ authorizedDirect();
213
355
  }
214
356
  }
215
357
 
@@ -225,30 +367,63 @@ export class ClientAuthorizedEvent {
225
367
  * console.log(`${event.player.name} left: ${event.reason}`);
226
368
  * });
227
369
  */
228
- export class ClientDisconnectedEvent {
370
+ export class ClientDisconnectedEvent extends __ServerEvent {
371
+ private __player: Player | null = null;
372
+ private __dropped: boolean = false;
373
+ private __reason: string | null = null;
374
+
229
375
  /**
230
376
  * The player the event is about.
231
377
  *
232
378
  * Pawn: `id`
233
379
  */
234
- player: Player;
380
+ get player(): Player {
381
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
382
+ }
383
+
384
+ set player(value: Player) {
385
+ this.__keep();
386
+ this.__player = value;
387
+ }
388
+
235
389
  /**
236
390
  * `true` when the server dropped the player (kick, timeout) rather than he left.
237
391
  *
238
392
  * Pawn: `bool:drop`
239
393
  */
240
- dropped: boolean;
394
+ get dropped(): boolean {
395
+ return this.__kept ? this.__dropped : __nativeCell(1) != 0;
396
+ }
397
+
398
+ set dropped(value: boolean) {
399
+ this.__keep();
400
+ this.__dropped = value;
401
+ }
402
+
241
403
  /**
242
404
  * The reason the server gives for the leave; empty when the player just quit.
243
405
  *
244
406
  * Pawn: `message[]`
245
407
  */
246
- reason: string;
408
+ get reason(): string {
409
+ return this.__kept ? this.__reason! : __nativeString(2);
410
+ }
411
+
412
+ set reason(value: string) {
413
+ this.__keep();
414
+ this.__reason = value;
415
+ }
247
416
 
248
- constructor(player: Player, dropped: boolean, reason: string) {
249
- this.player = player;
250
- this.dropped = dropped;
251
- this.reason = reason;
417
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
418
+ __keep(): void {
419
+ if (this.__kept) return;
420
+ this.__player = __playerOf(__nativeCell(0));
421
+ this.__dropped = __nativeCell(1) != 0;
422
+ this.__reason = __nativeString(2);
423
+ this.__kept = true;
424
+ if (disconnectedView != this) return;
425
+ disconnectedView = null;
426
+ disconnectedDirect();
252
427
  }
253
428
  }
254
429
 
@@ -259,50 +434,158 @@ export class ClientDisconnectedEvent {
259
434
  *
260
435
  * Pawn: `client_remove(id, bool:drop, message[])`
261
436
  */
262
- export class ClientRemoveEvent {
437
+ export class ClientRemoveEvent extends __ServerEvent {
438
+ private __player: Player | null = null;
439
+ private __dropped: boolean = false;
440
+ private __reason: string | null = null;
441
+
263
442
  /**
264
443
  * The player the event is about.
265
444
  *
266
445
  * Pawn: `id`
267
446
  */
268
- player: Player;
447
+ get player(): Player {
448
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
449
+ }
450
+
451
+ set player(value: Player) {
452
+ this.__keep();
453
+ this.__player = value;
454
+ }
455
+
269
456
  /**
270
457
  * `true` when the server dropped the player.
271
458
  *
272
459
  * Pawn: `bool:drop`
273
460
  */
274
- dropped: boolean;
461
+ get dropped(): boolean {
462
+ return this.__kept ? this.__dropped : __nativeCell(1) != 0;
463
+ }
464
+
465
+ set dropped(value: boolean) {
466
+ this.__keep();
467
+ this.__dropped = value;
468
+ }
469
+
275
470
  /**
276
471
  * The reason the player left.
277
472
  *
278
473
  * Pawn: `message[]`
279
474
  */
280
- reason: string;
475
+ get reason(): string {
476
+ return this.__kept ? this.__reason! : __nativeString(2);
477
+ }
478
+
479
+ set reason(value: string) {
480
+ this.__keep();
481
+ this.__reason = value;
482
+ }
281
483
 
282
- constructor(player: Player, dropped: boolean, reason: string) {
283
- this.player = player;
284
- this.dropped = dropped;
285
- this.reason = reason;
484
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
485
+ __keep(): void {
486
+ if (this.__kept) return;
487
+ this.__player = __playerOf(__nativeCell(0));
488
+ this.__dropped = __nativeCell(1) != 0;
489
+ this.__reason = __nativeString(2);
490
+ this.__kept = true;
491
+ if (removeView != this) return;
492
+ removeView = null;
493
+ removeDirect();
286
494
  }
287
495
  }
288
496
 
289
497
  /**
290
- * A player sent a console command. For one command, `server.addCommand("name", handler)` is simpler.
498
+ * A player sent a console command - a chat line is `say` or `say_team`. For one command, `server.addCommand("name", handler)` is simpler.
291
499
  *
292
- * Note: The command and its arguments can be read using the read_arg* set of functions.
500
+ * Pawn: `client_command(id, read_argv(0), read_argv, read_args)`
293
501
  *
294
- * Pawn: `client_command(id)`
502
+ * @example
503
+ * server.addEventListener("command", (event) => {
504
+ * if (event.command == "say" && event.args[0] == "/cp") checkpoint(event.player);
505
+ * });
295
506
  */
296
- export class ClientCommandEvent {
507
+ export class ClientCommandEvent extends __ServerEvent {
508
+ private __player: Player | null = null;
509
+ private __command: string | null = null;
510
+ private __args: string[] | null = null;
511
+ private __text: string | null = null;
512
+
297
513
  /**
298
514
  * The player the event is about.
299
515
  *
300
516
  * Pawn: `id`
301
517
  */
302
- player: Player;
518
+ get player(): Player {
519
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
520
+ }
521
+
522
+ set player(value: Player) {
523
+ this.__keep();
524
+ this.__player = value;
525
+ }
526
+
527
+ /**
528
+ * The command's name, as typed, e.g. `"say"`, `"say_team"`, `"buy"`.
529
+ *
530
+ * Pawn: `read_argv(0)`
531
+ */
532
+ get command(): string {
533
+ return this.__kept ? this.__command! : __commandName();
534
+ }
535
+
536
+ set command(value: string) {
537
+ this.__keep();
538
+ this.__command = value;
539
+ }
540
+
541
+ /**
542
+ * The command's words after its name; for `say` and `say_team`, the words of the chat line - `say /cp now` is `["/cp", "now"]`.
543
+ *
544
+ * Pawn: `read_argv`
545
+ */
546
+ get args(): string[] {
547
+ return this.__kept ? this.__args! : __commandArgs();
548
+ }
549
+
550
+ set args(value: string[]) {
551
+ this.__keep();
552
+ this.__args = value;
553
+ }
554
+
555
+ /**
556
+ * The command's text after its name, as one line; for `say` and `say_team`, the chat line without its quotes.
557
+ *
558
+ * Pawn: `read_args`
559
+ */
560
+ get text(): string {
561
+ return this.__kept ? this.__text! : __commandText();
562
+ }
563
+
564
+ set text(value: string) {
565
+ this.__keep();
566
+ this.__text = value;
567
+ }
303
568
 
304
- constructor(player: Player) {
305
- this.player = player;
569
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
570
+ __keep(): void {
571
+ if (this.__kept) return;
572
+ this.__player = __playerOf(__nativeCell(0));
573
+ this.__command = __commandName();
574
+ this.__args = __commandArgs();
575
+ this.__text = __commandText();
576
+ this.__kept = true;
577
+ if (commandView != this) return;
578
+ commandView = null;
579
+ commandDirect();
580
+ }
581
+
582
+ /**
583
+ * Stops the command: the game does not run it - a chat line is not said - and no plugin's `server.addCommand` hears it. The other listeners of `"command"` still do.
584
+ *
585
+ * Pawn: `return PLUGIN_HANDLED`
586
+ */
587
+ preventDefault(): void {
588
+ handled();
306
589
  }
307
590
  }
308
591
 
@@ -315,19 +598,34 @@ export class ClientCommandEvent {
315
598
  *
316
599
  * @example
317
600
  * server.addEventListener("putInServer", (event) => {
318
- * print(event.player, "Welcome!");
601
+ * event.player.print("Welcome!");
319
602
  * });
320
603
  */
321
- export class ClientPutinserverEvent {
604
+ export class ClientPutinserverEvent extends __ServerEvent {
605
+ private __player: Client | null = null;
606
+
322
607
  /**
323
608
  * The player the event is about.
324
609
  *
325
610
  * Pawn: `id`
326
611
  */
327
- player: Client;
612
+ get player(): Client {
613
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
614
+ }
615
+
616
+ set player(value: Client) {
617
+ this.__keep();
618
+ this.__player = value;
619
+ }
328
620
 
329
- constructor(player: Client) {
330
- this.player = player;
621
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
622
+ __keep(): void {
623
+ if (this.__kept) return;
624
+ this.__player = __playerOf(__nativeCell(0));
625
+ this.__kept = true;
626
+ if (putInServerView != this) return;
627
+ putInServerView = null;
628
+ putInServerDirect();
331
629
  }
332
630
  }
333
631
 
@@ -336,39 +634,64 @@ export class ClientPutinserverEvent {
336
634
  *
337
635
  * Pawn: `inconsistent_file(id, filename[], reason[64])`
338
636
  */
339
- export class InconsistentFileEvent {
637
+ export class InconsistentFileEvent extends __ServerEvent {
638
+ private __player: Player | null = null;
639
+ private __file: string | null = null;
640
+ private __reason: string | null = null;
641
+
340
642
  /**
341
643
  * The player the event is about.
342
644
  *
343
645
  * Pawn: `id`
344
646
  */
345
- player: Player;
647
+ get player(): Player {
648
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
649
+ }
650
+
651
+ set player(value: Player) {
652
+ this.__keep();
653
+ this.__player = value;
654
+ }
655
+
346
656
  /**
347
657
  * Detected file
348
658
  *
349
659
  * Pawn: `filename[]`
350
660
  */
351
- file: string;
661
+ get file(): string {
662
+ return this.__kept ? this.__file! : __nativeString(1);
663
+ }
664
+
665
+ set file(value: string) {
666
+ this.__keep();
667
+ this.__file = value;
668
+ }
669
+
352
670
  /**
353
671
  * Buffer storing the disconnect reason (can be overwritten)
354
672
  *
355
673
  * Pawn: `reason[64]`
356
674
  */
357
- reason: string;
675
+ get reason(): string {
676
+ return this.__kept ? this.__reason! : __nativeString(2);
677
+ }
358
678
 
359
- constructor(player: Player, file: string, reason: string) {
360
- this.player = player;
361
- this.file = file;
362
- this.reason = reason;
679
+ set reason(value: string) {
680
+ this.__keep();
681
+ this.__reason = value;
363
682
  }
364
- }
365
683
 
366
- /**
367
- * Allows plugins to declare module dependencies using require_module()
368
- *
369
- * Pawn: `plugin_modules()`
370
- */
371
- export class PluginModulesEvent {
684
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
685
+ __keep(): void {
686
+ if (this.__kept) return;
687
+ this.__player = __playerOf(__nativeCell(0));
688
+ this.__file = __nativeString(1);
689
+ this.__reason = __nativeString(2);
690
+ this.__kept = true;
691
+ if (inconsistentFileView != this) return;
692
+ inconsistentFileView = null;
693
+ inconsistentFileDirect();
694
+ }
372
695
  }
373
696
 
374
697
  /**
@@ -399,23 +722,47 @@ export class OnAutoConfigsBufferedEvent {
399
722
  *
400
723
  * Pawn: `CS_InternalCommand(id, cmd[])`
401
724
  */
402
- export class CS_InternalCommandEvent {
725
+ export class CS_InternalCommandEvent extends __ServerEvent {
726
+ private __player: Player | null = null;
727
+ private __command: string | null = null;
728
+
403
729
  /**
404
730
  * The player the event is about.
405
731
  *
406
732
  * Pawn: `id`
407
733
  */
408
- player: Player;
734
+ get player(): Player {
735
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
736
+ }
737
+
738
+ set player(value: Player) {
739
+ this.__keep();
740
+ this.__player = value;
741
+ }
742
+
409
743
  /**
410
744
  * Command string
411
745
  *
412
746
  * Pawn: `cmd[]`
413
747
  */
414
- command: string;
748
+ get command(): string {
749
+ return this.__kept ? this.__command! : __nativeString(1);
750
+ }
751
+
752
+ set command(value: string) {
753
+ this.__keep();
754
+ this.__command = value;
755
+ }
415
756
 
416
- constructor(player: Player, command: string) {
417
- this.player = player;
418
- this.command = command;
757
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
758
+ __keep(): void {
759
+ if (this.__kept) return;
760
+ this.__player = __playerOf(__nativeCell(0));
761
+ this.__command = __nativeString(1);
762
+ this.__kept = true;
763
+ if (internalCommandView != this) return;
764
+ internalCommandView = null;
765
+ internalCommandDirect();
419
766
  }
420
767
  }
421
768
 
@@ -427,23 +774,47 @@ export class CS_InternalCommandEvent {
427
774
  *
428
775
  * Pawn: `CS_OnBuyAttempt(index, item)`
429
776
  */
430
- export class CS_OnBuyAttemptEvent {
777
+ export class CS_OnBuyAttemptEvent extends __ServerEvent {
778
+ private __player: Player | null = null;
779
+ private __item: number = 0;
780
+
431
781
  /**
432
782
  * The player the event is about.
433
783
  *
434
784
  * Pawn: `index`
435
785
  */
436
- player: Player;
786
+ get player(): Player {
787
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
788
+ }
789
+
790
+ set player(value: Player) {
791
+ this.__keep();
792
+ this.__player = value;
793
+ }
794
+
437
795
  /**
438
796
  * Item id
439
797
  *
440
798
  * Pawn: `item`
441
799
  */
442
- item: number;
800
+ get item(): number {
801
+ return this.__kept ? this.__item : <f64>__nativeCell(1);
802
+ }
803
+
804
+ set item(value: number) {
805
+ this.__keep();
806
+ this.__item = value;
807
+ }
443
808
 
444
- constructor(player: Player, item: number) {
445
- this.player = player;
446
- this.item = item;
809
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
810
+ __keep(): void {
811
+ if (this.__kept) return;
812
+ this.__player = __playerOf(__nativeCell(0));
813
+ this.__item = <f64>__nativeCell(1);
814
+ this.__kept = true;
815
+ if (CS_OnBuyAttemptView != this) return;
816
+ CS_OnBuyAttemptView = null;
817
+ CS_OnBuyAttemptDirect();
447
818
  }
448
819
  }
449
820
 
@@ -455,23 +826,47 @@ export class CS_OnBuyAttemptEvent {
455
826
  *
456
827
  * Pawn: `CS_OnBuy(index, item)`
457
828
  */
458
- export class CS_OnBuyEvent {
829
+ export class CS_OnBuyEvent extends __ServerEvent {
830
+ private __player: Player | null = null;
831
+ private __item: number = 0;
832
+
459
833
  /**
460
834
  * The player the event is about.
461
835
  *
462
836
  * Pawn: `index`
463
837
  */
464
- player: Player;
838
+ get player(): Player {
839
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
840
+ }
841
+
842
+ set player(value: Player) {
843
+ this.__keep();
844
+ this.__player = value;
845
+ }
846
+
465
847
  /**
466
848
  * Item id
467
849
  *
468
850
  * Pawn: `item`
469
851
  */
470
- item: number;
852
+ get item(): number {
853
+ return this.__kept ? this.__item : <f64>__nativeCell(1);
854
+ }
855
+
856
+ set item(value: number) {
857
+ this.__keep();
858
+ this.__item = value;
859
+ }
471
860
 
472
- constructor(player: Player, item: number) {
473
- this.player = player;
474
- this.item = item;
861
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
862
+ __keep(): void {
863
+ if (this.__kept) return;
864
+ this.__player = __playerOf(__nativeCell(0));
865
+ this.__item = <f64>__nativeCell(1);
866
+ this.__kept = true;
867
+ if (CS_OnBuyView != this) return;
868
+ CS_OnBuyView = null;
869
+ CS_OnBuyDirect();
475
870
  }
476
871
  }
477
872
 
@@ -490,16 +885,31 @@ export class ServerFrameEvent {
490
885
  *
491
886
  * Pawn: `client_kill(id)`
492
887
  */
493
- export class ClientKillEvent {
888
+ export class ClientKillEvent extends __ServerEvent {
889
+ private __player: Player | null = null;
890
+
494
891
  /**
495
892
  * The player the event is about.
496
893
  *
497
894
  * Pawn: `id`
498
895
  */
499
- player: Player;
896
+ get player(): Player {
897
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
898
+ }
899
+
900
+ set player(value: Player) {
901
+ this.__keep();
902
+ this.__player = value;
903
+ }
500
904
 
501
- constructor(player: Player) {
502
- this.player = player;
905
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
906
+ __keep(): void {
907
+ if (this.__kept) return;
908
+ this.__player = __playerOf(__nativeCell(0));
909
+ this.__kept = true;
910
+ if (suicideView != this) return;
911
+ suicideView = null;
912
+ suicideDirect();
503
913
  }
504
914
  }
505
915
 
@@ -508,23 +918,47 @@ export class ClientKillEvent {
508
918
  *
509
919
  * Pawn: `client_impulse(id, impulse)`
510
920
  */
511
- export class ClientImpulseEvent {
921
+ export class ClientImpulseEvent extends __ServerEvent {
922
+ private __player: Player | null = null;
923
+ private __impulse: number = 0;
924
+
512
925
  /**
513
926
  * The player the event is about.
514
927
  *
515
928
  * Pawn: `id`
516
929
  */
517
- player: Player;
930
+ get player(): Player {
931
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
932
+ }
933
+
934
+ set player(value: Player) {
935
+ this.__keep();
936
+ this.__player = value;
937
+ }
938
+
518
939
  /**
519
940
  * The impulse number: `100`, `201`.
520
941
  *
521
942
  * Pawn: `impulse`
522
943
  */
523
- impulse: number;
944
+ get impulse(): number {
945
+ return this.__kept ? this.__impulse : <f64>__nativeCell(1);
946
+ }
947
+
948
+ set impulse(value: number) {
949
+ this.__keep();
950
+ this.__impulse = value;
951
+ }
524
952
 
525
- constructor(player: Player, impulse: number) {
526
- this.player = player;
527
- this.impulse = impulse;
953
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
954
+ __keep(): void {
955
+ if (this.__kept) return;
956
+ this.__player = __playerOf(__nativeCell(0));
957
+ this.__impulse = <f64>__nativeCell(1);
958
+ this.__kept = true;
959
+ if (impulseView != this) return;
960
+ impulseView = null;
961
+ impulseDirect();
528
962
  }
529
963
  }
530
964
 
@@ -535,16 +969,31 @@ export class ClientImpulseEvent {
535
969
  *
536
970
  * Pawn: `client_cmdStart(id)`
537
971
  */
538
- export class ClientCmdStartEvent {
972
+ export class ClientCmdStartEvent extends __ServerEvent {
973
+ private __player: Player | null = null;
974
+
539
975
  /**
540
976
  * The player the event is about.
541
977
  *
542
978
  * Pawn: `id`
543
979
  */
544
- player: Player;
980
+ get player(): Player {
981
+ return this.__kept ? this.__player! : __playerOf(__nativeCell(0));
982
+ }
983
+
984
+ set player(value: Player) {
985
+ this.__keep();
986
+ this.__player = value;
987
+ }
545
988
 
546
- constructor(player: Player) {
547
- this.player = player;
989
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
990
+ __keep(): void {
991
+ if (this.__kept) return;
992
+ this.__player = __playerOf(__nativeCell(0));
993
+ this.__kept = true;
994
+ if (cmdStartView != this) return;
995
+ cmdStartView = null;
996
+ cmdStartDirect();
548
997
  }
549
998
  }
550
999
 
@@ -553,16 +1002,31 @@ export class ClientCmdStartEvent {
553
1002
  *
554
1003
  * Pawn: `pfn_think(entid)`
555
1004
  */
556
- export class PfnThinkEvent {
1005
+ export class PfnThinkEvent extends __ServerEvent {
1006
+ private __entity: number = 0;
1007
+
557
1008
  /**
558
1009
  * The entity that thinks.
559
1010
  *
560
1011
  * Pawn: `entid`
561
1012
  */
562
- entity: number;
1013
+ get entity(): number {
1014
+ return this.__kept ? this.__entity : <f64>__nativeCell(0);
1015
+ }
1016
+
1017
+ set entity(value: number) {
1018
+ this.__keep();
1019
+ this.__entity = value;
1020
+ }
563
1021
 
564
- constructor(entity: number) {
565
- this.entity = entity;
1022
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
1023
+ __keep(): void {
1024
+ if (this.__kept) return;
1025
+ this.__entity = <f64>__nativeCell(0);
1026
+ this.__kept = true;
1027
+ if (entityThinkView != this) return;
1028
+ entityThinkView = null;
1029
+ entityThinkDirect();
566
1030
  }
567
1031
  }
568
1032
 
@@ -571,93 +1035,217 @@ export class PfnThinkEvent {
571
1035
  *
572
1036
  * Pawn: `pfn_playbackevent(flags, entid, eventid, Float:delay, Float:Origin[3], Float:Angles[3], Float:fparam1, Float:fparam2, iparam1, iparam2, bparam1, bparam2)`
573
1037
  */
574
- export class PfnPlaybackeventEvent {
1038
+ export class PfnPlaybackeventEvent extends __ServerEvent {
1039
+ private __flags: number = 0;
1040
+ private __entity: number = 0;
1041
+ private __eventIndex: number = 0;
1042
+ private __delay: number = 0;
1043
+ private __origin: Vector | null = null;
1044
+ private __angles: Vector | null = null;
1045
+ private __fparam1: number = 0;
1046
+ private __fparam2: number = 0;
1047
+ private __iparam1: number = 0;
1048
+ private __iparam2: number = 0;
1049
+ private __bparam1: number = 0;
1050
+ private __bparam2: number = 0;
1051
+
575
1052
  /**
576
1053
  * The event's flags, how the engine sends it.
577
1054
  *
578
1055
  * Pawn: `flags`
579
1056
  */
580
- flags: number;
1057
+ get flags(): number {
1058
+ return this.__kept ? this.__flags : <f64>__nativeCell(0);
1059
+ }
1060
+
1061
+ set flags(value: number) {
1062
+ this.__keep();
1063
+ this.__flags = value;
1064
+ }
1065
+
581
1066
  /**
582
1067
  * The entity the event plays on, usually the player who fired.
583
1068
  *
584
1069
  * Pawn: `entid`
585
1070
  */
586
- entity: number;
1071
+ get entity(): number {
1072
+ return this.__kept ? this.__entity : <f64>__nativeCell(1);
1073
+ }
1074
+
1075
+ set entity(value: number) {
1076
+ this.__keep();
1077
+ this.__entity = value;
1078
+ }
1079
+
587
1080
  /**
588
1081
  * The event's index in the precached events.
589
1082
  *
590
1083
  * Pawn: `eventid`
591
1084
  */
592
- eventIndex: number;
1085
+ get eventIndex(): number {
1086
+ return this.__kept ? this.__eventIndex : <f64>__nativeCell(2);
1087
+ }
1088
+
1089
+ set eventIndex(value: number) {
1090
+ this.__keep();
1091
+ this.__eventIndex = value;
1092
+ }
1093
+
593
1094
  /**
594
1095
  * The seconds before the event plays.
595
1096
  *
596
1097
  * Pawn: `Float:delay`
597
1098
  */
598
- delay: number;
1099
+ get delay(): number {
1100
+ return this.__kept ? this.__delay : <f64>reinterpret<f32>(__nativeCell(3));
1101
+ }
1102
+
1103
+ set delay(value: number) {
1104
+ this.__keep();
1105
+ this.__delay = value;
1106
+ }
1107
+
599
1108
  /**
600
1109
  * The point the event plays from.
601
1110
  *
602
1111
  * Pawn: `Float:Origin[3]`
603
1112
  */
604
- origin: Vector;
1113
+ get origin(): Vector {
1114
+ return this.__kept ? this.__origin! : __nativeVector(4);
1115
+ }
1116
+
1117
+ set origin(value: Vector) {
1118
+ this.__keep();
1119
+ this.__origin = value;
1120
+ }
1121
+
605
1122
  /**
606
1123
  * The angles the event plays with.
607
1124
  *
608
1125
  * Pawn: `Float:Angles[3]`
609
1126
  */
610
- angles: Vector;
1127
+ get angles(): Vector {
1128
+ return this.__kept ? this.__angles! : __nativeVector(5);
1129
+ }
1130
+
1131
+ set angles(value: Vector) {
1132
+ this.__keep();
1133
+ this.__angles = value;
1134
+ }
1135
+
611
1136
  /**
612
1137
  * The event's first fractional parameter.
613
1138
  *
614
1139
  * Pawn: `Float:fparam1`
615
1140
  */
616
- fparam1: number;
1141
+ get fparam1(): number {
1142
+ return this.__kept ? this.__fparam1 : <f64>reinterpret<f32>(__nativeCell(6));
1143
+ }
1144
+
1145
+ set fparam1(value: number) {
1146
+ this.__keep();
1147
+ this.__fparam1 = value;
1148
+ }
1149
+
617
1150
  /**
618
1151
  * The event's second fractional parameter.
619
1152
  *
620
1153
  * Pawn: `Float:fparam2`
621
1154
  */
622
- fparam2: number;
1155
+ get fparam2(): number {
1156
+ return this.__kept ? this.__fparam2 : <f64>reinterpret<f32>(__nativeCell(7));
1157
+ }
1158
+
1159
+ set fparam2(value: number) {
1160
+ this.__keep();
1161
+ this.__fparam2 = value;
1162
+ }
1163
+
623
1164
  /**
624
1165
  * The event's first whole-number parameter.
625
1166
  *
626
1167
  * Pawn: `iparam1`
627
1168
  */
628
- iparam1: number;
1169
+ get iparam1(): number {
1170
+ return this.__kept ? this.__iparam1 : <f64>__nativeCell(8);
1171
+ }
1172
+
1173
+ set iparam1(value: number) {
1174
+ this.__keep();
1175
+ this.__iparam1 = value;
1176
+ }
1177
+
629
1178
  /**
630
1179
  * The event's second whole-number parameter.
631
1180
  *
632
1181
  * Pawn: `iparam2`
633
1182
  */
634
- iparam2: number;
1183
+ get iparam2(): number {
1184
+ return this.__kept ? this.__iparam2 : <f64>__nativeCell(9);
1185
+ }
1186
+
1187
+ set iparam2(value: number) {
1188
+ this.__keep();
1189
+ this.__iparam2 = value;
1190
+ }
1191
+
635
1192
  /**
636
1193
  * The event's first flag parameter, `1` or `0`.
637
1194
  *
638
1195
  * Pawn: `bparam1`
639
1196
  */
640
- bparam1: number;
1197
+ get bparam1(): number {
1198
+ return this.__kept ? this.__bparam1 : <f64>__nativeCell(10);
1199
+ }
1200
+
1201
+ set bparam1(value: number) {
1202
+ this.__keep();
1203
+ this.__bparam1 = value;
1204
+ }
1205
+
641
1206
  /**
642
1207
  * The event's second flag parameter, `1` or `0`.
643
1208
  *
644
1209
  * Pawn: `bparam2`
645
1210
  */
646
- bparam2: number;
1211
+ get bparam2(): number {
1212
+ return this.__kept ? this.__bparam2 : <f64>__nativeCell(11);
1213
+ }
1214
+
1215
+ set bparam2(value: number) {
1216
+ this.__keep();
1217
+ this.__bparam2 = value;
1218
+ }
647
1219
 
648
- constructor(flags: number, entity: number, eventIndex: number, delay: number, origin: Vector, angles: Vector, fparam1: number, fparam2: number, iparam1: number, iparam2: number, bparam1: number, bparam2: number) {
649
- this.flags = flags;
650
- this.entity = entity;
651
- this.eventIndex = eventIndex;
652
- this.delay = delay;
653
- this.origin = origin;
654
- this.angles = angles;
655
- this.fparam1 = fparam1;
656
- this.fparam2 = fparam2;
657
- this.iparam1 = iparam1;
658
- this.iparam2 = iparam2;
659
- this.bparam1 = bparam1;
660
- this.bparam2 = bparam2;
1220
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
1221
+ __keep(): void {
1222
+ if (this.__kept) return;
1223
+ this.__flags = <f64>__nativeCell(0);
1224
+ this.__entity = <f64>__nativeCell(1);
1225
+ this.__eventIndex = <f64>__nativeCell(2);
1226
+ this.__delay = <f64>reinterpret<f32>(__nativeCell(3));
1227
+ this.__origin = __nativeVector(4);
1228
+ this.__angles = __nativeVector(5);
1229
+ this.__fparam1 = <f64>reinterpret<f32>(__nativeCell(6));
1230
+ this.__fparam2 = <f64>reinterpret<f32>(__nativeCell(7));
1231
+ this.__iparam1 = <f64>__nativeCell(8);
1232
+ this.__iparam2 = <f64>__nativeCell(9);
1233
+ this.__bparam1 = <f64>__nativeCell(10);
1234
+ this.__bparam2 = <f64>__nativeCell(11);
1235
+ this.__kept = true;
1236
+ if (playbackEventView != this) return;
1237
+ playbackEventView = null;
1238
+ playbackEventDirect();
1239
+ }
1240
+
1241
+ /** Stops the event: no player gets it - a shot's sound and flash with it. */
1242
+ preventDefault(): void {
1243
+ __playbackBlock();
1244
+ }
1245
+
1246
+ /** Plays the event only to these of the players it would reach - `event.recipients = players.filter(...)`; the others do not hear the shot. The player who caused it is not left out by it. */
1247
+ set recipients(players: Player[]) {
1248
+ __playbackTo(players);
661
1249
  }
662
1250
  }
663
1251
 
@@ -668,16 +1256,31 @@ export class PfnPlaybackeventEvent {
668
1256
  *
669
1257
  * Pawn: `pfn_keyvalue(entid)`
670
1258
  */
671
- export class PfnKeyvalueEvent {
1259
+ export class PfnKeyvalueEvent extends __ServerEvent {
1260
+ private __entity: number = 0;
1261
+
672
1262
  /**
673
1263
  * Entity index
674
1264
  *
675
1265
  * Pawn: `entid`
676
1266
  */
677
- entity: number;
1267
+ get entity(): number {
1268
+ return this.__kept ? this.__entity : <f64>__nativeCell(0);
1269
+ }
1270
+
1271
+ set entity(value: number) {
1272
+ this.__keep();
1273
+ this.__entity = value;
1274
+ }
678
1275
 
679
- constructor(entity: number) {
680
- this.entity = entity;
1276
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
1277
+ __keep(): void {
1278
+ if (this.__kept) return;
1279
+ this.__entity = <f64>__nativeCell(0);
1280
+ this.__kept = true;
1281
+ if (keyValueView != this) return;
1282
+ keyValueView = null;
1283
+ keyValueDirect();
681
1284
  }
682
1285
  }
683
1286
 
@@ -686,16 +1289,31 @@ export class PfnKeyvalueEvent {
686
1289
  *
687
1290
  * Pawn: `pfn_spawn(entid)`
688
1291
  */
689
- export class PfnSpawnEvent {
1292
+ export class PfnSpawnEvent extends __ServerEvent {
1293
+ private __entity: number = 0;
1294
+
690
1295
  /**
691
1296
  * The entity being spawned.
692
1297
  *
693
1298
  * Pawn: `entid`
694
1299
  */
695
- entity: number;
1300
+ get entity(): number {
1301
+ return this.__kept ? this.__entity : <f64>__nativeCell(0);
1302
+ }
1303
+
1304
+ set entity(value: number) {
1305
+ this.__keep();
1306
+ this.__entity = value;
1307
+ }
696
1308
 
697
- constructor(entity: number) {
698
- this.entity = entity;
1309
+ /** @hidden Reads every field from the running call into the object, once (__ServerEvent). */
1310
+ __keep(): void {
1311
+ if (this.__kept) return;
1312
+ this.__entity = <f64>__nativeCell(0);
1313
+ this.__kept = true;
1314
+ if (entitySpawnView != this) return;
1315
+ entitySpawnView = null;
1316
+ entitySpawnDirect();
699
1317
  }
700
1318
  }
701
1319
 
@@ -2208,6 +2826,13 @@ export class WeaponListMessage extends ClientMessage {
2208
2826
  */
2209
2827
  get weapon(): WeaponKind { return weaponKindOf(this.__number(8)); }
2210
2828
  set weapon(value: WeaponKind) { this.__setNumber(8, weaponIdOf(value)); }
2829
+ /**
2830
+ * The weapon's ITEM_FLAG_* bits: `8` for one thrown when it is empty, `16` for one used only once.
2831
+ *
2832
+ * Pawn: `get_msg_arg_*(9)`
2833
+ */
2834
+ get flags(): number { return this.__number(9); }
2835
+ set flags(value: number) { this.__setNumber(9, value); }
2211
2836
  }
2212
2837
 
2213
2838
  /**
@@ -2236,18 +2861,6 @@ export interface ServerEventMap {
2236
2861
  * Pawn: `plugin_init`
2237
2862
  */
2238
2863
  init: PluginInitEvent;
2239
- /**
2240
- * An admin paused this plugin.
2241
- *
2242
- * Pawn: `plugin_pause`
2243
- */
2244
- pause: PluginPauseEvent;
2245
- /**
2246
- * An admin resumed this plugin.
2247
- *
2248
- * Pawn: `plugin_unpause`
2249
- */
2250
- unpause: PluginUnpauseEvent;
2251
2864
  /**
2252
2865
  * The server is about to change the map.
2253
2866
  *
@@ -2261,13 +2874,13 @@ export interface ServerEventMap {
2261
2874
  */
2262
2875
  pluginsLoaded: PluginCfgEvent;
2263
2876
  /**
2264
- * The map is ending or the server is shutting down: save what has to survive.
2877
+ * The plugin stops - the map ends, the server shuts down, or `amxts_reload`/`amxts_unload` stops it: save what has to survive.
2265
2878
  *
2266
2879
  * Pawn: `plugin_end`
2267
2880
  */
2268
2881
  end: PluginEndEvent;
2269
2882
  /**
2270
- * Called when a message is about to be logged.
2883
+ * A line the game writes to its log - a round's end, a kill, a bomb planted: `event.text` whole, `event.args` its parts.
2271
2884
  *
2272
2885
  * Pawn: `plugin_log`
2273
2886
  */
@@ -2309,7 +2922,7 @@ export interface ServerEventMap {
2309
2922
  */
2310
2923
  remove: ClientRemoveEvent;
2311
2924
  /**
2312
- * A player sent a console command. For one command, `server.addCommand("name", handler)` is simpler.
2925
+ * A player sent a console command - a chat line is `say` or `say_team`. For one command, `server.addCommand("name", handler)` is simpler.
2313
2926
  *
2314
2927
  * Pawn: `client_command`
2315
2928
  */
@@ -2326,12 +2939,6 @@ export interface ServerEventMap {
2326
2939
  * Pawn: `inconsistent_file`
2327
2940
  */
2328
2941
  inconsistentFile: InconsistentFileEvent;
2329
- /**
2330
- * Allows plugins to declare module dependencies using require_module()
2331
- *
2332
- * Pawn: `plugin_modules`
2333
- */
2334
- modules: PluginModulesEvent;
2335
2942
  /**
2336
2943
  * Called when the map has loaded, and all configs are done executing. This includes servercfgfile (server.cfg), amxx.cfg, plugin's config, and per-map config.
2337
2944
  *
@@ -3030,6 +3637,1503 @@ export interface ServerMessageMap {
3030
3637
  weaponPickup: WeapPickupMessage;
3031
3638
  }
3032
3639
 
3640
+ /** What `player.send("adStop", ...)` and `server.send("adStop", ...)` take: the game's `ADStop` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("ADStop"))`, `write_*`, `message_end` */
3641
+ export interface ADStopFields {
3642
+ }
3643
+
3644
+ /** What `player.send("allowSpectate", ...)` and `server.send("allowSpectate", ...)` take: the game's `AllowSpec` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("AllowSpec"))`, `write_*`, `message_end` */
3645
+ export interface AllowSpecFields {
3646
+ /** `true` when the menu offers it. */
3647
+ allowed?: boolean;
3648
+ }
3649
+
3650
+ /** What `player.send("ammoPickup", ...)` and `server.send("ammoPickup", ...)` take: the game's `AmmoPickup` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("AmmoPickup"))`, `write_*`, `message_end` */
3651
+ export interface AmmoPickupFields {
3652
+ /** The ammo's index in the game's list of kinds. */
3653
+ ammo?: number;
3654
+ /** The amount picked up. */
3655
+ amount?: number;
3656
+ }
3657
+
3658
+ /** What `player.send("ammo", ...)` and `server.send("ammo", ...)` take: the game's `AmmoX` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("AmmoX"))`, `write_*`, `message_end` */
3659
+ export interface AmmoXFields {
3660
+ /** The ammo's index in the game's list of kinds. */
3661
+ ammo?: number;
3662
+ /** The reserve shown. */
3663
+ amount?: number;
3664
+ }
3665
+
3666
+ /** What `player.send("armorType", ...)` and `server.send("armorType", ...)` take: the game's `ArmorType` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("ArmorType"))`, `write_*`, `message_end` */
3667
+ export interface ArmorTypeFields {
3668
+ /** `true` for a vest and a helmet. */
3669
+ helmet?: boolean;
3670
+ }
3671
+
3672
+ /** What `player.send("progressBar", ...)` and `server.send("progressBar", ...)` take: the game's `BarTime2` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("BarTime2"))`, `write_*`, `message_end` */
3673
+ export interface BarTime2Fields {
3674
+ /** The seconds the bar or the clock shows. Assign to change them. */
3675
+ seconds?: number;
3676
+ /** The bar's fill at the start, in percent. */
3677
+ startPercent?: number;
3678
+ }
3679
+
3680
+ /** What `player.send("armor", ...)` and `server.send("armor", ...)` take: the game's `Battery` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("Battery"))`, `write_*`, `message_end` */
3681
+ export interface BatteryFields {
3682
+ /** The armour shown. */
3683
+ armor?: number;
3684
+ }
3685
+
3686
+ /** What `player.send("moneyBlink", ...)` and `server.send("moneyBlink", ...)` take: the game's `BlinkAcct` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("BlinkAcct"))`, `write_*`, `message_end` */
3687
+ export interface BlinkAcctFields {
3688
+ /** The number of blinks. */
3689
+ blinks?: number;
3690
+ }
3691
+
3692
+ /** What `player.send("bombDrop", ...)` and `server.send("bombDrop", ...)` take: the game's `BombDrop` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("BombDrop"))`, `write_*`, `message_end` */
3693
+ export interface BombDropFields {
3694
+ /** The point where the bomb lies. */
3695
+ origin?: number[];
3696
+ /** `true` for a bomb planted, `false` for one dropped. */
3697
+ planted?: boolean;
3698
+ }
3699
+
3700
+ /** What `player.send("bombPickup", ...)` and `server.send("bombPickup", ...)` take: the game's `BombPickup` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("BombPickup"))`, `write_*`, `message_end` */
3701
+ export interface BombPickupFields {
3702
+ }
3703
+
3704
+ /** What `player.send("botVoice", ...)` and `server.send("botVoice", ...)` take: the game's `BotVoice` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("BotVoice"))`, `write_*`, `message_end` */
3705
+ export interface BotVoiceFields {
3706
+ /** `true` while the bot talks. */
3707
+ talking?: boolean;
3708
+ /** The bot who talks. */
3709
+ target?: Player | null;
3710
+ }
3711
+
3712
+ /** What `player.send("closeBuyMenu", ...)` and `server.send("closeBuyMenu", ...)` take: the game's `BuyClose` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("BuyClose"))`, `write_*`, `message_end` */
3713
+ export interface BuyCloseFields {
3714
+ }
3715
+
3716
+ /** What `player.send("crosshair", ...)` and `server.send("crosshair", ...)` take: the game's `Crosshair` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("Crosshair"))`, `write_*`, `message_end` */
3717
+ export interface CrosshairFields {
3718
+ /** `true` to show it. */
3719
+ shown?: boolean;
3720
+ }
3721
+
3722
+ /** What `player.send("currentWeapon", ...)` and `server.send("currentWeapon", ...)` take: the game's `CurWeapon` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("CurWeapon"))`, `write_*`, `message_end` */
3723
+ export interface CurWeaponFields {
3724
+ /** `true` for the weapon in his hands. */
3725
+ active?: boolean;
3726
+ /** The weapon, by its kind, e.g. `"ak47"`. */
3727
+ weapon?: WeaponKind;
3728
+ /** The rounds in the clip. */
3729
+ clip?: number;
3730
+ }
3731
+
3732
+ /** What `player.send("damage", ...)` and `server.send("damage", ...)` take: the game's `Damage` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("Damage"))`, `write_*`, `message_end` */
3733
+ export interface DamageFields {
3734
+ /** The armour he lost. */
3735
+ armor?: number;
3736
+ /** The health he lost. */
3737
+ damage?: number;
3738
+ /** The kinds of damage, e.g. `"fall"`, `"bullet"`. */
3739
+ damageType?: Damage[];
3740
+ /** The point the damage came from: the marks point to it. */
3741
+ origin?: number[];
3742
+ }
3743
+
3744
+ /** What `player.send("death", ...)` and `server.send("death", ...)` take: the game's `DeathMsg` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("DeathMsg"))`, `write_*`, `message_end` */
3745
+ export interface DeathMsgFields {
3746
+ /** The player who killed; `null` for the world. */
3747
+ killer?: Player | null;
3748
+ /** The player who died. */
3749
+ victim?: Player | null;
3750
+ /** `true` for a headshot. */
3751
+ headshot?: boolean;
3752
+ /** The weapon's name as the icon shows it, e.g. `"ak47"`, `"grenade"`. */
3753
+ weapon?: string;
3754
+ }
3755
+
3756
+ /** What `player.send("flashlight", ...)` and `server.send("flashlight", ...)` take: the game's `Flashlight` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("Flashlight"))`, `write_*`, `message_end` */
3757
+ export interface FlashlightFields {
3758
+ /** `true` while the flashlight is on. */
3759
+ on?: boolean;
3760
+ /** The flashlight's battery, in percent. */
3761
+ battery?: number;
3762
+ }
3763
+
3764
+ /** What `player.send("flashlightBattery", ...)` and `server.send("flashlightBattery", ...)` take: the game's `FlashBat` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("FlashBat"))`, `write_*`, `message_end` */
3765
+ export interface FlashBatFields {
3766
+ /** The flashlight's battery, in percent. */
3767
+ battery?: number;
3768
+ }
3769
+
3770
+ /** What `player.send("geiger", ...)` and `server.send("geiger", ...)` take: the game's `Geiger` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("Geiger"))`, `write_*`, `message_end` */
3771
+ export interface GeigerFields {
3772
+ /** The distance to the radiation: the less, the faster the clicks. */
3773
+ range?: number;
3774
+ }
3775
+
3776
+ /** What `player.send("health", ...)` and `server.send("health", ...)` take: the game's `Health` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("Health"))`, `write_*`, `message_end` */
3777
+ export interface HealthFields {
3778
+ /** The health shown. */
3779
+ health?: number;
3780
+ }
3781
+
3782
+ /** What `player.send("hideWeapon", ...)` and `server.send("hideWeapon", ...)` take: the game's `HideWeapon` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("HideWeapon"))`, `write_*`, `message_end` */
3783
+ export interface HideWeaponFields {
3784
+ /** The hidden parts, e.g. `"money"`, `"timer"`. Assign to change them. */
3785
+ flags?: HideHud[];
3786
+ }
3787
+
3788
+ /** What `player.send("hostageKilled", ...)` and `server.send("hostageKilled", ...)` take: the game's `HostageK` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("HostageK"))`, `write_*`, `message_end` */
3789
+ export interface HostageKFields {
3790
+ /** The hostage's number on the map, from `1`. */
3791
+ hostage?: number;
3792
+ }
3793
+
3794
+ /** What `player.send("initHud", ...)` and `server.send("initHud", ...)` take: the game's `InitHUD` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("InitHUD"))`, `write_*`, `message_end` */
3795
+ export interface InitHUDFields {
3796
+ }
3797
+
3798
+ /** What `player.send("itemPickup", ...)` and `server.send("itemPickup", ...)` take: the game's `ItemPickup` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("ItemPickup"))`, `write_*`, `message_end` */
3799
+ export interface ItemPickupFields {
3800
+ /** The item's class name, e.g. `"item_kevlar"`. */
3801
+ item?: string;
3802
+ }
3803
+
3804
+ /** What `player.send("itemStatus", ...)` and `server.send("itemStatus", ...)` take: the game's `ItemStatus` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("ItemStatus"))`, `write_*`, `message_end` */
3805
+ export interface ItemStatusFields {
3806
+ /** `true` when the player has night vision. */
3807
+ nightVision?: boolean;
3808
+ /** `true` when the player has a defuse kit. */
3809
+ defuseKit?: boolean;
3810
+ }
3811
+
3812
+ /** What `player.send("location", ...)` and `server.send("location", ...)` take: the game's `Location` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("Location"))`, `write_*`, `message_end` */
3813
+ export interface LocationFields {
3814
+ /** The player whose place it is. */
3815
+ target?: Player | null;
3816
+ /** The place's name, e.g. `"BombsiteA"`. */
3817
+ place?: string;
3818
+ }
3819
+
3820
+ /** What `player.send("money", ...)` and `server.send("money", ...)` take: the game's `Money` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("Money"))`, `write_*`, `message_end` */
3821
+ export interface MoneyFields {
3822
+ /** The money shown. */
3823
+ amount?: number;
3824
+ /** `true` to flash the change. */
3825
+ flash?: boolean;
3826
+ }
3827
+
3828
+ /** What `player.send("motd", ...)` and `server.send("motd", ...)` take: the game's `MOTD` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("MOTD"))`, `write_*`, `message_end` */
3829
+ export interface MOTDFields {
3830
+ /** `true` for the last part: the window opens. */
3831
+ last?: boolean;
3832
+ /** The part's text. */
3833
+ text?: string;
3834
+ }
3835
+
3836
+ /** What `player.send("nightVision", ...)` and `server.send("nightVision", ...)` take: the game's `NVGToggle` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("NVGToggle"))`, `write_*`, `message_end` */
3837
+ export interface NVGToggleFields {
3838
+ /** `true` while night vision is on. */
3839
+ on?: boolean;
3840
+ }
3841
+
3842
+ /** What `player.send("radar", ...)` and `server.send("radar", ...)` take: the game's `Radar` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("Radar"))`, `write_*`, `message_end` */
3843
+ export interface RadarFields {
3844
+ /** The teammate shown. */
3845
+ target?: Player | null;
3846
+ /** The point where the teammate is. */
3847
+ origin?: number[];
3848
+ }
3849
+
3850
+ /** What `player.send("resetHud", ...)` and `server.send("resetHud", ...)` take: the game's `ResetHUD` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("ResetHUD"))`, `write_*`, `message_end` */
3851
+ export interface ResetHUDFields {
3852
+ }
3853
+
3854
+ /** What `player.send("roundTime", ...)` and `server.send("roundTime", ...)` take: the game's `RoundTime` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("RoundTime"))`, `write_*`, `message_end` */
3855
+ export interface RoundTimeFields {
3856
+ /** The seconds the bar or the clock shows. Assign to change them. */
3857
+ seconds?: number;
3858
+ }
3859
+
3860
+ /** What `player.send("chat", ...)` and `server.send("chat", ...)` take: the game's `SayText` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("SayText"))`, `write_*`, `message_end` */
3861
+ export interface SayTextFields {
3862
+ /** The player who wrote it; `null` for the server. */
3863
+ sender?: Player | null;
3864
+ /** The line, or the game's format for it, e.g. `"#Cstrike_Chat_All"`. */
3865
+ text?: string;
3866
+ /** The texts put into the game's text in place of `%s1`, `%s2`, ... - e.g. a player's name. Assign to change them; their number stays. */
3867
+ params?: string[];
3868
+ }
3869
+
3870
+ /** What `player.send("scenarioIcon", ...)` and `server.send("scenarioIcon", ...)` take: the game's `Scenario` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("Scenario"))`, `write_*`, `message_end` */
3871
+ export interface ScenarioFields {
3872
+ /** `true` while the icon is shown. */
3873
+ active?: boolean;
3874
+ /** The icon's sprite name, e.g. `"hostage1"`. */
3875
+ sprite?: string;
3876
+ /** The icon's opacity, `0` to `255`. */
3877
+ alpha?: number;
3878
+ }
3879
+
3880
+ /** What `player.send("scoreAttribute", ...)` and `server.send("scoreAttribute", ...)` take: the game's `ScoreAttrib` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("ScoreAttrib"))`, `write_*`, `message_end` */
3881
+ export interface ScoreAttribFields {
3882
+ /** The player whose row it is. */
3883
+ target?: Player | null;
3884
+ /** The marks on the row, e.g. `"dead"`, `"bomb"`, `"vip"`. */
3885
+ flags?: ScoreStatus[];
3886
+ }
3887
+
3888
+ /** What `player.send("score", ...)` and `server.send("score", ...)` take: the game's `ScoreInfo` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("ScoreInfo"))`, `write_*`, `message_end` */
3889
+ export interface ScoreInfoFields {
3890
+ /** The player whose row it is. */
3891
+ target?: Player | null;
3892
+ /** The frags shown. */
3893
+ frags?: number;
3894
+ /** The deaths shown. */
3895
+ deaths?: number;
3896
+ /** The team the row is under. */
3897
+ team?: Team;
3898
+ }
3899
+
3900
+ /** What `player.send("screenFade", ...)` and `server.send("screenFade", ...)` take: the game's `ScreenFade` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("ScreenFade"))`, `write_*`, `message_end` */
3901
+ export interface ScreenFadeFields {
3902
+ /** The fade's duration, in seconds. */
3903
+ duration?: number;
3904
+ /** The time the full colour holds, in seconds. */
3905
+ hold?: number;
3906
+ /** One of `"in"`, from the colour to a clear view, or `"out"`, from a clear view to the colour. */
3907
+ direction?: FadeDirection;
3908
+ /** `true` when the colour tints the screen rather than painting over it. */
3909
+ modulate?: boolean;
3910
+ /** `true` when the colour stays until the next fade. */
3911
+ stay?: boolean;
3912
+ /** The colour: red, green, blue and alpha, `0` to `255` each. */
3913
+ color?: number[];
3914
+ }
3915
+
3916
+ /** What `player.send("screenShake", ...)` and `server.send("screenShake", ...)` take: the game's `ScreenShake` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("ScreenShake"))`, `write_*`, `message_end` */
3917
+ export interface ScreenShakeFields {
3918
+ /** The shake's strength: how far the view moves, up to 16 units. */
3919
+ amplitude?: number;
3920
+ /** The shake's duration, in seconds. */
3921
+ duration?: number;
3922
+ /** The shake's frequency, in jolts a second. */
3923
+ frequency?: number;
3924
+ }
3925
+
3926
+ /** What `player.send("sound", ...)` and `server.send("sound", ...)` take: the game's `SendAudio` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("SendAudio"))`, `write_*`, `message_end` */
3927
+ export interface SendAudioFields {
3928
+ /** The player the sound is from; `null` for none. */
3929
+ sender?: Player | null;
3930
+ /** The sound, e.g. `"%!MRAD_GO"` for a radio line. */
3931
+ sound?: string;
3932
+ /** The pitch in percent, `100` as recorded. */
3933
+ pitch?: number;
3934
+ }
3935
+
3936
+ /** What `player.send("serverName", ...)` and `server.send("serverName", ...)` take: the game's `ServerName` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("ServerName"))`, `write_*`, `message_end` */
3937
+ export interface ServerNameFields {
3938
+ /** The server's name, as `hostname` sets it. */
3939
+ serverName?: string;
3940
+ }
3941
+
3942
+ /** What `player.send("fov", ...)` and `server.send("fov", ...)` take: the game's `SetFOV` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("SetFOV"))`, `write_*`, `message_end` */
3943
+ export interface SetFOVFields {
3944
+ /** The field of view, in degrees. */
3945
+ fov?: number;
3946
+ }
3947
+
3948
+ /** What `player.send("showTimer", ...)` and `server.send("showTimer", ...)` take: the game's `ShowTimer` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("ShowTimer"))`, `write_*`, `message_end` */
3949
+ export interface ShowTimerFields {
3950
+ }
3951
+
3952
+ /** What `player.send("spectatedHealth", ...)` and `server.send("spectatedHealth", ...)` take: the game's `SpecHealth2` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("SpecHealth2"))`, `write_*`, `message_end` */
3953
+ export interface SpecHealth2Fields {
3954
+ /** The health shown. */
3955
+ health?: number;
3956
+ /** The player watched. */
3957
+ target?: Player | null;
3958
+ }
3959
+
3960
+ /** What `player.send("spectator", ...)` and `server.send("spectator", ...)` take: the game's `Spectator` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("Spectator"))`, `write_*`, `message_end` */
3961
+ export interface SpectatorFields {
3962
+ /** The player. */
3963
+ target?: Player | null;
3964
+ /** `true` while the player spectates. */
3965
+ spectator?: boolean;
3966
+ }
3967
+
3968
+ /** What `player.send("statusIcon", ...)` and `server.send("statusIcon", ...)` take: the game's `StatusIcon` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("StatusIcon"))`, `write_*`, `message_end` */
3969
+ export interface StatusIconFields {
3970
+ /** One of `"hide"`, `"show"` or `"flash"`. */
3971
+ state?: StatusIconState;
3972
+ /** The icon's sprite name, e.g. `"buyzone"`. */
3973
+ sprite?: string;
3974
+ /** The icon's colour: red, green and blue, `0` to `255` each; empty when it is hidden. */
3975
+ color?: number[];
3976
+ }
3977
+
3978
+ /** What `player.send("statusText", ...)` and `server.send("statusText", ...)` take: the game's `StatusText` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("StatusText"))`, `write_*`, `message_end` */
3979
+ export interface StatusTextFields {
3980
+ /** The status line's number, from `0`. */
3981
+ line?: number;
3982
+ /** The line's text, or its format, e.g. `"1 %c1: %p2"`. */
3983
+ text?: string;
3984
+ }
3985
+
3986
+ /** What `player.send("statusValue", ...)` and `server.send("statusValue", ...)` take: the game's `StatusValue` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("StatusValue"))`, `write_*`, `message_end` */
3987
+ export interface StatusValueFields {
3988
+ /** The value's number in the line's format: `1` a team, `2` a player, `3` health. */
3989
+ slot?: number;
3990
+ /** The value. */
3991
+ value?: number;
3992
+ }
3993
+
3994
+ /** What `player.send("taskTime", ...)` and `server.send("taskTime", ...)` take: the game's `TaskTime` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("TaskTime"))`, `write_*`, `message_end` */
3995
+ export interface TaskTimeFields {
3996
+ /** The seconds left. */
3997
+ seconds?: number;
3998
+ /** `true` while the clock runs. */
3999
+ active?: boolean;
4000
+ /** The seconds the clock takes to fade out. */
4001
+ fade?: number;
4002
+ }
4003
+
4004
+ /** What `player.send("team", ...)` and `server.send("team", ...)` take: the game's `TeamInfo` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("TeamInfo"))`, `write_*`, `message_end` */
4005
+ export interface TeamInfoFields {
4006
+ /** The player whose team it is. */
4007
+ target?: Player | null;
4008
+ /** The team, e.g. `"TERRORIST"`, `"CT"`. */
4009
+ team?: Team;
4010
+ }
4011
+
4012
+ /** What `player.send("teamScore", ...)` and `server.send("teamScore", ...)` take: the game's `TeamScore` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("TeamScore"))`, `write_*`, `message_end` */
4013
+ export interface TeamScoreFields {
4014
+ /** The team, `"TERRORIST"` or `"CT"`. */
4015
+ team?: Team;
4016
+ /** The rounds the team has won. */
4017
+ score?: number;
4018
+ }
4019
+
4020
+ /** What `player.send("text", ...)` and `server.send("text", ...)` take: the game's `TextMsg` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("TextMsg"))`, `write_*`, `message_end` */
4021
+ export interface TextMsgFields {
4022
+ /** The place it shows, one of `"chat"`, `"center"`, `"console"` or `"notify"`. */
4023
+ destination?: VariantName;
4024
+ /** The text, or the game's own for it, e.g. `"#Round_Draw"`. */
4025
+ text?: string;
4026
+ /** The texts put into the game's text in place of `%s1`, `%s2`, ... - e.g. a player's name. Assign to change them; their number stays. */
4027
+ params?: string[];
4028
+ }
4029
+
4030
+ /** What `player.send("train", ...)` and `server.send("train", ...)` take: the game's `Train` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("Train"))`, `write_*`, `message_end` */
4031
+ export interface TrainFields {
4032
+ /** The speed step, `0` for none. */
4033
+ speed?: number;
4034
+ }
4035
+
4036
+ /** What `player.send("tutorClose", ...)` and `server.send("tutorClose", ...)` take: the game's `TutorClose` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("TutorClose"))`, `write_*`, `message_end` */
4037
+ export interface TutorCloseFields {
4038
+ }
4039
+
4040
+ /** What `player.send("viewMode", ...)` and `server.send("viewMode", ...)` take: the game's `ViewMode` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("ViewMode"))`, `write_*`, `message_end` */
4041
+ export interface ViewModeFields {
4042
+ }
4043
+
4044
+ /** What `player.send("weaponList", ...)` and `server.send("weaponList", ...)` take: the game's `WeaponList` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("WeaponList"))`, `write_*`, `message_end` */
4045
+ export interface WeaponListFields {
4046
+ /** The weapon's class name, e.g. `"weapon_ak47"`. */
4047
+ classname?: string;
4048
+ /** The index of the weapon's ammo in the game's list of kinds. */
4049
+ ammo?: number;
4050
+ /** The most of that ammo a player carries. */
4051
+ maxAmmo?: number;
4052
+ /** The index of the weapon's second ammo, `-1` for none. */
4053
+ ammo2?: number;
4054
+ /** The most of the second ammo a player carries. */
4055
+ maxAmmo2?: number;
4056
+ /** The slot the weapon is in, from `0`. */
4057
+ slot?: number;
4058
+ /** The weapon's place in the slot, from `0`. */
4059
+ position?: number;
4060
+ /** The weapon, by its kind, e.g. `"ak47"`. */
4061
+ weapon?: WeaponKind;
4062
+ /** The weapon's ITEM_FLAG_* bits: `8` for one thrown when it is empty, `16` for one used only once. */
4063
+ flags?: number;
4064
+ }
4065
+
4066
+ /** What `player.send("weaponPickup", ...)` and `server.send("weaponPickup", ...)` take: the game's `WeapPickup` message, each field one of its arguments. A field left out goes as `0` or empty text. Pawn: `message_begin(..., get_user_msgid("WeapPickup"))`, `write_*`, `message_end` */
4067
+ export interface WeapPickupFields {
4068
+ /** The weapon, by its kind, e.g. `"knife"`. */
4069
+ weapon?: WeaponKind;
4070
+ }
4071
+
4072
+ /** Every message a plugin can send, by the name player.send and server.send take. */
4073
+ export interface ServerSendMap {
4074
+ /**
4075
+ * A player's HUD stops showing the round's advertisement.
4076
+ *
4077
+ * The game's `ADStop` message.
4078
+ *
4079
+ * Pawn: `register_message(get_user_msgid("ADStop"), ...)`
4080
+ */
4081
+ adStop: ADStopFields;
4082
+ /**
4083
+ * Whether a player may pick Spectate in the team menu.
4084
+ *
4085
+ * The game's `AllowSpec` message.
4086
+ *
4087
+ * Pawn: `register_message(get_user_msgid("AllowSpec"), ...)`
4088
+ */
4089
+ allowSpectate: AllowSpecFields;
4090
+ /**
4091
+ * A player picks up ammo: the notice at the side of his screen.
4092
+ *
4093
+ * The game's `AmmoPickup` message.
4094
+ *
4095
+ * Pawn: `register_message(get_user_msgid("AmmoPickup"), ...)`
4096
+ */
4097
+ ammoPickup: AmmoPickupFields;
4098
+ /**
4099
+ * A player's reserve ammo of one kind on his HUD changes.
4100
+ *
4101
+ * The game's `AmmoX` message.
4102
+ *
4103
+ * Pawn: `register_message(get_user_msgid("AmmoX"), ...)`
4104
+ */
4105
+ ammo: AmmoXFields;
4106
+ /**
4107
+ * The armour icon on a player's HUD: a vest, or a vest and a helmet.
4108
+ *
4109
+ * The game's `ArmorType` message.
4110
+ *
4111
+ * Pawn: `register_message(get_user_msgid("ArmorType"), ...)`
4112
+ */
4113
+ armorType: ArmorTypeFields;
4114
+ /**
4115
+ * The progress bar in the middle of a player's screen is shown or hidden, from empty or part of the way full.
4116
+ *
4117
+ * The game's `BarTime` and `BarTime2` messages.
4118
+ *
4119
+ * Pawn: `register_message(get_user_msgid("BarTime"), ...)`, `register_message(get_user_msgid("BarTime2"), ...)`
4120
+ */
4121
+ progressBar: BarTime2Fields;
4122
+ /**
4123
+ * A player's armour on his HUD changes.
4124
+ *
4125
+ * The game's `Battery` message.
4126
+ *
4127
+ * Pawn: `register_message(get_user_msgid("Battery"), ...)`
4128
+ */
4129
+ armor: BatteryFields;
4130
+ /**
4131
+ * A player's money on his HUD blinks: he cannot afford what he tried to buy.
4132
+ *
4133
+ * The game's `BlinkAcct` message.
4134
+ *
4135
+ * Pawn: `register_message(get_user_msgid("BlinkAcct"), ...)`
4136
+ */
4137
+ moneyBlink: BlinkAcctFields;
4138
+ /**
4139
+ * The bomb on the terrorists' radar: dropped or planted.
4140
+ *
4141
+ * The game's `BombDrop` message.
4142
+ *
4143
+ * Pawn: `register_message(get_user_msgid("BombDrop"), ...)`
4144
+ */
4145
+ bombDrop: BombDropFields;
4146
+ /**
4147
+ * The bomb is picked up: it leaves the terrorists' radar.
4148
+ *
4149
+ * The game's `BombPickup` message.
4150
+ *
4151
+ * Pawn: `register_message(get_user_msgid("BombPickup"), ...)`
4152
+ */
4153
+ bombPickup: BombPickupFields;
4154
+ /**
4155
+ * The voice icon over a bot who talks on the radio.
4156
+ *
4157
+ * The game's `BotVoice` message.
4158
+ *
4159
+ * Pawn: `register_message(get_user_msgid("BotVoice"), ...)`
4160
+ */
4161
+ botVoice: BotVoiceFields;
4162
+ /**
4163
+ * A player's buy menu is closed.
4164
+ *
4165
+ * The game's `BuyClose` message.
4166
+ *
4167
+ * Pawn: `register_message(get_user_msgid("BuyClose"), ...)`
4168
+ */
4169
+ closeBuyMenu: BuyCloseFields;
4170
+ /**
4171
+ * Counter-Strike's own crosshair on a player's screen is shown or hidden.
4172
+ *
4173
+ * The game's `Crosshair` message.
4174
+ *
4175
+ * Pawn: `register_message(get_user_msgid("Crosshair"), ...)`
4176
+ */
4177
+ crosshair: CrosshairFields;
4178
+ /**
4179
+ * The weapon in a player's hands and its clip on his HUD.
4180
+ *
4181
+ * The game's `CurWeapon` message.
4182
+ *
4183
+ * Pawn: `register_message(get_user_msgid("CurWeapon"), ...)`
4184
+ */
4185
+ currentWeapon: CurWeaponFields;
4186
+ /**
4187
+ * A player is shown the damage he took: the red marks at the side of his screen.
4188
+ *
4189
+ * The game's `Damage` message.
4190
+ *
4191
+ * Pawn: `register_message(get_user_msgid("Damage"), ...)`
4192
+ */
4193
+ damage: DamageFields;
4194
+ /**
4195
+ * A kill in the top right corner of every screen.
4196
+ *
4197
+ * The game's `DeathMsg` message.
4198
+ *
4199
+ * Pawn: `register_message(get_user_msgid("DeathMsg"), ...)`
4200
+ */
4201
+ death: DeathMsgFields;
4202
+ /**
4203
+ * The flashlight icon on a player's HUD: on or off, and its battery.
4204
+ *
4205
+ * The game's `Flashlight` message.
4206
+ *
4207
+ * Pawn: `register_message(get_user_msgid("Flashlight"), ...)`
4208
+ */
4209
+ flashlight: FlashlightFields;
4210
+ /**
4211
+ * The flashlight's battery on a player's HUD changes.
4212
+ *
4213
+ * The game's `FlashBat` message.
4214
+ *
4215
+ * Pawn: `register_message(get_user_msgid("FlashBat"), ...)`
4216
+ */
4217
+ flashlightBattery: FlashBatFields;
4218
+ /**
4219
+ * The Geiger counter's clicks a player hears near radiation.
4220
+ *
4221
+ * The game's `Geiger` message.
4222
+ *
4223
+ * Pawn: `register_message(get_user_msgid("Geiger"), ...)`
4224
+ */
4225
+ geiger: GeigerFields;
4226
+ /**
4227
+ * A player's health on his HUD changes.
4228
+ *
4229
+ * The game's `Health` message.
4230
+ *
4231
+ * Pawn: `register_message(get_user_msgid("Health"), ...)`
4232
+ */
4233
+ health: HealthFields;
4234
+ /**
4235
+ * The parts of a player's HUD that are hidden change.
4236
+ *
4237
+ * The game's `HideWeapon` message.
4238
+ *
4239
+ * Pawn: `register_message(get_user_msgid("HideWeapon"), ...)`
4240
+ */
4241
+ hideWeapon: HideWeaponFields;
4242
+ /**
4243
+ * A hostage is killed: it leaves the counter-terrorists' radar.
4244
+ *
4245
+ * The game's `HostageK` message.
4246
+ *
4247
+ * Pawn: `register_message(get_user_msgid("HostageK"), ...)`
4248
+ */
4249
+ hostageKilled: HostageKFields;
4250
+ /**
4251
+ * A player's HUD is set up, when he enters the game.
4252
+ *
4253
+ * The game's `InitHUD` message.
4254
+ *
4255
+ * Pawn: `register_message(get_user_msgid("InitHUD"), ...)`
4256
+ */
4257
+ initHud: InitHUDFields;
4258
+ /**
4259
+ * A player picks up an item: the notice at the side of his screen.
4260
+ *
4261
+ * The game's `ItemPickup` message.
4262
+ *
4263
+ * Pawn: `register_message(get_user_msgid("ItemPickup"), ...)`
4264
+ */
4265
+ itemPickup: ItemPickupFields;
4266
+ /**
4267
+ * The night vision and the defuse kit a player has, for his HUD.
4268
+ *
4269
+ * The game's `ItemStatus` message.
4270
+ *
4271
+ * Pawn: `register_message(get_user_msgid("ItemStatus"), ...)`
4272
+ */
4273
+ itemStatus: ItemStatusFields;
4274
+ /**
4275
+ * The place on the map a player is in, as the radio names it.
4276
+ *
4277
+ * The game's `Location` message.
4278
+ *
4279
+ * Pawn: `register_message(get_user_msgid("Location"), ...)`
4280
+ */
4281
+ location: LocationFields;
4282
+ /**
4283
+ * A player's money on his HUD changes.
4284
+ *
4285
+ * The game's `Money` message.
4286
+ *
4287
+ * Pawn: `register_message(get_user_msgid("Money"), ...)`
4288
+ */
4289
+ money: MoneyFields;
4290
+ /**
4291
+ * A part of the message of the day, the window a joining player sees.
4292
+ *
4293
+ * The game's `MOTD` message.
4294
+ *
4295
+ * Pawn: `register_message(get_user_msgid("MOTD"), ...)`
4296
+ */
4297
+ motd: MOTDFields;
4298
+ /**
4299
+ * A player's night vision is turned on or off.
4300
+ *
4301
+ * The game's `NVGToggle` message.
4302
+ *
4303
+ * Pawn: `register_message(get_user_msgid("NVGToggle"), ...)`
4304
+ */
4305
+ nightVision: NVGToggleFields;
4306
+ /**
4307
+ * A teammate on a player's radar.
4308
+ *
4309
+ * The game's `Radar` message.
4310
+ *
4311
+ * Pawn: `register_message(get_user_msgid("Radar"), ...)`
4312
+ */
4313
+ radar: RadarFields;
4314
+ /**
4315
+ * A player's HUD is reset, at his spawn.
4316
+ *
4317
+ * The game's `ResetHUD` message.
4318
+ *
4319
+ * Pawn: `register_message(get_user_msgid("ResetHUD"), ...)`
4320
+ */
4321
+ resetHud: ResetHUDFields;
4322
+ /**
4323
+ * The round clock at the top of a player's HUD is set.
4324
+ *
4325
+ * The game's `RoundTime` message.
4326
+ *
4327
+ * Pawn: `register_message(get_user_msgid("RoundTime"), ...)`
4328
+ */
4329
+ roundTime: RoundTimeFields;
4330
+ /**
4331
+ * A chat line.
4332
+ *
4333
+ * The game's `SayText` message.
4334
+ *
4335
+ * Pawn: `register_message(get_user_msgid("SayText"), ...)`
4336
+ */
4337
+ chat: SayTextFields;
4338
+ /**
4339
+ * The scenario icon on a player's HUD, such as the bomb's or a hostage's.
4340
+ *
4341
+ * The game's `Scenario` message.
4342
+ *
4343
+ * Pawn: `register_message(get_user_msgid("Scenario"), ...)`
4344
+ */
4345
+ scenarioIcon: ScenarioFields;
4346
+ /**
4347
+ * The marks the scoreboard shows beside a player: dead, the bomb, the VIP.
4348
+ *
4349
+ * The game's `ScoreAttrib` message.
4350
+ *
4351
+ * Pawn: `register_message(get_user_msgid("ScoreAttrib"), ...)`
4352
+ */
4353
+ scoreAttribute: ScoreAttribFields;
4354
+ /**
4355
+ * A player's row on the scoreboard.
4356
+ *
4357
+ * The game's `ScoreInfo` message.
4358
+ *
4359
+ * Pawn: `register_message(get_user_msgid("ScoreInfo"), ...)`
4360
+ */
4361
+ score: ScoreInfoFields;
4362
+ /**
4363
+ * A player's screen is coloured, fading in or out - a flashbang, a fade to black.
4364
+ *
4365
+ * The game's `ScreenFade` message.
4366
+ *
4367
+ * Pawn: `register_message(get_user_msgid("ScreenFade"), ...)`
4368
+ */
4369
+ screenFade: ScreenFadeFields;
4370
+ /**
4371
+ * A player's view shakes - an explosion nearby.
4372
+ *
4373
+ * The game's `ScreenShake` message.
4374
+ *
4375
+ * Pawn: `register_message(get_user_msgid("ScreenShake"), ...)`
4376
+ */
4377
+ screenShake: ScreenShakeFields;
4378
+ /**
4379
+ * A sound played to a player, such as a radio line.
4380
+ *
4381
+ * The game's `SendAudio` message.
4382
+ *
4383
+ * Pawn: `register_message(get_user_msgid("SendAudio"), ...)`
4384
+ */
4385
+ sound: SendAudioFields;
4386
+ /**
4387
+ * The server's name a player's client shows.
4388
+ *
4389
+ * The game's `ServerName` message.
4390
+ *
4391
+ * Pawn: `register_message(get_user_msgid("ServerName"), ...)`
4392
+ */
4393
+ serverName: ServerNameFields;
4394
+ /**
4395
+ * A player's field of view is set.
4396
+ *
4397
+ * The game's `SetFOV` message.
4398
+ *
4399
+ * Pawn: `register_message(get_user_msgid("SetFOV"), ...)`
4400
+ */
4401
+ fov: SetFOVFields;
4402
+ /**
4403
+ * The round clock appears on a player's HUD.
4404
+ *
4405
+ * The game's `ShowTimer` message.
4406
+ *
4407
+ * Pawn: `register_message(get_user_msgid("ShowTimer"), ...)`
4408
+ */
4409
+ showTimer: ShowTimerFields;
4410
+ /**
4411
+ * The health of the player a spectator watches.
4412
+ *
4413
+ * The game's `SpecHealth` and `SpecHealth2` messages.
4414
+ *
4415
+ * Pawn: `register_message(get_user_msgid("SpecHealth"), ...)`, `register_message(get_user_msgid("SpecHealth2"), ...)`
4416
+ */
4417
+ spectatedHealth: SpecHealth2Fields;
4418
+ /**
4419
+ * A player becomes a spectator, or stops being one, on the scoreboard.
4420
+ *
4421
+ * The game's `Spectator` message.
4422
+ *
4423
+ * Pawn: `register_message(get_user_msgid("Spectator"), ...)`
4424
+ */
4425
+ spectator: SpectatorFields;
4426
+ /**
4427
+ * A status icon on a player's HUD - the buy zone, the bomb - is shown, flashed or hidden.
4428
+ *
4429
+ * The game's `StatusIcon` message.
4430
+ *
4431
+ * Pawn: `register_message(get_user_msgid("StatusIcon"), ...)`
4432
+ */
4433
+ statusIcon: StatusIconFields;
4434
+ /**
4435
+ * The status line at the bottom of a player's screen, such as the name of the player he aims at.
4436
+ *
4437
+ * The game's `StatusText` message.
4438
+ *
4439
+ * Pawn: `register_message(get_user_msgid("StatusText"), ...)`
4440
+ */
4441
+ statusText: StatusTextFields;
4442
+ /**
4443
+ * A value the status line shows, such as the player a player aims at.
4444
+ *
4445
+ * The game's `StatusValue` message.
4446
+ *
4447
+ * Pawn: `register_message(get_user_msgid("StatusValue"), ...)`
4448
+ */
4449
+ statusValue: StatusValueFields;
4450
+ /**
4451
+ * The countdown of a task on a player's HUD, such as rescuing the hostages in a career.
4452
+ *
4453
+ * The game's `TaskTime` message.
4454
+ *
4455
+ * Pawn: `register_message(get_user_msgid("TaskTime"), ...)`
4456
+ */
4457
+ taskTime: TaskTimeFields;
4458
+ /**
4459
+ * A player's team on the scoreboard.
4460
+ *
4461
+ * The game's `TeamInfo` message.
4462
+ *
4463
+ * Pawn: `register_message(get_user_msgid("TeamInfo"), ...)`
4464
+ */
4465
+ team: TeamInfoFields;
4466
+ /**
4467
+ * A team's score on the scoreboard.
4468
+ *
4469
+ * The game's `TeamScore` message.
4470
+ *
4471
+ * Pawn: `register_message(get_user_msgid("TeamScore"), ...)`
4472
+ */
4473
+ teamScore: TeamScoreFields;
4474
+ /**
4475
+ * A text from the game - an announcement, a hint - in chat, the console or the middle of the screen.
4476
+ *
4477
+ * The game's `TextMsg` message.
4478
+ *
4479
+ * Pawn: `register_message(get_user_msgid("TextMsg"), ...)`
4480
+ */
4481
+ text: TextMsgFields;
4482
+ /**
4483
+ * The speed of the train a player drives, on his HUD.
4484
+ *
4485
+ * The game's `Train` message.
4486
+ *
4487
+ * Pawn: `register_message(get_user_msgid("Train"), ...)`
4488
+ */
4489
+ train: TrainFields;
4490
+ /**
4491
+ * A tutor's message on a player's screen closes.
4492
+ *
4493
+ * The game's `TutorClose` message.
4494
+ *
4495
+ * Pawn: `register_message(get_user_msgid("TutorClose"), ...)`
4496
+ */
4497
+ tutorClose: TutorCloseFields;
4498
+ /**
4499
+ * A player's view goes back to first person.
4500
+ *
4501
+ * The game's `ViewMode` message.
4502
+ *
4503
+ * Pawn: `register_message(get_user_msgid("ViewMode"), ...)`
4504
+ */
4505
+ viewMode: ViewModeFields;
4506
+ /**
4507
+ * A weapon's description for a player's client: its ammo, its slot, its place in the slot.
4508
+ *
4509
+ * The game's `WeaponList` message.
4510
+ *
4511
+ * Pawn: `register_message(get_user_msgid("WeaponList"), ...)`
4512
+ */
4513
+ weaponList: WeaponListFields;
4514
+ /**
4515
+ * A player picks up a weapon: the notice at the side of his screen.
4516
+ *
4517
+ * The game's `WeapPickup` message.
4518
+ *
4519
+ * Pawn: `register_message(get_user_msgid("WeapPickup"), ...)`
4520
+ */
4521
+ weaponPickup: WeapPickupFields;
4522
+ }
4523
+
4524
+ /** Sends a message of the fields F - player.send's and server.send's hood. */
4525
+ export function __sendMessage<F>(given: F, dest: i32, player: i32, origin: Vector | null): void {
4526
+ if (idof<F>() == idof<ADStopFields>()) {
4527
+ const fields = changetype<ADStopFields>(given);
4528
+ const out = new __MessageOut();
4529
+ if (!out.begin("ADStop", dest, player, origin)) return;
4530
+ emessage_end();
4531
+ return;
4532
+ }
4533
+ if (idof<F>() == idof<AllowSpecFields>()) {
4534
+ const fields = changetype<AllowSpecFields>(given);
4535
+ const out = new __MessageOut();
4536
+ { const value: boolean = fields.allowed ?? false; out.__setNumber(1, value ? 1 : 0); }
4537
+ if (!out.begin("AllowSpec", dest, player, origin)) return;
4538
+ ewrite_byte(out.int(1));
4539
+ emessage_end();
4540
+ return;
4541
+ }
4542
+ if (idof<F>() == idof<AmmoPickupFields>()) {
4543
+ const fields = changetype<AmmoPickupFields>(given);
4544
+ const out = new __MessageOut();
4545
+ { const value: number = fields.ammo ?? 0; out.__setNumber(1, value); }
4546
+ { const value: number = fields.amount ?? 0; out.__setNumber(2, value); }
4547
+ if (!out.begin("AmmoPickup", dest, player, origin)) return;
4548
+ ewrite_byte(out.int(1));
4549
+ ewrite_byte(out.int(2));
4550
+ emessage_end();
4551
+ return;
4552
+ }
4553
+ if (idof<F>() == idof<AmmoXFields>()) {
4554
+ const fields = changetype<AmmoXFields>(given);
4555
+ const out = new __MessageOut();
4556
+ { const value: number = fields.ammo ?? 0; out.__setNumber(1, value); }
4557
+ { const value: number = fields.amount ?? 0; out.__setNumber(2, value); }
4558
+ if (!out.begin("AmmoX", dest, player, origin)) return;
4559
+ ewrite_byte(out.int(1));
4560
+ ewrite_byte(out.int(2));
4561
+ emessage_end();
4562
+ return;
4563
+ }
4564
+ if (idof<F>() == idof<ArmorTypeFields>()) {
4565
+ const fields = changetype<ArmorTypeFields>(given);
4566
+ const out = new __MessageOut();
4567
+ { const value: boolean = fields.helmet ?? false; out.__setNumber(1, value ? 1 : 0); }
4568
+ if (!out.begin("ArmorType", dest, player, origin)) return;
4569
+ ewrite_byte(out.int(1));
4570
+ emessage_end();
4571
+ return;
4572
+ }
4573
+ if (idof<F>() == idof<BarTime2Fields>()) {
4574
+ const fields = changetype<BarTime2Fields>(given);
4575
+ const out = new __MessageOut();
4576
+ { const value: number = fields.seconds ?? 0; out.__setNumber(1, value); }
4577
+ { const value: number = fields.startPercent ?? 0; out.__setNumber(2, value); }
4578
+ if (!out.begin("BarTime2", dest, player, origin)) return;
4579
+ ewrite_short(out.int(1));
4580
+ ewrite_short(out.int(2));
4581
+ emessage_end();
4582
+ return;
4583
+ }
4584
+ if (idof<F>() == idof<BatteryFields>()) {
4585
+ const fields = changetype<BatteryFields>(given);
4586
+ const out = new __MessageOut();
4587
+ { const value: number = fields.armor ?? 0; out.__setNumber(1, value); }
4588
+ if (!out.begin("Battery", dest, player, origin)) return;
4589
+ ewrite_short(out.int(1));
4590
+ emessage_end();
4591
+ return;
4592
+ }
4593
+ if (idof<F>() == idof<BlinkAcctFields>()) {
4594
+ const fields = changetype<BlinkAcctFields>(given);
4595
+ const out = new __MessageOut();
4596
+ { const value: number = fields.blinks ?? 0; out.__setNumber(1, value); }
4597
+ if (!out.begin("BlinkAcct", dest, player, origin)) return;
4598
+ ewrite_byte(out.int(1));
4599
+ emessage_end();
4600
+ return;
4601
+ }
4602
+ if (idof<F>() == idof<BombDropFields>()) {
4603
+ const fields = changetype<BombDropFields>(given);
4604
+ const out = new __MessageOut();
4605
+ { const value: number[] = fields.origin ?? [0, 0, 0]; out.__setVector(1, value); }
4606
+ { const value: boolean = fields.planted ?? false; out.__setNumber(4, value ? 1 : 0); }
4607
+ if (!out.begin("BombDrop", dest, player, origin)) return;
4608
+ ewrite_coord_f(out.number(1));
4609
+ ewrite_coord_f(out.number(2));
4610
+ ewrite_coord_f(out.number(3));
4611
+ ewrite_byte(out.int(4));
4612
+ emessage_end();
4613
+ return;
4614
+ }
4615
+ if (idof<F>() == idof<BombPickupFields>()) {
4616
+ const fields = changetype<BombPickupFields>(given);
4617
+ const out = new __MessageOut();
4618
+ if (!out.begin("BombPickup", dest, player, origin)) return;
4619
+ emessage_end();
4620
+ return;
4621
+ }
4622
+ if (idof<F>() == idof<BotVoiceFields>()) {
4623
+ const fields = changetype<BotVoiceFields>(given);
4624
+ const out = new __MessageOut();
4625
+ { const value: boolean = fields.talking ?? false; out.__setNumber(1, value ? 1 : 0); }
4626
+ { const value: Player | null = fields.target ?? null; out.__setNumber(2, value != null ? value.id : 0); }
4627
+ if (!out.begin("BotVoice", dest, player, origin)) return;
4628
+ ewrite_byte(out.int(1));
4629
+ ewrite_byte(out.int(2));
4630
+ emessage_end();
4631
+ return;
4632
+ }
4633
+ if (idof<F>() == idof<BuyCloseFields>()) {
4634
+ const fields = changetype<BuyCloseFields>(given);
4635
+ const out = new __MessageOut();
4636
+ if (!out.begin("BuyClose", dest, player, origin)) return;
4637
+ emessage_end();
4638
+ return;
4639
+ }
4640
+ if (idof<F>() == idof<CrosshairFields>()) {
4641
+ const fields = changetype<CrosshairFields>(given);
4642
+ const out = new __MessageOut();
4643
+ { const value: boolean = fields.shown ?? false; out.__setNumber(1, value ? 1 : 0); }
4644
+ if (!out.begin("Crosshair", dest, player, origin)) return;
4645
+ ewrite_byte(out.int(1));
4646
+ emessage_end();
4647
+ return;
4648
+ }
4649
+ if (idof<F>() == idof<CurWeaponFields>()) {
4650
+ const fields = changetype<CurWeaponFields>(given);
4651
+ const out = new __MessageOut();
4652
+ { const value: boolean = fields.active ?? false; out.__setNumber(1, value ? 1 : 0); }
4653
+ { const value: WeaponKind = fields.weapon ?? "none"; out.__setNumber(2, weaponIdOf(value)); }
4654
+ { const value: number = fields.clip ?? 0; out.__setNumber(3, value); }
4655
+ if (!out.begin("CurWeapon", dest, player, origin)) return;
4656
+ ewrite_byte(out.int(1));
4657
+ ewrite_byte(out.int(2));
4658
+ ewrite_byte(out.int(3));
4659
+ emessage_end();
4660
+ return;
4661
+ }
4662
+ if (idof<F>() == idof<DamageFields>()) {
4663
+ const fields = changetype<DamageFields>(given);
4664
+ const out = new __MessageOut();
4665
+ { const value: number = fields.armor ?? 0; out.__setNumber(1, value); }
4666
+ { const value: number = fields.damage ?? 0; out.__setNumber(2, value); }
4667
+ { const value: Damage[] = fields.damageType ?? []; out.__setNumber(3, DAMAGE.maskOf(value)); }
4668
+ { const value: number[] = fields.origin ?? [0, 0, 0]; out.__setVector(4, value); }
4669
+ if (!out.begin("Damage", dest, player, origin)) return;
4670
+ ewrite_byte(out.int(1));
4671
+ ewrite_byte(out.int(2));
4672
+ ewrite_long(out.int(3));
4673
+ ewrite_coord_f(out.number(4));
4674
+ ewrite_coord_f(out.number(5));
4675
+ ewrite_coord_f(out.number(6));
4676
+ emessage_end();
4677
+ return;
4678
+ }
4679
+ if (idof<F>() == idof<DeathMsgFields>()) {
4680
+ const fields = changetype<DeathMsgFields>(given);
4681
+ const out = new __MessageOut();
4682
+ { const value: Player | null = fields.killer ?? null; out.__setNumber(1, value != null ? value.id : 0); }
4683
+ { const value: Player | null = fields.victim ?? null; out.__setNumber(2, value != null ? value.id : 0); }
4684
+ { const value: boolean = fields.headshot ?? false; out.__setNumber(3, value ? 1 : 0); }
4685
+ { const value: string = fields.weapon ?? ""; out.__setText(4, value); }
4686
+ if (!out.begin("DeathMsg", dest, player, origin)) return;
4687
+ ewrite_byte(out.int(1));
4688
+ ewrite_byte(out.int(2));
4689
+ ewrite_byte(out.int(3));
4690
+ ewrite_string(out.text(4));
4691
+ emessage_end();
4692
+ return;
4693
+ }
4694
+ if (idof<F>() == idof<FlashlightFields>()) {
4695
+ const fields = changetype<FlashlightFields>(given);
4696
+ const out = new __MessageOut();
4697
+ { const value: boolean = fields.on ?? false; out.__setNumber(1, value ? 1 : 0); }
4698
+ { const value: number = fields.battery ?? 0; out.__setNumber(2, value); }
4699
+ if (!out.begin("Flashlight", dest, player, origin)) return;
4700
+ ewrite_byte(out.int(1));
4701
+ ewrite_byte(out.int(2));
4702
+ emessage_end();
4703
+ return;
4704
+ }
4705
+ if (idof<F>() == idof<FlashBatFields>()) {
4706
+ const fields = changetype<FlashBatFields>(given);
4707
+ const out = new __MessageOut();
4708
+ { const value: number = fields.battery ?? 0; out.__setNumber(1, value); }
4709
+ if (!out.begin("FlashBat", dest, player, origin)) return;
4710
+ ewrite_byte(out.int(1));
4711
+ emessage_end();
4712
+ return;
4713
+ }
4714
+ if (idof<F>() == idof<GeigerFields>()) {
4715
+ const fields = changetype<GeigerFields>(given);
4716
+ const out = new __MessageOut();
4717
+ { const value: number = fields.range ?? 0; out.__setNumber(1, value); }
4718
+ if (!out.begin("Geiger", dest, player, origin)) return;
4719
+ ewrite_byte(out.int(1));
4720
+ emessage_end();
4721
+ return;
4722
+ }
4723
+ if (idof<F>() == idof<HealthFields>()) {
4724
+ const fields = changetype<HealthFields>(given);
4725
+ const out = new __MessageOut();
4726
+ { const value: number = fields.health ?? 0; out.__setNumber(1, value); }
4727
+ if (!out.begin("Health", dest, player, origin)) return;
4728
+ ewrite_byte(out.int(1));
4729
+ emessage_end();
4730
+ return;
4731
+ }
4732
+ if (idof<F>() == idof<HideWeaponFields>()) {
4733
+ const fields = changetype<HideWeaponFields>(given);
4734
+ const out = new __MessageOut();
4735
+ { const value: HideHud[] = fields.flags ?? []; out.__setNumber(1, HIDE_HUD.maskOf(value)); }
4736
+ if (!out.begin("HideWeapon", dest, player, origin)) return;
4737
+ ewrite_byte(out.int(1));
4738
+ emessage_end();
4739
+ return;
4740
+ }
4741
+ if (idof<F>() == idof<HostageKFields>()) {
4742
+ const fields = changetype<HostageKFields>(given);
4743
+ const out = new __MessageOut();
4744
+ { const value: number = fields.hostage ?? 0; out.__setNumber(1, value); }
4745
+ if (!out.begin("HostageK", dest, player, origin)) return;
4746
+ ewrite_byte(out.int(1));
4747
+ emessage_end();
4748
+ return;
4749
+ }
4750
+ if (idof<F>() == idof<InitHUDFields>()) {
4751
+ const fields = changetype<InitHUDFields>(given);
4752
+ const out = new __MessageOut();
4753
+ if (!out.begin("InitHUD", dest, player, origin)) return;
4754
+ emessage_end();
4755
+ return;
4756
+ }
4757
+ if (idof<F>() == idof<ItemPickupFields>()) {
4758
+ const fields = changetype<ItemPickupFields>(given);
4759
+ const out = new __MessageOut();
4760
+ { const value: string = fields.item ?? ""; out.__setText(1, value); }
4761
+ if (!out.begin("ItemPickup", dest, player, origin)) return;
4762
+ ewrite_string(out.text(1));
4763
+ emessage_end();
4764
+ return;
4765
+ }
4766
+ if (idof<F>() == idof<ItemStatusFields>()) {
4767
+ const fields = changetype<ItemStatusFields>(given);
4768
+ const out = new __MessageOut();
4769
+ { const value: boolean = fields.nightVision ?? false; out.__setBit(1, 1, value); }
4770
+ { const value: boolean = fields.defuseKit ?? false; out.__setBit(1, 2, value); }
4771
+ if (!out.begin("ItemStatus", dest, player, origin)) return;
4772
+ ewrite_byte(out.int(1));
4773
+ emessage_end();
4774
+ return;
4775
+ }
4776
+ if (idof<F>() == idof<LocationFields>()) {
4777
+ const fields = changetype<LocationFields>(given);
4778
+ const out = new __MessageOut();
4779
+ { const value: Player | null = fields.target ?? null; out.__setNumber(1, value != null ? value.id : 0); }
4780
+ { const value: string = fields.place ?? ""; out.__setText(2, value); }
4781
+ if (!out.begin("Location", dest, player, origin)) return;
4782
+ ewrite_byte(out.int(1));
4783
+ ewrite_string(out.text(2));
4784
+ emessage_end();
4785
+ return;
4786
+ }
4787
+ if (idof<F>() == idof<MoneyFields>()) {
4788
+ const fields = changetype<MoneyFields>(given);
4789
+ const out = new __MessageOut();
4790
+ { const value: number = fields.amount ?? 0; out.__setNumber(1, value); }
4791
+ { const value: boolean = fields.flash ?? false; out.__setNumber(2, value ? 1 : 0); }
4792
+ if (!out.begin("Money", dest, player, origin)) return;
4793
+ ewrite_long(out.int(1));
4794
+ ewrite_byte(out.int(2));
4795
+ emessage_end();
4796
+ return;
4797
+ }
4798
+ if (idof<F>() == idof<MOTDFields>()) {
4799
+ const fields = changetype<MOTDFields>(given);
4800
+ const out = new __MessageOut();
4801
+ { const value: boolean = fields.last ?? false; out.__setNumber(1, value ? 1 : 0); }
4802
+ { const value: string = fields.text ?? ""; out.__setText(2, value); }
4803
+ if (!out.begin("MOTD", dest, player, origin)) return;
4804
+ ewrite_byte(out.int(1));
4805
+ ewrite_string(out.text(2));
4806
+ emessage_end();
4807
+ return;
4808
+ }
4809
+ if (idof<F>() == idof<NVGToggleFields>()) {
4810
+ const fields = changetype<NVGToggleFields>(given);
4811
+ const out = new __MessageOut();
4812
+ { const value: boolean = fields.on ?? false; out.__setNumber(1, value ? 1 : 0); }
4813
+ if (!out.begin("NVGToggle", dest, player, origin)) return;
4814
+ ewrite_byte(out.int(1));
4815
+ emessage_end();
4816
+ return;
4817
+ }
4818
+ if (idof<F>() == idof<RadarFields>()) {
4819
+ const fields = changetype<RadarFields>(given);
4820
+ const out = new __MessageOut();
4821
+ { const value: Player | null = fields.target ?? null; out.__setNumber(1, value != null ? value.id : 0); }
4822
+ { const value: number[] = fields.origin ?? [0, 0, 0]; out.__setVector(2, value); }
4823
+ if (!out.begin("Radar", dest, player, origin)) return;
4824
+ ewrite_byte(out.int(1));
4825
+ ewrite_coord_f(out.number(2));
4826
+ ewrite_coord_f(out.number(3));
4827
+ ewrite_coord_f(out.number(4));
4828
+ emessage_end();
4829
+ return;
4830
+ }
4831
+ if (idof<F>() == idof<ResetHUDFields>()) {
4832
+ const fields = changetype<ResetHUDFields>(given);
4833
+ const out = new __MessageOut();
4834
+ if (!out.begin("ResetHUD", dest, player, origin)) return;
4835
+ emessage_end();
4836
+ return;
4837
+ }
4838
+ if (idof<F>() == idof<RoundTimeFields>()) {
4839
+ const fields = changetype<RoundTimeFields>(given);
4840
+ const out = new __MessageOut();
4841
+ { const value: number = fields.seconds ?? 0; out.__setNumber(1, value); }
4842
+ if (!out.begin("RoundTime", dest, player, origin)) return;
4843
+ ewrite_short(out.int(1));
4844
+ emessage_end();
4845
+ return;
4846
+ }
4847
+ if (idof<F>() == idof<SayTextFields>()) {
4848
+ const fields = changetype<SayTextFields>(given);
4849
+ const out = new __MessageOut();
4850
+ { const value: Player | null = fields.sender ?? null; out.__setNumber(1, value != null ? value.id : 0); }
4851
+ { const value: string = fields.text ?? ""; out.__setText(2, value); }
4852
+ { const value: string[] = fields.params ?? []; out.__setTexts(3, value); }
4853
+ if (!out.begin("SayText", dest, player, origin)) return;
4854
+ ewrite_byte(out.int(1));
4855
+ ewrite_string(out.text(2));
4856
+ for (let at = 3; at <= out.count; at++) ewrite_string(out.text(at));
4857
+ emessage_end();
4858
+ return;
4859
+ }
4860
+ if (idof<F>() == idof<ScenarioFields>()) {
4861
+ const fields = changetype<ScenarioFields>(given);
4862
+ const out = new __MessageOut();
4863
+ { const value: boolean = fields.active ?? false; out.__setNumber(1, value ? 1 : 0); }
4864
+ { const value: string = fields.sprite ?? ""; out.__setText(2, value); }
4865
+ { const value: number = fields.alpha ?? 0; out.__setNumber(3, value); }
4866
+ if (!out.begin("Scenario", dest, player, origin)) return;
4867
+ ewrite_byte(out.int(1));
4868
+ ewrite_string(out.text(2));
4869
+ ewrite_byte(out.int(3));
4870
+ emessage_end();
4871
+ return;
4872
+ }
4873
+ if (idof<F>() == idof<ScoreAttribFields>()) {
4874
+ const fields = changetype<ScoreAttribFields>(given);
4875
+ const out = new __MessageOut();
4876
+ { const value: Player | null = fields.target ?? null; out.__setNumber(1, value != null ? value.id : 0); }
4877
+ { const value: ScoreStatus[] = fields.flags ?? []; out.__setNumber(2, SCORE_STATUS.maskOf(value)); }
4878
+ if (!out.begin("ScoreAttrib", dest, player, origin)) return;
4879
+ ewrite_byte(out.int(1));
4880
+ ewrite_byte(out.int(2));
4881
+ emessage_end();
4882
+ return;
4883
+ }
4884
+ if (idof<F>() == idof<ScoreInfoFields>()) {
4885
+ const fields = changetype<ScoreInfoFields>(given);
4886
+ const out = new __MessageOut();
4887
+ { const value: Player | null = fields.target ?? null; out.__setNumber(1, value != null ? value.id : 0); }
4888
+ { const value: number = fields.frags ?? 0; out.__setNumber(2, value); }
4889
+ { const value: number = fields.deaths ?? 0; out.__setNumber(3, value); }
4890
+ { const value: Team = fields.team ?? "UNASSIGNED"; out.__setNumber(5, max(MESSAGE_TEAMS.indexOf(value), 0)); }
4891
+ if (!out.begin("ScoreInfo", dest, player, origin)) return;
4892
+ ewrite_byte(out.int(1));
4893
+ ewrite_short(out.int(2));
4894
+ ewrite_short(out.int(3));
4895
+ ewrite_short(0);
4896
+ ewrite_short(out.int(5));
4897
+ emessage_end();
4898
+ return;
4899
+ }
4900
+ if (idof<F>() == idof<ScreenFadeFields>()) {
4901
+ const fields = changetype<ScreenFadeFields>(given);
4902
+ const out = new __MessageOut();
4903
+ { const value: number = fields.duration ?? 0; out.__setNumber(1, Math.round(value * 4096.0)); }
4904
+ { const value: number = fields.hold ?? 0; out.__setNumber(2, Math.round(value * 4096.0)); }
4905
+ { const value: FadeDirection = fields.direction ?? "in"; out.__setBit(3, FFADE_OUT, value == "out"); }
4906
+ { const value: boolean = fields.modulate ?? false; out.__setBit(3, 2, value); }
4907
+ { const value: boolean = fields.stay ?? false; out.__setBit(3, 4, value); }
4908
+ { const value: number[] = fields.color ?? []; out.__setBytes(4, value); }
4909
+ if (!out.begin("ScreenFade", dest, player, origin)) return;
4910
+ ewrite_short(out.int(1));
4911
+ ewrite_short(out.int(2));
4912
+ ewrite_short(out.int(3));
4913
+ ewrite_byte(out.int(4));
4914
+ ewrite_byte(out.int(5));
4915
+ ewrite_byte(out.int(6));
4916
+ ewrite_byte(out.int(7));
4917
+ emessage_end();
4918
+ return;
4919
+ }
4920
+ if (idof<F>() == idof<ScreenShakeFields>()) {
4921
+ const fields = changetype<ScreenShakeFields>(given);
4922
+ const out = new __MessageOut();
4923
+ { const value: number = fields.amplitude ?? 0; out.__setNumber(1, Math.round(value * 4096.0)); }
4924
+ { const value: number = fields.duration ?? 0; out.__setNumber(2, Math.round(value * 4096.0)); }
4925
+ { const value: number = fields.frequency ?? 0; out.__setNumber(3, Math.round(value * 256.0)); }
4926
+ if (!out.begin("ScreenShake", dest, player, origin)) return;
4927
+ ewrite_short(out.int(1));
4928
+ ewrite_short(out.int(2));
4929
+ ewrite_short(out.int(3));
4930
+ emessage_end();
4931
+ return;
4932
+ }
4933
+ if (idof<F>() == idof<SendAudioFields>()) {
4934
+ const fields = changetype<SendAudioFields>(given);
4935
+ const out = new __MessageOut();
4936
+ { const value: Player | null = fields.sender ?? null; out.__setNumber(1, value != null ? value.id : 0); }
4937
+ { const value: string = fields.sound ?? ""; out.__setText(2, value); }
4938
+ { const value: number = fields.pitch ?? 0; out.__setNumber(3, value); }
4939
+ if (!out.begin("SendAudio", dest, player, origin)) return;
4940
+ ewrite_byte(out.int(1));
4941
+ ewrite_string(out.text(2));
4942
+ ewrite_short(out.int(3));
4943
+ emessage_end();
4944
+ return;
4945
+ }
4946
+ if (idof<F>() == idof<ServerNameFields>()) {
4947
+ const fields = changetype<ServerNameFields>(given);
4948
+ const out = new __MessageOut();
4949
+ { const value: string = fields.serverName ?? ""; out.__setText(1, value); }
4950
+ if (!out.begin("ServerName", dest, player, origin)) return;
4951
+ ewrite_string(out.text(1));
4952
+ emessage_end();
4953
+ return;
4954
+ }
4955
+ if (idof<F>() == idof<SetFOVFields>()) {
4956
+ const fields = changetype<SetFOVFields>(given);
4957
+ const out = new __MessageOut();
4958
+ { const value: number = fields.fov ?? 0; out.__setNumber(1, value); }
4959
+ if (!out.begin("SetFOV", dest, player, origin)) return;
4960
+ ewrite_byte(out.int(1));
4961
+ emessage_end();
4962
+ return;
4963
+ }
4964
+ if (idof<F>() == idof<ShowTimerFields>()) {
4965
+ const fields = changetype<ShowTimerFields>(given);
4966
+ const out = new __MessageOut();
4967
+ if (!out.begin("ShowTimer", dest, player, origin)) return;
4968
+ emessage_end();
4969
+ return;
4970
+ }
4971
+ if (idof<F>() == idof<SpecHealth2Fields>()) {
4972
+ const fields = changetype<SpecHealth2Fields>(given);
4973
+ const out = new __MessageOut();
4974
+ { const value: number = fields.health ?? 0; out.__setNumber(1, value); }
4975
+ { const value: Player | null = fields.target ?? null; out.__setNumber(2, value != null ? value.id : 0); }
4976
+ if (!out.begin("SpecHealth2", dest, player, origin)) return;
4977
+ ewrite_byte(out.int(1));
4978
+ ewrite_byte(out.int(2));
4979
+ emessage_end();
4980
+ return;
4981
+ }
4982
+ if (idof<F>() == idof<SpectatorFields>()) {
4983
+ const fields = changetype<SpectatorFields>(given);
4984
+ const out = new __MessageOut();
4985
+ { const value: Player | null = fields.target ?? null; out.__setNumber(1, value != null ? value.id : 0); }
4986
+ { const value: boolean = fields.spectator ?? false; out.__setNumber(2, value ? 1 : 0); }
4987
+ if (!out.begin("Spectator", dest, player, origin)) return;
4988
+ ewrite_byte(out.int(1));
4989
+ ewrite_byte(out.int(2));
4990
+ emessage_end();
4991
+ return;
4992
+ }
4993
+ if (idof<F>() == idof<StatusIconFields>()) {
4994
+ const fields = changetype<StatusIconFields>(given);
4995
+ const out = new __MessageOut();
4996
+ { const value: StatusIconState = fields.state ?? "hide"; out.__setNumber(1, max(STATUS_ICON_STATES.indexOf(value), 0)); }
4997
+ { const value: string = fields.sprite ?? ""; out.__setText(2, value); }
4998
+ { const value: number[] = fields.color ?? []; out.__setBytes(3, value); }
4999
+ if (!out.begin("StatusIcon", dest, player, origin)) return;
5000
+ ewrite_byte(out.int(1));
5001
+ ewrite_string(out.text(2));
5002
+ ewrite_byte(out.int(3));
5003
+ ewrite_byte(out.int(4));
5004
+ ewrite_byte(out.int(5));
5005
+ emessage_end();
5006
+ return;
5007
+ }
5008
+ if (idof<F>() == idof<StatusTextFields>()) {
5009
+ const fields = changetype<StatusTextFields>(given);
5010
+ const out = new __MessageOut();
5011
+ { const value: number = fields.line ?? 0; out.__setNumber(1, value); }
5012
+ { const value: string = fields.text ?? ""; out.__setText(2, value); }
5013
+ if (!out.begin("StatusText", dest, player, origin)) return;
5014
+ ewrite_byte(out.int(1));
5015
+ ewrite_string(out.text(2));
5016
+ emessage_end();
5017
+ return;
5018
+ }
5019
+ if (idof<F>() == idof<StatusValueFields>()) {
5020
+ const fields = changetype<StatusValueFields>(given);
5021
+ const out = new __MessageOut();
5022
+ { const value: number = fields.slot ?? 0; out.__setNumber(1, value); }
5023
+ { const value: number = fields.value ?? 0; out.__setNumber(2, value); }
5024
+ if (!out.begin("StatusValue", dest, player, origin)) return;
5025
+ ewrite_byte(out.int(1));
5026
+ ewrite_short(out.int(2));
5027
+ emessage_end();
5028
+ return;
5029
+ }
5030
+ if (idof<F>() == idof<TaskTimeFields>()) {
5031
+ const fields = changetype<TaskTimeFields>(given);
5032
+ const out = new __MessageOut();
5033
+ { const value: number = fields.seconds ?? 0; out.__setNumber(1, value); }
5034
+ { const value: boolean = fields.active ?? false; out.__setNumber(2, value ? 1 : 0); }
5035
+ { const value: number = fields.fade ?? 0; out.__setNumber(3, value); }
5036
+ if (!out.begin("TaskTime", dest, player, origin)) return;
5037
+ ewrite_short(out.int(1));
5038
+ ewrite_byte(out.int(2));
5039
+ ewrite_byte(out.int(3));
5040
+ emessage_end();
5041
+ return;
5042
+ }
5043
+ if (idof<F>() == idof<TeamInfoFields>()) {
5044
+ const fields = changetype<TeamInfoFields>(given);
5045
+ const out = new __MessageOut();
5046
+ { const value: Player | null = fields.target ?? null; out.__setNumber(1, value != null ? value.id : 0); }
5047
+ { const value: Team = fields.team ?? "UNASSIGNED"; out.__setText(2, value); }
5048
+ if (!out.begin("TeamInfo", dest, player, origin)) return;
5049
+ ewrite_byte(out.int(1));
5050
+ ewrite_string(out.text(2));
5051
+ emessage_end();
5052
+ return;
5053
+ }
5054
+ if (idof<F>() == idof<TeamScoreFields>()) {
5055
+ const fields = changetype<TeamScoreFields>(given);
5056
+ const out = new __MessageOut();
5057
+ { const value: Team = fields.team ?? "UNASSIGNED"; out.__setText(1, value); }
5058
+ { const value: number = fields.score ?? 0; out.__setNumber(2, value); }
5059
+ if (!out.begin("TeamScore", dest, player, origin)) return;
5060
+ ewrite_string(out.text(1));
5061
+ ewrite_short(out.int(2));
5062
+ emessage_end();
5063
+ return;
5064
+ }
5065
+ if (idof<F>() == idof<TextMsgFields>()) {
5066
+ const fields = changetype<TextMsgFields>(given);
5067
+ const out = new __MessageOut();
5068
+ { const value: VariantName = fields.destination ?? "notify"; out.__setNumber(1, max(MESSAGE_DESTINATIONS.indexOf(value), 1)); }
5069
+ { const value: string = fields.text ?? ""; out.__setText(2, value); }
5070
+ { const value: string[] = fields.params ?? []; out.__setTexts(3, value); }
5071
+ if (!out.begin("TextMsg", dest, player, origin)) return;
5072
+ ewrite_byte(out.int(1));
5073
+ ewrite_string(out.text(2));
5074
+ for (let at = 3; at <= out.count; at++) ewrite_string(out.text(at));
5075
+ emessage_end();
5076
+ return;
5077
+ }
5078
+ if (idof<F>() == idof<TrainFields>()) {
5079
+ const fields = changetype<TrainFields>(given);
5080
+ const out = new __MessageOut();
5081
+ { const value: number = fields.speed ?? 0; out.__setNumber(1, value); }
5082
+ if (!out.begin("Train", dest, player, origin)) return;
5083
+ ewrite_byte(out.int(1));
5084
+ emessage_end();
5085
+ return;
5086
+ }
5087
+ if (idof<F>() == idof<TutorCloseFields>()) {
5088
+ const fields = changetype<TutorCloseFields>(given);
5089
+ const out = new __MessageOut();
5090
+ if (!out.begin("TutorClose", dest, player, origin)) return;
5091
+ emessage_end();
5092
+ return;
5093
+ }
5094
+ if (idof<F>() == idof<ViewModeFields>()) {
5095
+ const fields = changetype<ViewModeFields>(given);
5096
+ const out = new __MessageOut();
5097
+ if (!out.begin("ViewMode", dest, player, origin)) return;
5098
+ emessage_end();
5099
+ return;
5100
+ }
5101
+ if (idof<F>() == idof<WeaponListFields>()) {
5102
+ const fields = changetype<WeaponListFields>(given);
5103
+ const out = new __MessageOut();
5104
+ { const value: string = fields.classname ?? ""; out.__setText(1, value); }
5105
+ { const value: number = fields.ammo ?? 0; out.__setNumber(2, value); }
5106
+ { const value: number = fields.maxAmmo ?? 0; out.__setNumber(3, value); }
5107
+ { const value: number = fields.ammo2 ?? 0; out.__setNumber(4, value); }
5108
+ { const value: number = fields.maxAmmo2 ?? 0; out.__setNumber(5, value); }
5109
+ { const value: number = fields.slot ?? 0; out.__setNumber(6, value); }
5110
+ { const value: number = fields.position ?? 0; out.__setNumber(7, value); }
5111
+ { const value: WeaponKind = fields.weapon ?? "none"; out.__setNumber(8, weaponIdOf(value)); }
5112
+ { const value: number = fields.flags ?? 0; out.__setNumber(9, value); }
5113
+ if (!out.begin("WeaponList", dest, player, origin)) return;
5114
+ ewrite_string(out.text(1));
5115
+ ewrite_byte(out.int(2));
5116
+ ewrite_byte(out.int(3));
5117
+ ewrite_byte(out.int(4));
5118
+ ewrite_byte(out.int(5));
5119
+ ewrite_byte(out.int(6));
5120
+ ewrite_byte(out.int(7));
5121
+ ewrite_byte(out.int(8));
5122
+ ewrite_byte(out.int(9));
5123
+ emessage_end();
5124
+ return;
5125
+ }
5126
+ if (idof<F>() == idof<WeapPickupFields>()) {
5127
+ const fields = changetype<WeapPickupFields>(given);
5128
+ const out = new __MessageOut();
5129
+ { const value: WeaponKind = fields.weapon ?? "none"; out.__setNumber(1, weaponIdOf(value)); }
5130
+ if (!out.begin("WeapPickup", dest, player, origin)) return;
5131
+ ewrite_byte(out.int(1));
5132
+ emessage_end();
5133
+ return;
5134
+ }
5135
+ }
5136
+
3033
5137
  /** The game's names of the messages a name server.addMessageListener takes hears; a name it does not know as it is. */
3034
5138
  export function protocolMessageNames(name: string): string[] {
3035
5139
  if (name == "adStop") return ["ADStop"];
@@ -3113,510 +5217,1221 @@ export function protocolMessageNames(name: string): string[] {
3113
5217
  return [name];
3114
5218
  }
3115
5219
 
3116
- const initListeners: ((event: PluginInitEvent) => void)[] = [];
5220
+ const initListeners = new __Listeners<(event: PluginInitEvent) => void>();
5221
+ let initView: PluginInitEvent | null = null;
3117
5222
 
3118
- function initTrampoline(a0: i32): void {
3119
- if (initListeners.length == 0) return;
3120
- const event = new PluginInitEvent();
3121
- // A copy: a listener that removes itself must not make the next one skip.
3122
- const listeners = initListeners.slice(0);
3123
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5223
+ // @ts-ignore: decorator
5224
+ @inline function initObject(): PluginInitEvent {
5225
+ let event = initView;
5226
+ if (event == null) initView = event = new PluginInitEvent();
5227
+ return event;
3124
5228
  }
3125
5229
 
3126
- const pauseListeners: ((event: PluginPauseEvent) => void)[] = [];
3127
-
3128
- function pauseTrampoline(a0: i32): void {
3129
- if (pauseListeners.length == 0) return;
3130
- const event = new PluginPauseEvent();
3131
- // A copy: a listener that removes itself must not make the next one skip.
3132
- const listeners = pauseListeners.slice(0);
3133
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5230
+ function initTrampoline(a0: i32): void {
5231
+ if (initListeners.count == 0) return;
5232
+ const event = initObject();
5233
+ const listeners = initListeners;
5234
+ const n = listeners.begin();
5235
+ for (let i = 0; i < n; i++) {
5236
+ const listener = listeners.at(i);
5237
+ if (listener) listener(event);
5238
+ }
5239
+ listeners.end();
5240
+ }
5241
+
5242
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5243
+ function initDirect(): void {
5244
+ const listeners = initListeners;
5245
+ if (listeners.count == 0) return;
5246
+ let listener: usize = 0;
5247
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5248
+ const one = listeners.at(i);
5249
+ if (one == null) continue;
5250
+ listener = changetype<usize>(one);
5251
+ break;
5252
+ }
5253
+ __onDirect("plugin_init", initTrampoline.index, listener, listener != 0 ? changetype<usize>(initObject()) : 0, false);
3134
5254
  }
3135
5255
 
3136
- const unpauseListeners: ((event: PluginUnpauseEvent) => void)[] = [];
5256
+ const changeLevelListeners = new __Listeners<(event: ServerChangelevelEvent) => void>();
5257
+ let changeLevelView: ServerChangelevelEvent | null = null;
3137
5258
 
3138
- function unpauseTrampoline(a0: i32): void {
3139
- if (unpauseListeners.length == 0) return;
3140
- const event = new PluginUnpauseEvent();
3141
- // A copy: a listener that removes itself must not make the next one skip.
3142
- const listeners = unpauseListeners.slice(0);
3143
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5259
+ // @ts-ignore: decorator
5260
+ @inline function changeLevelObject(): ServerChangelevelEvent {
5261
+ let event = changeLevelView;
5262
+ if (event == null) changeLevelView = event = new ServerChangelevelEvent();
5263
+ return event;
3144
5264
  }
3145
5265
 
3146
- const changeLevelListeners: ((event: ServerChangelevelEvent) => void)[] = [];
3147
-
3148
5266
  function changeLevelTrampoline(a0: i32): void {
3149
- if (changeLevelListeners.length == 0) return;
3150
- const event = new ServerChangelevelEvent(__nativeString(0));
3151
- // A copy: a listener that removes itself must not make the next one skip.
3152
- const listeners = changeLevelListeners.slice(0);
3153
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5267
+ if (changeLevelListeners.count == 0) return;
5268
+ const event = changeLevelObject();
5269
+ const listeners = changeLevelListeners;
5270
+ const n = listeners.begin();
5271
+ for (let i = 0; i < n; i++) {
5272
+ const listener = listeners.at(i);
5273
+ if (listener) listener(event);
5274
+ }
5275
+ listeners.end();
5276
+ }
5277
+
5278
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5279
+ function changeLevelDirect(): void {
5280
+ const listeners = changeLevelListeners;
5281
+ if (listeners.count == 0) return;
5282
+ let listener: usize = 0;
5283
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5284
+ const one = listeners.at(i);
5285
+ if (one == null) continue;
5286
+ listener = changetype<usize>(one);
5287
+ break;
5288
+ }
5289
+ __onDirect("server_changelevel", changeLevelTrampoline.index, listener, listener != 0 ? changetype<usize>(changeLevelObject()) : 0, false);
3154
5290
  }
3155
5291
 
3156
- const pluginsLoadedListeners: ((event: PluginCfgEvent) => void)[] = [];
5292
+ const pluginsLoadedListeners = new __Listeners<(event: PluginCfgEvent) => void>();
5293
+ let pluginsLoadedView: PluginCfgEvent | null = null;
5294
+
5295
+ // @ts-ignore: decorator
5296
+ @inline function pluginsLoadedObject(): PluginCfgEvent {
5297
+ let event = pluginsLoadedView;
5298
+ if (event == null) pluginsLoadedView = event = new PluginCfgEvent();
5299
+ return event;
5300
+ }
3157
5301
 
3158
5302
  function pluginsLoadedTrampoline(a0: i32): void {
3159
- if (pluginsLoadedListeners.length == 0) return;
3160
- const event = new PluginCfgEvent();
3161
- // A copy: a listener that removes itself must not make the next one skip.
3162
- const listeners = pluginsLoadedListeners.slice(0);
3163
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5303
+ if (pluginsLoadedListeners.count == 0) return;
5304
+ const event = pluginsLoadedObject();
5305
+ const listeners = pluginsLoadedListeners;
5306
+ const n = listeners.begin();
5307
+ for (let i = 0; i < n; i++) {
5308
+ const listener = listeners.at(i);
5309
+ if (listener) listener(event);
5310
+ }
5311
+ listeners.end();
5312
+ }
5313
+
5314
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5315
+ function pluginsLoadedDirect(): void {
5316
+ const listeners = pluginsLoadedListeners;
5317
+ if (listeners.count == 0) return;
5318
+ let listener: usize = 0;
5319
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5320
+ const one = listeners.at(i);
5321
+ if (one == null) continue;
5322
+ listener = changetype<usize>(one);
5323
+ break;
5324
+ }
5325
+ __onDirect("plugin_cfg", pluginsLoadedTrampoline.index, listener, listener != 0 ? changetype<usize>(pluginsLoadedObject()) : 0, false);
3164
5326
  }
3165
5327
 
3166
- const endListeners: ((event: PluginEndEvent) => void)[] = [];
5328
+ const endListeners = new __Listeners<(event: PluginEndEvent) => void>();
5329
+ let endView: PluginEndEvent | null = null;
5330
+
5331
+ // @ts-ignore: decorator
5332
+ @inline function endObject(): PluginEndEvent {
5333
+ let event = endView;
5334
+ if (event == null) endView = event = new PluginEndEvent();
5335
+ return event;
5336
+ }
3167
5337
 
3168
5338
  function endTrampoline(a0: i32): void {
3169
- if (endListeners.length == 0) return;
3170
- const event = new PluginEndEvent();
3171
- // A copy: a listener that removes itself must not make the next one skip.
3172
- const listeners = endListeners.slice(0);
3173
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5339
+ if (endListeners.count == 0) return;
5340
+ const event = endObject();
5341
+ const listeners = endListeners;
5342
+ const n = listeners.begin();
5343
+ for (let i = 0; i < n; i++) {
5344
+ const listener = listeners.at(i);
5345
+ if (listener) listener(event);
5346
+ }
5347
+ listeners.end();
5348
+ }
5349
+
5350
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5351
+ function endDirect(): void {
5352
+ const listeners = endListeners;
5353
+ if (listeners.count == 0) return;
5354
+ let listener: usize = 0;
5355
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5356
+ const one = listeners.at(i);
5357
+ if (one == null) continue;
5358
+ listener = changetype<usize>(one);
5359
+ break;
5360
+ }
5361
+ __onDirect("plugin_end", endTrampoline.index, listener, listener != 0 ? changetype<usize>(endObject()) : 0, false);
3174
5362
  }
3175
5363
 
3176
- const logListeners: ((event: PluginLogEvent) => void)[] = [];
5364
+ const logListeners = new __Listeners<(event: PluginLogEvent) => void>();
5365
+ let logView: PluginLogEvent | null = null;
5366
+
5367
+ // @ts-ignore: decorator
5368
+ @inline function logObject(): PluginLogEvent {
5369
+ let event = logView;
5370
+ if (event == null) logView = event = new PluginLogEvent();
5371
+ return event;
5372
+ }
3177
5373
 
3178
5374
  function logTrampoline(a0: i32): void {
3179
- if (logListeners.length == 0) return;
3180
- const event = new PluginLogEvent();
3181
- // A copy: a listener that removes itself must not make the next one skip.
3182
- const listeners = logListeners.slice(0);
3183
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5375
+ if (logListeners.count == 0) return;
5376
+ const event = logObject();
5377
+ const listeners = logListeners;
5378
+ const n = listeners.begin();
5379
+ for (let i = 0; i < n; i++) {
5380
+ const listener = listeners.at(i);
5381
+ if (listener) listener(event);
5382
+ }
5383
+ listeners.end();
5384
+ }
5385
+
5386
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5387
+ function logDirect(): void {
5388
+ const listeners = logListeners;
5389
+ if (listeners.count == 0) return;
5390
+ let listener: usize = 0;
5391
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5392
+ const one = listeners.at(i);
5393
+ if (one == null) continue;
5394
+ listener = changetype<usize>(one);
5395
+ break;
5396
+ }
5397
+ __onDirect("plugin_log", logTrampoline.index, listener, listener != 0 ? changetype<usize>(logObject()) : 0, false);
3184
5398
  }
3185
5399
 
3186
- const precacheListeners: ((event: PluginPrecacheEvent) => void)[] = [];
5400
+ const precacheListeners = new __Listeners<(event: PluginPrecacheEvent) => void>();
5401
+ let precacheView: PluginPrecacheEvent | null = null;
5402
+
5403
+ // @ts-ignore: decorator
5404
+ @inline function precacheObject(): PluginPrecacheEvent {
5405
+ let event = precacheView;
5406
+ if (event == null) precacheView = event = new PluginPrecacheEvent();
5407
+ return event;
5408
+ }
3187
5409
 
3188
5410
  function precacheTrampoline(a0: i32): void {
3189
- if (precacheListeners.length == 0) return;
3190
- const event = new PluginPrecacheEvent();
3191
- // A copy: a listener that removes itself must not make the next one skip.
3192
- const listeners = precacheListeners.slice(0);
3193
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5411
+ if (precacheListeners.count == 0) return;
5412
+ const event = precacheObject();
5413
+ const listeners = precacheListeners;
5414
+ const n = listeners.begin();
5415
+ for (let i = 0; i < n; i++) {
5416
+ const listener = listeners.at(i);
5417
+ if (listener) listener(event);
5418
+ }
5419
+ listeners.end();
5420
+ }
5421
+
5422
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5423
+ function precacheDirect(): void {
5424
+ const listeners = precacheListeners;
5425
+ if (listeners.count == 0) return;
5426
+ let listener: usize = 0;
5427
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5428
+ const one = listeners.at(i);
5429
+ if (one == null) continue;
5430
+ listener = changetype<usize>(one);
5431
+ break;
5432
+ }
5433
+ __onDirect("plugin_precache", precacheTrampoline.index, listener, listener != 0 ? changetype<usize>(precacheObject()) : 0, false);
3194
5434
  }
3195
5435
 
3196
- const clientInfochangedListeners: ((event: ClientInfochangedEvent) => void)[] = [];
5436
+ const clientInfochangedListeners = new __Listeners<(event: ClientInfochangedEvent) => void>();
5437
+ let clientInfochangedView: ClientInfochangedEvent | null = null;
5438
+
5439
+ // @ts-ignore: decorator
5440
+ @inline function clientInfochangedObject(): ClientInfochangedEvent {
5441
+ let event = clientInfochangedView;
5442
+ if (event == null) clientInfochangedView = event = new ClientInfochangedEvent();
5443
+ return event;
5444
+ }
3197
5445
 
3198
5446
  function clientInfochangedTrampoline(a0: i32): void {
3199
- if (clientInfochangedListeners.length == 0) return;
3200
- const event = new ClientInfochangedEvent(new Player(__nativeCell(0)));
3201
- // A copy: a listener that removes itself must not make the next one skip.
3202
- const listeners = clientInfochangedListeners.slice(0);
5447
+ if (clientInfochangedListeners.count == 0) return;
5448
+ const event = clientInfochangedObject();
5449
+ const listeners = clientInfochangedListeners;
5450
+ const n = listeners.begin();
3203
5451
  const ambient = __co_ambient_player;
3204
5452
  __co_ambient_player = a0;
3205
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5453
+ for (let i = 0; i < n; i++) {
5454
+ const listener = listeners.at(i);
5455
+ if (listener) listener(event);
5456
+ }
3206
5457
  __co_ambient_player = ambient;
5458
+ listeners.end();
5459
+ }
5460
+
5461
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5462
+ function clientInfochangedDirect(): void {
5463
+ const listeners = clientInfochangedListeners;
5464
+ if (listeners.count == 0) return;
5465
+ let listener: usize = 0;
5466
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5467
+ const one = listeners.at(i);
5468
+ if (one == null) continue;
5469
+ listener = changetype<usize>(one);
5470
+ break;
5471
+ }
5472
+ __onDirect("client_infochanged", clientInfochangedTrampoline.index, listener, listener != 0 ? changetype<usize>(clientInfochangedObject()) : 0, true);
3207
5473
  }
3208
5474
 
3209
- const connectListeners: ((event: ClientConnectEvent) => void)[] = [];
5475
+ const connectListeners = new __Listeners<(event: ClientConnectEvent) => void>();
5476
+ let connectView: ClientConnectEvent | null = null;
5477
+
5478
+ // @ts-ignore: decorator
5479
+ @inline function connectObject(): ClientConnectEvent {
5480
+ let event = connectView;
5481
+ if (event == null) connectView = event = new ClientConnectEvent();
5482
+ return event;
5483
+ }
3210
5484
 
3211
5485
  function connectTrampoline(a0: i32): void {
3212
- if (connectListeners.length == 0) return;
3213
- const event = new ClientConnectEvent(new Player(__nativeCell(0)));
3214
- // A copy: a listener that removes itself must not make the next one skip.
3215
- const listeners = connectListeners.slice(0);
5486
+ if (connectListeners.count == 0) return;
5487
+ const event = connectObject();
5488
+ const listeners = connectListeners;
5489
+ const n = listeners.begin();
3216
5490
  const ambient = __co_ambient_player;
3217
5491
  __co_ambient_player = a0;
3218
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5492
+ for (let i = 0; i < n; i++) {
5493
+ const listener = listeners.at(i);
5494
+ if (listener) listener(event);
5495
+ }
3219
5496
  __co_ambient_player = ambient;
5497
+ listeners.end();
5498
+ }
5499
+
5500
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5501
+ function connectDirect(): void {
5502
+ const listeners = connectListeners;
5503
+ if (listeners.count == 0) return;
5504
+ let listener: usize = 0;
5505
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5506
+ const one = listeners.at(i);
5507
+ if (one == null) continue;
5508
+ listener = changetype<usize>(one);
5509
+ break;
5510
+ }
5511
+ __onDirect("client_connect", connectTrampoline.index, listener, listener != 0 ? changetype<usize>(connectObject()) : 0, true);
3220
5512
  }
3221
5513
 
3222
- const connectAttemptListeners: ((event: ClientConnectexEvent) => void)[] = [];
5514
+ const connectAttemptListeners = new __Listeners<(event: ClientConnectexEvent) => void>();
5515
+ let connectAttemptView: ClientConnectexEvent | null = null;
5516
+
5517
+ // @ts-ignore: decorator
5518
+ @inline function connectAttemptObject(): ClientConnectexEvent {
5519
+ let event = connectAttemptView;
5520
+ if (event == null) connectAttemptView = event = new ClientConnectexEvent();
5521
+ return event;
5522
+ }
3223
5523
 
3224
5524
  function connectAttemptTrampoline(a0: i32): void {
3225
- if (connectAttemptListeners.length == 0) return;
3226
- const event = new ClientConnectexEvent(new Player(__nativeCell(0)), __nativeString(1), __nativeString(2), __nativeString(3));
3227
- // A copy: a listener that removes itself must not make the next one skip.
3228
- const listeners = connectAttemptListeners.slice(0);
5525
+ if (connectAttemptListeners.count == 0) return;
5526
+ const event = connectAttemptObject();
5527
+ const listeners = connectAttemptListeners;
5528
+ const n = listeners.begin();
3229
5529
  const ambient = __co_ambient_player;
3230
5530
  __co_ambient_player = a0;
3231
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5531
+ for (let i = 0; i < n; i++) {
5532
+ const listener = listeners.at(i);
5533
+ if (listener) listener(event);
5534
+ }
3232
5535
  __co_ambient_player = ambient;
5536
+ listeners.end();
5537
+ }
5538
+
5539
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5540
+ function connectAttemptDirect(): void {
5541
+ const listeners = connectAttemptListeners;
5542
+ if (listeners.count == 0) return;
5543
+ let listener: usize = 0;
5544
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5545
+ const one = listeners.at(i);
5546
+ if (one == null) continue;
5547
+ listener = changetype<usize>(one);
5548
+ break;
5549
+ }
5550
+ __onDirect("client_connectex", connectAttemptTrampoline.index, listener, listener != 0 ? changetype<usize>(connectAttemptObject()) : 0, true);
3233
5551
  }
3234
5552
 
3235
- const authorizedListeners: ((event: ClientAuthorizedEvent) => void)[] = [];
5553
+ const authorizedListeners = new __Listeners<(event: ClientAuthorizedEvent) => void>();
5554
+ let authorizedView: ClientAuthorizedEvent | null = null;
5555
+
5556
+ // @ts-ignore: decorator
5557
+ @inline function authorizedObject(): ClientAuthorizedEvent {
5558
+ let event = authorizedView;
5559
+ if (event == null) authorizedView = event = new ClientAuthorizedEvent();
5560
+ return event;
5561
+ }
3236
5562
 
3237
5563
  function authorizedTrampoline(a0: i32): void {
3238
- if (authorizedListeners.length == 0) return;
3239
- const event = new ClientAuthorizedEvent(new Player(__nativeCell(0)), __nativeString(1));
3240
- // A copy: a listener that removes itself must not make the next one skip.
3241
- const listeners = authorizedListeners.slice(0);
5564
+ if (authorizedListeners.count == 0) return;
5565
+ const event = authorizedObject();
5566
+ const listeners = authorizedListeners;
5567
+ const n = listeners.begin();
3242
5568
  const ambient = __co_ambient_player;
3243
5569
  __co_ambient_player = a0;
3244
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5570
+ for (let i = 0; i < n; i++) {
5571
+ const listener = listeners.at(i);
5572
+ if (listener) listener(event);
5573
+ }
3245
5574
  __co_ambient_player = ambient;
5575
+ listeners.end();
5576
+ }
5577
+
5578
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5579
+ function authorizedDirect(): void {
5580
+ const listeners = authorizedListeners;
5581
+ if (listeners.count == 0) return;
5582
+ let listener: usize = 0;
5583
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5584
+ const one = listeners.at(i);
5585
+ if (one == null) continue;
5586
+ listener = changetype<usize>(one);
5587
+ break;
5588
+ }
5589
+ __onDirect("client_authorized", authorizedTrampoline.index, listener, listener != 0 ? changetype<usize>(authorizedObject()) : 0, true);
3246
5590
  }
3247
5591
 
3248
- const disconnectedListeners: ((event: ClientDisconnectedEvent) => void)[] = [];
5592
+ const disconnectedListeners = new __Listeners<(event: ClientDisconnectedEvent) => void>();
5593
+ let disconnectedView: ClientDisconnectedEvent | null = null;
5594
+
5595
+ // @ts-ignore: decorator
5596
+ @inline function disconnectedObject(): ClientDisconnectedEvent {
5597
+ let event = disconnectedView;
5598
+ if (event == null) disconnectedView = event = new ClientDisconnectedEvent();
5599
+ return event;
5600
+ }
3249
5601
 
3250
5602
  function disconnectedTrampoline(a0: i32): void {
3251
- if (disconnectedListeners.length == 0) return;
3252
- const event = new ClientDisconnectedEvent(new Player(__nativeCell(0)), __nativeCell(1) != 0, __nativeString(2));
3253
- // A copy: a listener that removes itself must not make the next one skip.
3254
- const listeners = disconnectedListeners.slice(0);
3255
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5603
+ if (disconnectedListeners.count == 0) return;
5604
+ const event = disconnectedObject();
5605
+ const listeners = disconnectedListeners;
5606
+ const n = listeners.begin();
5607
+ for (let i = 0; i < n; i++) {
5608
+ const listener = listeners.at(i);
5609
+ if (listener) listener(event);
5610
+ }
5611
+ listeners.end();
5612
+ }
5613
+
5614
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5615
+ function disconnectedDirect(): void {
5616
+ const listeners = disconnectedListeners;
5617
+ if (listeners.count == 0) return;
5618
+ let listener: usize = 0;
5619
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5620
+ const one = listeners.at(i);
5621
+ if (one == null) continue;
5622
+ listener = changetype<usize>(one);
5623
+ break;
5624
+ }
5625
+ __onDirect("client_disconnected", disconnectedTrampoline.index, listener, listener != 0 ? changetype<usize>(disconnectedObject()) : 0, false);
3256
5626
  }
3257
5627
 
3258
- const removeListeners: ((event: ClientRemoveEvent) => void)[] = [];
5628
+ const removeListeners = new __Listeners<(event: ClientRemoveEvent) => void>();
5629
+ let removeView: ClientRemoveEvent | null = null;
5630
+
5631
+ // @ts-ignore: decorator
5632
+ @inline function removeObject(): ClientRemoveEvent {
5633
+ let event = removeView;
5634
+ if (event == null) removeView = event = new ClientRemoveEvent();
5635
+ return event;
5636
+ }
3259
5637
 
3260
5638
  function removeTrampoline(a0: i32): void {
3261
- if (removeListeners.length == 0) return;
3262
- const event = new ClientRemoveEvent(new Player(__nativeCell(0)), __nativeCell(1) != 0, __nativeString(2));
3263
- // A copy: a listener that removes itself must not make the next one skip.
3264
- const listeners = removeListeners.slice(0);
3265
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5639
+ if (removeListeners.count == 0) return;
5640
+ const event = removeObject();
5641
+ const listeners = removeListeners;
5642
+ const n = listeners.begin();
5643
+ for (let i = 0; i < n; i++) {
5644
+ const listener = listeners.at(i);
5645
+ if (listener) listener(event);
5646
+ }
5647
+ listeners.end();
5648
+ }
5649
+
5650
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5651
+ function removeDirect(): void {
5652
+ const listeners = removeListeners;
5653
+ if (listeners.count == 0) return;
5654
+ let listener: usize = 0;
5655
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5656
+ const one = listeners.at(i);
5657
+ if (one == null) continue;
5658
+ listener = changetype<usize>(one);
5659
+ break;
5660
+ }
5661
+ __onDirect("client_remove", removeTrampoline.index, listener, listener != 0 ? changetype<usize>(removeObject()) : 0, false);
3266
5662
  }
3267
5663
 
3268
- const commandListeners: ((event: ClientCommandEvent) => void)[] = [];
5664
+ const commandListeners = new __Listeners<(event: ClientCommandEvent) => void>();
5665
+ let commandView: ClientCommandEvent | null = null;
5666
+
5667
+ // @ts-ignore: decorator
5668
+ @inline function commandObject(): ClientCommandEvent {
5669
+ let event = commandView;
5670
+ if (event == null) commandView = event = new ClientCommandEvent();
5671
+ return event;
5672
+ }
3269
5673
 
3270
5674
  function commandTrampoline(a0: i32): void {
3271
- if (commandListeners.length == 0) return;
3272
- const event = new ClientCommandEvent(new Player(__nativeCell(0)));
3273
- // A copy: a listener that removes itself must not make the next one skip.
3274
- const listeners = commandListeners.slice(0);
5675
+ if (commandListeners.count == 0) return;
5676
+ const event = commandObject();
5677
+ const listeners = commandListeners;
5678
+ const n = listeners.begin();
3275
5679
  const ambient = __co_ambient_player;
3276
5680
  __co_ambient_player = a0;
3277
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5681
+ for (let i = 0; i < n; i++) {
5682
+ const listener = listeners.at(i);
5683
+ if (listener) listener(event);
5684
+ }
3278
5685
  __co_ambient_player = ambient;
5686
+ listeners.end();
5687
+ }
5688
+
5689
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5690
+ function commandDirect(): void {
5691
+ const listeners = commandListeners;
5692
+ if (listeners.count == 0) return;
5693
+ let listener: usize = 0;
5694
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5695
+ const one = listeners.at(i);
5696
+ if (one == null) continue;
5697
+ listener = changetype<usize>(one);
5698
+ break;
5699
+ }
5700
+ __onDirect("client_command", commandTrampoline.index, listener, listener != 0 ? changetype<usize>(commandObject()) : 0, true);
3279
5701
  }
3280
5702
 
3281
- const putInServerListeners: ((event: ClientPutinserverEvent) => void)[] = [];
5703
+ const putInServerListeners = new __Listeners<(event: ClientPutinserverEvent) => void>();
5704
+ let putInServerView: ClientPutinserverEvent | null = null;
5705
+
5706
+ // @ts-ignore: decorator
5707
+ @inline function putInServerObject(): ClientPutinserverEvent {
5708
+ let event = putInServerView;
5709
+ if (event == null) putInServerView = event = new ClientPutinserverEvent();
5710
+ return event;
5711
+ }
3282
5712
 
3283
5713
  function putInServerTrampoline(a0: i32): void {
3284
- if (putInServerListeners.length == 0) return;
3285
- const event = new ClientPutinserverEvent(new Player(__nativeCell(0)));
3286
- // A copy: a listener that removes itself must not make the next one skip.
3287
- const listeners = putInServerListeners.slice(0);
5714
+ if (putInServerListeners.count == 0) return;
5715
+ const event = putInServerObject();
5716
+ const listeners = putInServerListeners;
5717
+ const n = listeners.begin();
3288
5718
  const ambient = __co_ambient_player;
3289
5719
  __co_ambient_player = a0;
3290
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5720
+ for (let i = 0; i < n; i++) {
5721
+ const listener = listeners.at(i);
5722
+ if (listener) listener(event);
5723
+ }
3291
5724
  __co_ambient_player = ambient;
5725
+ listeners.end();
5726
+ }
5727
+
5728
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5729
+ function putInServerDirect(): void {
5730
+ const listeners = putInServerListeners;
5731
+ if (listeners.count == 0) return;
5732
+ let listener: usize = 0;
5733
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5734
+ const one = listeners.at(i);
5735
+ if (one == null) continue;
5736
+ listener = changetype<usize>(one);
5737
+ break;
5738
+ }
5739
+ __onDirect("client_putinserver", putInServerTrampoline.index, listener, listener != 0 ? changetype<usize>(putInServerObject()) : 0, true);
3292
5740
  }
3293
5741
 
3294
- const inconsistentFileListeners: ((event: InconsistentFileEvent) => void)[] = [];
5742
+ const inconsistentFileListeners = new __Listeners<(event: InconsistentFileEvent) => void>();
5743
+ let inconsistentFileView: InconsistentFileEvent | null = null;
5744
+
5745
+ // @ts-ignore: decorator
5746
+ @inline function inconsistentFileObject(): InconsistentFileEvent {
5747
+ let event = inconsistentFileView;
5748
+ if (event == null) inconsistentFileView = event = new InconsistentFileEvent();
5749
+ return event;
5750
+ }
3295
5751
 
3296
5752
  function inconsistentFileTrampoline(a0: i32): void {
3297
- if (inconsistentFileListeners.length == 0) return;
3298
- const event = new InconsistentFileEvent(new Player(__nativeCell(0)), __nativeString(1), __nativeString(2));
3299
- // A copy: a listener that removes itself must not make the next one skip.
3300
- const listeners = inconsistentFileListeners.slice(0);
5753
+ if (inconsistentFileListeners.count == 0) return;
5754
+ const event = inconsistentFileObject();
5755
+ const listeners = inconsistentFileListeners;
5756
+ const n = listeners.begin();
3301
5757
  const ambient = __co_ambient_player;
3302
5758
  __co_ambient_player = a0;
3303
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5759
+ for (let i = 0; i < n; i++) {
5760
+ const listener = listeners.at(i);
5761
+ if (listener) listener(event);
5762
+ }
3304
5763
  __co_ambient_player = ambient;
5764
+ listeners.end();
5765
+ }
5766
+
5767
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5768
+ function inconsistentFileDirect(): void {
5769
+ const listeners = inconsistentFileListeners;
5770
+ if (listeners.count == 0) return;
5771
+ let listener: usize = 0;
5772
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5773
+ const one = listeners.at(i);
5774
+ if (one == null) continue;
5775
+ listener = changetype<usize>(one);
5776
+ break;
5777
+ }
5778
+ __onDirect("inconsistent_file", inconsistentFileTrampoline.index, listener, listener != 0 ? changetype<usize>(inconsistentFileObject()) : 0, true);
3305
5779
  }
3306
5780
 
3307
- const modulesListeners: ((event: PluginModulesEvent) => void)[] = [];
5781
+ const configsExecutedListeners = new __Listeners<(event: OnConfigsExecutedEvent) => void>();
5782
+ let configsExecutedView: OnConfigsExecutedEvent | null = null;
3308
5783
 
3309
- function modulesTrampoline(a0: i32): void {
3310
- if (modulesListeners.length == 0) return;
3311
- const event = new PluginModulesEvent();
3312
- // A copy: a listener that removes itself must not make the next one skip.
3313
- const listeners = modulesListeners.slice(0);
3314
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5784
+ // @ts-ignore: decorator
5785
+ @inline function configsExecutedObject(): OnConfigsExecutedEvent {
5786
+ let event = configsExecutedView;
5787
+ if (event == null) configsExecutedView = event = new OnConfigsExecutedEvent();
5788
+ return event;
3315
5789
  }
3316
5790
 
3317
- const configsExecutedListeners: ((event: OnConfigsExecutedEvent) => void)[] = [];
3318
-
3319
5791
  function configsExecutedTrampoline(a0: i32): void {
3320
- if (configsExecutedListeners.length == 0) return;
3321
- const event = new OnConfigsExecutedEvent();
3322
- // A copy: a listener that removes itself must not make the next one skip.
3323
- const listeners = configsExecutedListeners.slice(0);
3324
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5792
+ if (configsExecutedListeners.count == 0) return;
5793
+ const event = configsExecutedObject();
5794
+ const listeners = configsExecutedListeners;
5795
+ const n = listeners.begin();
5796
+ for (let i = 0; i < n; i++) {
5797
+ const listener = listeners.at(i);
5798
+ if (listener) listener(event);
5799
+ }
5800
+ listeners.end();
5801
+ }
5802
+
5803
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5804
+ function configsExecutedDirect(): void {
5805
+ const listeners = configsExecutedListeners;
5806
+ if (listeners.count == 0) return;
5807
+ let listener: usize = 0;
5808
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5809
+ const one = listeners.at(i);
5810
+ if (one == null) continue;
5811
+ listener = changetype<usize>(one);
5812
+ break;
5813
+ }
5814
+ __onDirect("OnConfigsExecuted", configsExecutedTrampoline.index, listener, listener != 0 ? changetype<usize>(configsExecutedObject()) : 0, false);
3325
5815
  }
3326
5816
 
3327
- const configsQueuedListeners: ((event: OnAutoConfigsBufferedEvent) => void)[] = [];
5817
+ const configsQueuedListeners = new __Listeners<(event: OnAutoConfigsBufferedEvent) => void>();
5818
+ let configsQueuedView: OnAutoConfigsBufferedEvent | null = null;
5819
+
5820
+ // @ts-ignore: decorator
5821
+ @inline function configsQueuedObject(): OnAutoConfigsBufferedEvent {
5822
+ let event = configsQueuedView;
5823
+ if (event == null) configsQueuedView = event = new OnAutoConfigsBufferedEvent();
5824
+ return event;
5825
+ }
3328
5826
 
3329
5827
  function configsQueuedTrampoline(a0: i32): void {
3330
- if (configsQueuedListeners.length == 0) return;
3331
- const event = new OnAutoConfigsBufferedEvent();
3332
- // A copy: a listener that removes itself must not make the next one skip.
3333
- const listeners = configsQueuedListeners.slice(0);
3334
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5828
+ if (configsQueuedListeners.count == 0) return;
5829
+ const event = configsQueuedObject();
5830
+ const listeners = configsQueuedListeners;
5831
+ const n = listeners.begin();
5832
+ for (let i = 0; i < n; i++) {
5833
+ const listener = listeners.at(i);
5834
+ if (listener) listener(event);
5835
+ }
5836
+ listeners.end();
5837
+ }
5838
+
5839
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5840
+ function configsQueuedDirect(): void {
5841
+ const listeners = configsQueuedListeners;
5842
+ if (listeners.count == 0) return;
5843
+ let listener: usize = 0;
5844
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5845
+ const one = listeners.at(i);
5846
+ if (one == null) continue;
5847
+ listener = changetype<usize>(one);
5848
+ break;
5849
+ }
5850
+ __onDirect("OnAutoConfigsBuffered", configsQueuedTrampoline.index, listener, listener != 0 ? changetype<usize>(configsQueuedObject()) : 0, false);
3335
5851
  }
3336
5852
 
3337
- const internalCommandListeners: ((event: CS_InternalCommandEvent) => void)[] = [];
5853
+ const internalCommandListeners = new __Listeners<(event: CS_InternalCommandEvent) => void>();
5854
+ let internalCommandView: CS_InternalCommandEvent | null = null;
5855
+
5856
+ // @ts-ignore: decorator
5857
+ @inline function internalCommandObject(): CS_InternalCommandEvent {
5858
+ let event = internalCommandView;
5859
+ if (event == null) internalCommandView = event = new CS_InternalCommandEvent();
5860
+ return event;
5861
+ }
3338
5862
 
3339
5863
  function internalCommandTrampoline(a0: i32): void {
3340
- if (internalCommandListeners.length == 0) return;
3341
- const event = new CS_InternalCommandEvent(new Player(__nativeCell(0)), __nativeString(1));
3342
- // A copy: a listener that removes itself must not make the next one skip.
3343
- const listeners = internalCommandListeners.slice(0);
5864
+ if (internalCommandListeners.count == 0) return;
5865
+ const event = internalCommandObject();
5866
+ const listeners = internalCommandListeners;
5867
+ const n = listeners.begin();
3344
5868
  const ambient = __co_ambient_player;
3345
5869
  __co_ambient_player = a0;
3346
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5870
+ for (let i = 0; i < n; i++) {
5871
+ const listener = listeners.at(i);
5872
+ if (listener) listener(event);
5873
+ }
3347
5874
  __co_ambient_player = ambient;
5875
+ listeners.end();
5876
+ }
5877
+
5878
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5879
+ function internalCommandDirect(): void {
5880
+ const listeners = internalCommandListeners;
5881
+ if (listeners.count == 0) return;
5882
+ let listener: usize = 0;
5883
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5884
+ const one = listeners.at(i);
5885
+ if (one == null) continue;
5886
+ listener = changetype<usize>(one);
5887
+ break;
5888
+ }
5889
+ __onDirect("CS_InternalCommand", internalCommandTrampoline.index, listener, listener != 0 ? changetype<usize>(internalCommandObject()) : 0, true);
3348
5890
  }
3349
5891
 
3350
- const CS_OnBuyAttemptListeners: ((event: CS_OnBuyAttemptEvent) => void)[] = [];
5892
+ const CS_OnBuyAttemptListeners = new __Listeners<(event: CS_OnBuyAttemptEvent) => void>();
5893
+ let CS_OnBuyAttemptView: CS_OnBuyAttemptEvent | null = null;
5894
+
5895
+ // @ts-ignore: decorator
5896
+ @inline function CS_OnBuyAttemptObject(): CS_OnBuyAttemptEvent {
5897
+ let event = CS_OnBuyAttemptView;
5898
+ if (event == null) CS_OnBuyAttemptView = event = new CS_OnBuyAttemptEvent();
5899
+ return event;
5900
+ }
3351
5901
 
3352
5902
  function CS_OnBuyAttemptTrampoline(a0: i32): void {
3353
- if (CS_OnBuyAttemptListeners.length == 0) return;
3354
- const event = new CS_OnBuyAttemptEvent(new Player(__nativeCell(0)), <f64>__nativeCell(1));
3355
- // A copy: a listener that removes itself must not make the next one skip.
3356
- const listeners = CS_OnBuyAttemptListeners.slice(0);
5903
+ if (CS_OnBuyAttemptListeners.count == 0) return;
5904
+ const event = CS_OnBuyAttemptObject();
5905
+ const listeners = CS_OnBuyAttemptListeners;
5906
+ const n = listeners.begin();
3357
5907
  const ambient = __co_ambient_player;
3358
5908
  __co_ambient_player = a0;
3359
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5909
+ for (let i = 0; i < n; i++) {
5910
+ const listener = listeners.at(i);
5911
+ if (listener) listener(event);
5912
+ }
3360
5913
  __co_ambient_player = ambient;
5914
+ listeners.end();
5915
+ }
5916
+
5917
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5918
+ function CS_OnBuyAttemptDirect(): void {
5919
+ const listeners = CS_OnBuyAttemptListeners;
5920
+ if (listeners.count == 0) return;
5921
+ let listener: usize = 0;
5922
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5923
+ const one = listeners.at(i);
5924
+ if (one == null) continue;
5925
+ listener = changetype<usize>(one);
5926
+ break;
5927
+ }
5928
+ __onDirect("CS_OnBuyAttempt", CS_OnBuyAttemptTrampoline.index, listener, listener != 0 ? changetype<usize>(CS_OnBuyAttemptObject()) : 0, true);
3361
5929
  }
3362
5930
 
3363
- const CS_OnBuyListeners: ((event: CS_OnBuyEvent) => void)[] = [];
5931
+ const CS_OnBuyListeners = new __Listeners<(event: CS_OnBuyEvent) => void>();
5932
+ let CS_OnBuyView: CS_OnBuyEvent | null = null;
5933
+
5934
+ // @ts-ignore: decorator
5935
+ @inline function CS_OnBuyObject(): CS_OnBuyEvent {
5936
+ let event = CS_OnBuyView;
5937
+ if (event == null) CS_OnBuyView = event = new CS_OnBuyEvent();
5938
+ return event;
5939
+ }
3364
5940
 
3365
5941
  function CS_OnBuyTrampoline(a0: i32): void {
3366
- if (CS_OnBuyListeners.length == 0) return;
3367
- const event = new CS_OnBuyEvent(new Player(__nativeCell(0)), <f64>__nativeCell(1));
3368
- // A copy: a listener that removes itself must not make the next one skip.
3369
- const listeners = CS_OnBuyListeners.slice(0);
5942
+ if (CS_OnBuyListeners.count == 0) return;
5943
+ const event = CS_OnBuyObject();
5944
+ const listeners = CS_OnBuyListeners;
5945
+ const n = listeners.begin();
3370
5946
  const ambient = __co_ambient_player;
3371
5947
  __co_ambient_player = a0;
3372
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5948
+ for (let i = 0; i < n; i++) {
5949
+ const listener = listeners.at(i);
5950
+ if (listener) listener(event);
5951
+ }
3373
5952
  __co_ambient_player = ambient;
5953
+ listeners.end();
5954
+ }
5955
+
5956
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5957
+ function CS_OnBuyDirect(): void {
5958
+ const listeners = CS_OnBuyListeners;
5959
+ if (listeners.count == 0) return;
5960
+ let listener: usize = 0;
5961
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5962
+ const one = listeners.at(i);
5963
+ if (one == null) continue;
5964
+ listener = changetype<usize>(one);
5965
+ break;
5966
+ }
5967
+ __onDirect("CS_OnBuy", CS_OnBuyTrampoline.index, listener, listener != 0 ? changetype<usize>(CS_OnBuyObject()) : 0, true);
3374
5968
  }
3375
5969
 
3376
- const frameListeners: ((event: ServerFrameEvent) => void)[] = [];
5970
+ const frameListeners = new __Listeners<(event: ServerFrameEvent) => void>();
5971
+ let frameView: ServerFrameEvent | null = null;
5972
+
5973
+ // @ts-ignore: decorator
5974
+ @inline function frameObject(): ServerFrameEvent {
5975
+ let event = frameView;
5976
+ if (event == null) frameView = event = new ServerFrameEvent();
5977
+ return event;
5978
+ }
3377
5979
 
3378
5980
  function frameTrampoline(a0: i32): void {
3379
- if (frameListeners.length == 0) return;
3380
- const event = new ServerFrameEvent();
3381
- // A copy: a listener that removes itself must not make the next one skip.
3382
- const listeners = frameListeners.slice(0);
3383
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
5981
+ if (frameListeners.count == 0) return;
5982
+ const event = frameObject();
5983
+ const listeners = frameListeners;
5984
+ const n = listeners.begin();
5985
+ for (let i = 0; i < n; i++) {
5986
+ const listener = listeners.at(i);
5987
+ if (listener) listener(event);
5988
+ }
5989
+ listeners.end();
5990
+ }
5991
+
5992
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
5993
+ function frameDirect(): void {
5994
+ const listeners = frameListeners;
5995
+ if (listeners.count == 0) return;
5996
+ let listener: usize = 0;
5997
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
5998
+ const one = listeners.at(i);
5999
+ if (one == null) continue;
6000
+ listener = changetype<usize>(one);
6001
+ break;
6002
+ }
6003
+ __onDirect("server_frame", frameTrampoline.index, listener, listener != 0 ? changetype<usize>(frameObject()) : 0, false);
3384
6004
  }
3385
6005
 
3386
- const suicideListeners: ((event: ClientKillEvent) => void)[] = [];
6006
+ const suicideListeners = new __Listeners<(event: ClientKillEvent) => void>();
6007
+ let suicideView: ClientKillEvent | null = null;
6008
+
6009
+ // @ts-ignore: decorator
6010
+ @inline function suicideObject(): ClientKillEvent {
6011
+ let event = suicideView;
6012
+ if (event == null) suicideView = event = new ClientKillEvent();
6013
+ return event;
6014
+ }
3387
6015
 
3388
6016
  function suicideTrampoline(a0: i32): void {
3389
- if (suicideListeners.length == 0) return;
3390
- const event = new ClientKillEvent(new Player(__nativeCell(0)));
3391
- // A copy: a listener that removes itself must not make the next one skip.
3392
- const listeners = suicideListeners.slice(0);
6017
+ if (suicideListeners.count == 0) return;
6018
+ const event = suicideObject();
6019
+ const listeners = suicideListeners;
6020
+ const n = listeners.begin();
3393
6021
  const ambient = __co_ambient_player;
3394
6022
  __co_ambient_player = a0;
3395
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
6023
+ for (let i = 0; i < n; i++) {
6024
+ const listener = listeners.at(i);
6025
+ if (listener) listener(event);
6026
+ }
3396
6027
  __co_ambient_player = ambient;
6028
+ listeners.end();
6029
+ }
6030
+
6031
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
6032
+ function suicideDirect(): void {
6033
+ const listeners = suicideListeners;
6034
+ if (listeners.count == 0) return;
6035
+ let listener: usize = 0;
6036
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
6037
+ const one = listeners.at(i);
6038
+ if (one == null) continue;
6039
+ listener = changetype<usize>(one);
6040
+ break;
6041
+ }
6042
+ __onDirect("client_kill", suicideTrampoline.index, listener, listener != 0 ? changetype<usize>(suicideObject()) : 0, true);
3397
6043
  }
3398
6044
 
3399
- const impulseListeners: ((event: ClientImpulseEvent) => void)[] = [];
6045
+ const impulseListeners = new __Listeners<(event: ClientImpulseEvent) => void>();
6046
+ let impulseView: ClientImpulseEvent | null = null;
6047
+
6048
+ // @ts-ignore: decorator
6049
+ @inline function impulseObject(): ClientImpulseEvent {
6050
+ let event = impulseView;
6051
+ if (event == null) impulseView = event = new ClientImpulseEvent();
6052
+ return event;
6053
+ }
3400
6054
 
3401
6055
  function impulseTrampoline(a0: i32): void {
3402
- if (impulseListeners.length == 0) return;
3403
- const event = new ClientImpulseEvent(new Player(__nativeCell(0)), <f64>__nativeCell(1));
3404
- // A copy: a listener that removes itself must not make the next one skip.
3405
- const listeners = impulseListeners.slice(0);
6056
+ if (impulseListeners.count == 0) return;
6057
+ const event = impulseObject();
6058
+ const listeners = impulseListeners;
6059
+ const n = listeners.begin();
3406
6060
  const ambient = __co_ambient_player;
3407
6061
  __co_ambient_player = a0;
3408
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
6062
+ for (let i = 0; i < n; i++) {
6063
+ const listener = listeners.at(i);
6064
+ if (listener) listener(event);
6065
+ }
3409
6066
  __co_ambient_player = ambient;
6067
+ listeners.end();
6068
+ }
6069
+
6070
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
6071
+ function impulseDirect(): void {
6072
+ const listeners = impulseListeners;
6073
+ if (listeners.count == 0) return;
6074
+ let listener: usize = 0;
6075
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
6076
+ const one = listeners.at(i);
6077
+ if (one == null) continue;
6078
+ listener = changetype<usize>(one);
6079
+ break;
6080
+ }
6081
+ __onDirect("client_impulse", impulseTrampoline.index, listener, listener != 0 ? changetype<usize>(impulseObject()) : 0, true);
3410
6082
  }
3411
6083
 
3412
- const cmdStartListeners: ((event: ClientCmdStartEvent) => void)[] = [];
6084
+ const cmdStartListeners = new __Listeners<(event: ClientCmdStartEvent) => void>();
6085
+ let cmdStartView: ClientCmdStartEvent | null = null;
6086
+
6087
+ // @ts-ignore: decorator
6088
+ @inline function cmdStartObject(): ClientCmdStartEvent {
6089
+ let event = cmdStartView;
6090
+ if (event == null) cmdStartView = event = new ClientCmdStartEvent();
6091
+ return event;
6092
+ }
3413
6093
 
3414
6094
  function cmdStartTrampoline(a0: i32): void {
3415
- if (cmdStartListeners.length == 0) return;
3416
- const event = new ClientCmdStartEvent(new Player(__nativeCell(0)));
3417
- // A copy: a listener that removes itself must not make the next one skip.
3418
- const listeners = cmdStartListeners.slice(0);
6095
+ if (cmdStartListeners.count == 0) return;
6096
+ const event = cmdStartObject();
6097
+ const listeners = cmdStartListeners;
6098
+ const n = listeners.begin();
3419
6099
  const ambient = __co_ambient_player;
3420
6100
  __co_ambient_player = a0;
3421
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
6101
+ for (let i = 0; i < n; i++) {
6102
+ const listener = listeners.at(i);
6103
+ if (listener) listener(event);
6104
+ }
3422
6105
  __co_ambient_player = ambient;
6106
+ listeners.end();
6107
+ }
6108
+
6109
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
6110
+ function cmdStartDirect(): void {
6111
+ const listeners = cmdStartListeners;
6112
+ if (listeners.count == 0) return;
6113
+ let listener: usize = 0;
6114
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
6115
+ const one = listeners.at(i);
6116
+ if (one == null) continue;
6117
+ listener = changetype<usize>(one);
6118
+ break;
6119
+ }
6120
+ __onDirect("client_cmdStart", cmdStartTrampoline.index, listener, listener != 0 ? changetype<usize>(cmdStartObject()) : 0, true);
3423
6121
  }
3424
6122
 
3425
- const entityThinkListeners: ((event: PfnThinkEvent) => void)[] = [];
6123
+ const entityThinkListeners = new __Listeners<(event: PfnThinkEvent) => void>();
6124
+ let entityThinkView: PfnThinkEvent | null = null;
6125
+
6126
+ // @ts-ignore: decorator
6127
+ @inline function entityThinkObject(): PfnThinkEvent {
6128
+ let event = entityThinkView;
6129
+ if (event == null) entityThinkView = event = new PfnThinkEvent();
6130
+ return event;
6131
+ }
3426
6132
 
3427
6133
  function entityThinkTrampoline(a0: i32): void {
3428
- if (entityThinkListeners.length == 0) return;
3429
- const event = new PfnThinkEvent(<f64>__nativeCell(0));
3430
- // A copy: a listener that removes itself must not make the next one skip.
3431
- const listeners = entityThinkListeners.slice(0);
3432
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
6134
+ if (entityThinkListeners.count == 0) return;
6135
+ const event = entityThinkObject();
6136
+ const listeners = entityThinkListeners;
6137
+ const n = listeners.begin();
6138
+ for (let i = 0; i < n; i++) {
6139
+ const listener = listeners.at(i);
6140
+ if (listener) listener(event);
6141
+ }
6142
+ listeners.end();
6143
+ }
6144
+
6145
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
6146
+ function entityThinkDirect(): void {
6147
+ const listeners = entityThinkListeners;
6148
+ if (listeners.count == 0) return;
6149
+ let listener: usize = 0;
6150
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
6151
+ const one = listeners.at(i);
6152
+ if (one == null) continue;
6153
+ listener = changetype<usize>(one);
6154
+ break;
6155
+ }
6156
+ __onDirect("pfn_think", entityThinkTrampoline.index, listener, listener != 0 ? changetype<usize>(entityThinkObject()) : 0, false);
3433
6157
  }
3434
6158
 
3435
- const playbackEventListeners: ((event: PfnPlaybackeventEvent) => void)[] = [];
6159
+ const playbackEventListeners = new __Listeners<(event: PfnPlaybackeventEvent) => void>();
6160
+ let playbackEventView: PfnPlaybackeventEvent | null = null;
6161
+
6162
+ // @ts-ignore: decorator
6163
+ @inline function playbackEventObject(): PfnPlaybackeventEvent {
6164
+ let event = playbackEventView;
6165
+ if (event == null) playbackEventView = event = new PfnPlaybackeventEvent();
6166
+ return event;
6167
+ }
3436
6168
 
3437
6169
  function playbackEventTrampoline(a0: i32): void {
3438
- if (playbackEventListeners.length == 0) return;
3439
- const event = new PfnPlaybackeventEvent(<f64>__nativeCell(0), <f64>__nativeCell(1), <f64>__nativeCell(2), <f64>reinterpret<f32>(__nativeCell(3)), __nativeVector(4), __nativeVector(5), <f64>reinterpret<f32>(__nativeCell(6)), <f64>reinterpret<f32>(__nativeCell(7)), <f64>__nativeCell(8), <f64>__nativeCell(9), <f64>__nativeCell(10), <f64>__nativeCell(11));
3440
- // A copy: a listener that removes itself must not make the next one skip.
3441
- const listeners = playbackEventListeners.slice(0);
3442
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
6170
+ if (playbackEventListeners.count == 0) return;
6171
+ const event = playbackEventObject();
6172
+ const listeners = playbackEventListeners;
6173
+ const n = listeners.begin();
6174
+ for (let i = 0; i < n; i++) {
6175
+ const listener = listeners.at(i);
6176
+ if (listener) listener(event);
6177
+ }
6178
+ listeners.end();
6179
+ }
6180
+
6181
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
6182
+ function playbackEventDirect(): void {
6183
+ const listeners = playbackEventListeners;
6184
+ if (listeners.count == 0) return;
6185
+ let listener: usize = 0;
6186
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
6187
+ const one = listeners.at(i);
6188
+ if (one == null) continue;
6189
+ listener = changetype<usize>(one);
6190
+ break;
6191
+ }
6192
+ __onDirect("pfn_playbackevent", playbackEventTrampoline.index, listener, listener != 0 ? changetype<usize>(playbackEventObject()) : 0, false);
3443
6193
  }
3444
6194
 
3445
- const keyValueListeners: ((event: PfnKeyvalueEvent) => void)[] = [];
6195
+ const keyValueListeners = new __Listeners<(event: PfnKeyvalueEvent) => void>();
6196
+ let keyValueView: PfnKeyvalueEvent | null = null;
6197
+
6198
+ // @ts-ignore: decorator
6199
+ @inline function keyValueObject(): PfnKeyvalueEvent {
6200
+ let event = keyValueView;
6201
+ if (event == null) keyValueView = event = new PfnKeyvalueEvent();
6202
+ return event;
6203
+ }
3446
6204
 
3447
6205
  function keyValueTrampoline(a0: i32): void {
3448
- if (keyValueListeners.length == 0) return;
3449
- const event = new PfnKeyvalueEvent(<f64>__nativeCell(0));
3450
- // A copy: a listener that removes itself must not make the next one skip.
3451
- const listeners = keyValueListeners.slice(0);
3452
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
6206
+ if (keyValueListeners.count == 0) return;
6207
+ const event = keyValueObject();
6208
+ const listeners = keyValueListeners;
6209
+ const n = listeners.begin();
6210
+ for (let i = 0; i < n; i++) {
6211
+ const listener = listeners.at(i);
6212
+ if (listener) listener(event);
6213
+ }
6214
+ listeners.end();
6215
+ }
6216
+
6217
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
6218
+ function keyValueDirect(): void {
6219
+ const listeners = keyValueListeners;
6220
+ if (listeners.count == 0) return;
6221
+ let listener: usize = 0;
6222
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
6223
+ const one = listeners.at(i);
6224
+ if (one == null) continue;
6225
+ listener = changetype<usize>(one);
6226
+ break;
6227
+ }
6228
+ __onDirect("pfn_keyvalue", keyValueTrampoline.index, listener, listener != 0 ? changetype<usize>(keyValueObject()) : 0, false);
3453
6229
  }
3454
6230
 
3455
- const entitySpawnListeners: ((event: PfnSpawnEvent) => void)[] = [];
6231
+ const entitySpawnListeners = new __Listeners<(event: PfnSpawnEvent) => void>();
6232
+ let entitySpawnView: PfnSpawnEvent | null = null;
6233
+
6234
+ // @ts-ignore: decorator
6235
+ @inline function entitySpawnObject(): PfnSpawnEvent {
6236
+ let event = entitySpawnView;
6237
+ if (event == null) entitySpawnView = event = new PfnSpawnEvent();
6238
+ return event;
6239
+ }
3456
6240
 
3457
6241
  function entitySpawnTrampoline(a0: i32): void {
3458
- if (entitySpawnListeners.length == 0) return;
3459
- const event = new PfnSpawnEvent(<f64>__nativeCell(0));
3460
- // A copy: a listener that removes itself must not make the next one skip.
3461
- const listeners = entitySpawnListeners.slice(0);
3462
- for (let i = 0; i < listeners.length; i++) listeners[i](event);
6242
+ if (entitySpawnListeners.count == 0) return;
6243
+ const event = entitySpawnObject();
6244
+ const listeners = entitySpawnListeners;
6245
+ const n = listeners.begin();
6246
+ for (let i = 0; i < n; i++) {
6247
+ const listener = listeners.at(i);
6248
+ if (listener) listener(event);
6249
+ }
6250
+ listeners.end();
6251
+ }
6252
+
6253
+ /** The one listener of the event is called by the module itself; with more, the trampoline walks them. */
6254
+ function entitySpawnDirect(): void {
6255
+ const listeners = entitySpawnListeners;
6256
+ if (listeners.count == 0) return;
6257
+ let listener: usize = 0;
6258
+ for (let i = 0; i < listeners.slots && listeners.count == 1; i++) {
6259
+ const one = listeners.at(i);
6260
+ if (one == null) continue;
6261
+ listener = changetype<usize>(one);
6262
+ break;
6263
+ }
6264
+ __onDirect("pfn_spawn", entitySpawnTrampoline.index, listener, listener != 0 ? changetype<usize>(entitySpawnObject()) : 0, false);
3463
6265
  }
3464
6266
 
3465
6267
  /** Adds a listener for the event E - server.addEventListener's hood. */
3466
6268
  export function addServerListener<E>(listener: (event: E) => void): void {
3467
6269
  if (idof<E>() == idof<PluginInitEvent>()) {
3468
- if (initListeners.length == 0) _on("plugin_init", initTrampoline.index, 0);
6270
+ if (initListeners.count == 0) _on("plugin_init", initTrampoline.index, 0);
3469
6271
  initListeners.push(changetype<(event: PluginInitEvent) => void>(listener));
3470
- return;
3471
- }
3472
- if (idof<E>() == idof<PluginPauseEvent>()) {
3473
- if (pauseListeners.length == 0) _on("plugin_pause", pauseTrampoline.index, 0);
3474
- pauseListeners.push(changetype<(event: PluginPauseEvent) => void>(listener));
3475
- return;
3476
- }
3477
- if (idof<E>() == idof<PluginUnpauseEvent>()) {
3478
- if (unpauseListeners.length == 0) _on("plugin_unpause", unpauseTrampoline.index, 0);
3479
- unpauseListeners.push(changetype<(event: PluginUnpauseEvent) => void>(listener));
6272
+ initDirect();
3480
6273
  return;
3481
6274
  }
3482
6275
  if (idof<E>() == idof<ServerChangelevelEvent>()) {
3483
- if (changeLevelListeners.length == 0) _on("server_changelevel", changeLevelTrampoline.index, 0);
6276
+ if (changeLevelListeners.count == 0) _on("server_changelevel", changeLevelTrampoline.index, 0);
3484
6277
  changeLevelListeners.push(changetype<(event: ServerChangelevelEvent) => void>(listener));
6278
+ changeLevelDirect();
3485
6279
  return;
3486
6280
  }
3487
6281
  if (idof<E>() == idof<PluginCfgEvent>()) {
3488
- if (pluginsLoadedListeners.length == 0) _on("plugin_cfg", pluginsLoadedTrampoline.index, 0);
6282
+ if (pluginsLoadedListeners.count == 0) _on("plugin_cfg", pluginsLoadedTrampoline.index, 0);
3489
6283
  pluginsLoadedListeners.push(changetype<(event: PluginCfgEvent) => void>(listener));
6284
+ pluginsLoadedDirect();
3490
6285
  return;
3491
6286
  }
3492
6287
  if (idof<E>() == idof<PluginEndEvent>()) {
3493
- if (endListeners.length == 0) _on("plugin_end", endTrampoline.index, 0);
6288
+ if (endListeners.count == 0) _on("plugin_end", endTrampoline.index, 0);
3494
6289
  endListeners.push(changetype<(event: PluginEndEvent) => void>(listener));
6290
+ endDirect();
3495
6291
  return;
3496
6292
  }
3497
6293
  if (idof<E>() == idof<PluginLogEvent>()) {
3498
- if (logListeners.length == 0) _on("plugin_log", logTrampoline.index, 0);
6294
+ if (logListeners.count == 0) _on("plugin_log", logTrampoline.index, 0);
3499
6295
  logListeners.push(changetype<(event: PluginLogEvent) => void>(listener));
6296
+ logDirect();
3500
6297
  return;
3501
6298
  }
3502
6299
  if (idof<E>() == idof<PluginPrecacheEvent>()) {
3503
- if (precacheListeners.length == 0) _on("plugin_precache", precacheTrampoline.index, 0);
6300
+ if (precacheListeners.count == 0) _on("plugin_precache", precacheTrampoline.index, 0);
3504
6301
  precacheListeners.push(changetype<(event: PluginPrecacheEvent) => void>(listener));
6302
+ precacheDirect();
3505
6303
  return;
3506
6304
  }
3507
6305
  if (idof<E>() == idof<ClientInfochangedEvent>()) {
3508
- if (clientInfochangedListeners.length == 0) _on("client_infochanged", clientInfochangedTrampoline.index, 0);
6306
+ if (clientInfochangedListeners.count == 0) _on("client_infochanged", clientInfochangedTrampoline.index, 0);
3509
6307
  clientInfochangedListeners.push(changetype<(event: ClientInfochangedEvent) => void>(listener));
6308
+ clientInfochangedDirect();
3510
6309
  return;
3511
6310
  }
3512
6311
  if (idof<E>() == idof<ClientConnectEvent>()) {
3513
- if (connectListeners.length == 0) _on("client_connect", connectTrampoline.index, 0);
6312
+ if (connectListeners.count == 0) _on("client_connect", connectTrampoline.index, 0);
3514
6313
  connectListeners.push(changetype<(event: ClientConnectEvent) => void>(listener));
6314
+ connectDirect();
3515
6315
  return;
3516
6316
  }
3517
6317
  if (idof<E>() == idof<ClientConnectexEvent>()) {
3518
- if (connectAttemptListeners.length == 0) _on("client_connectex", connectAttemptTrampoline.index, 0);
6318
+ if (connectAttemptListeners.count == 0) _on("client_connectex", connectAttemptTrampoline.index, 0);
3519
6319
  connectAttemptListeners.push(changetype<(event: ClientConnectexEvent) => void>(listener));
6320
+ connectAttemptDirect();
3520
6321
  return;
3521
6322
  }
3522
6323
  if (idof<E>() == idof<ClientAuthorizedEvent>()) {
3523
- if (authorizedListeners.length == 0) _on("client_authorized", authorizedTrampoline.index, 0);
6324
+ if (authorizedListeners.count == 0) _on("client_authorized", authorizedTrampoline.index, 0);
3524
6325
  authorizedListeners.push(changetype<(event: ClientAuthorizedEvent) => void>(listener));
6326
+ authorizedDirect();
3525
6327
  return;
3526
6328
  }
3527
6329
  if (idof<E>() == idof<ClientDisconnectedEvent>()) {
3528
- if (disconnectedListeners.length == 0) _on("client_disconnected", disconnectedTrampoline.index, 0);
6330
+ if (disconnectedListeners.count == 0) _on("client_disconnected", disconnectedTrampoline.index, 0);
3529
6331
  disconnectedListeners.push(changetype<(event: ClientDisconnectedEvent) => void>(listener));
6332
+ disconnectedDirect();
3530
6333
  return;
3531
6334
  }
3532
6335
  if (idof<E>() == idof<ClientRemoveEvent>()) {
3533
- if (removeListeners.length == 0) _on("client_remove", removeTrampoline.index, 0);
6336
+ if (removeListeners.count == 0) _on("client_remove", removeTrampoline.index, 0);
3534
6337
  removeListeners.push(changetype<(event: ClientRemoveEvent) => void>(listener));
6338
+ removeDirect();
3535
6339
  return;
3536
6340
  }
3537
6341
  if (idof<E>() == idof<ClientCommandEvent>()) {
3538
- if (commandListeners.length == 0) _on("client_command", commandTrampoline.index, 0);
6342
+ if (commandListeners.count == 0) _on("client_command", commandTrampoline.index, 0);
3539
6343
  commandListeners.push(changetype<(event: ClientCommandEvent) => void>(listener));
6344
+ commandDirect();
3540
6345
  return;
3541
6346
  }
3542
6347
  if (idof<E>() == idof<ClientPutinserverEvent>()) {
3543
- if (putInServerListeners.length == 0) _on("client_putinserver", putInServerTrampoline.index, 0);
6348
+ if (putInServerListeners.count == 0) _on("client_putinserver", putInServerTrampoline.index, 0);
3544
6349
  putInServerListeners.push(changetype<(event: ClientPutinserverEvent) => void>(listener));
6350
+ putInServerDirect();
3545
6351
  return;
3546
6352
  }
3547
6353
  if (idof<E>() == idof<InconsistentFileEvent>()) {
3548
- if (inconsistentFileListeners.length == 0) _on("inconsistent_file", inconsistentFileTrampoline.index, 0);
6354
+ if (inconsistentFileListeners.count == 0) _on("inconsistent_file", inconsistentFileTrampoline.index, 0);
3549
6355
  inconsistentFileListeners.push(changetype<(event: InconsistentFileEvent) => void>(listener));
3550
- return;
3551
- }
3552
- if (idof<E>() == idof<PluginModulesEvent>()) {
3553
- if (modulesListeners.length == 0) _on("plugin_modules", modulesTrampoline.index, 0);
3554
- modulesListeners.push(changetype<(event: PluginModulesEvent) => void>(listener));
6356
+ inconsistentFileDirect();
3555
6357
  return;
3556
6358
  }
3557
6359
  if (idof<E>() == idof<OnConfigsExecutedEvent>()) {
3558
- if (configsExecutedListeners.length == 0) _on("OnConfigsExecuted", configsExecutedTrampoline.index, 0);
6360
+ if (configsExecutedListeners.count == 0) _on("OnConfigsExecuted", configsExecutedTrampoline.index, 0);
3559
6361
  configsExecutedListeners.push(changetype<(event: OnConfigsExecutedEvent) => void>(listener));
6362
+ configsExecutedDirect();
3560
6363
  return;
3561
6364
  }
3562
6365
  if (idof<E>() == idof<OnAutoConfigsBufferedEvent>()) {
3563
- if (configsQueuedListeners.length == 0) _on("OnAutoConfigsBuffered", configsQueuedTrampoline.index, 0);
6366
+ if (configsQueuedListeners.count == 0) _on("OnAutoConfigsBuffered", configsQueuedTrampoline.index, 0);
3564
6367
  configsQueuedListeners.push(changetype<(event: OnAutoConfigsBufferedEvent) => void>(listener));
6368
+ configsQueuedDirect();
3565
6369
  return;
3566
6370
  }
3567
6371
  if (idof<E>() == idof<CS_InternalCommandEvent>()) {
3568
- if (internalCommandListeners.length == 0) _on("CS_InternalCommand", internalCommandTrampoline.index, 0);
6372
+ if (internalCommandListeners.count == 0) _on("CS_InternalCommand", internalCommandTrampoline.index, 0);
3569
6373
  internalCommandListeners.push(changetype<(event: CS_InternalCommandEvent) => void>(listener));
6374
+ internalCommandDirect();
3570
6375
  return;
3571
6376
  }
3572
6377
  if (idof<E>() == idof<CS_OnBuyAttemptEvent>()) {
3573
- if (CS_OnBuyAttemptListeners.length == 0) _on("CS_OnBuyAttempt", CS_OnBuyAttemptTrampoline.index, 0);
6378
+ if (CS_OnBuyAttemptListeners.count == 0) _on("CS_OnBuyAttempt", CS_OnBuyAttemptTrampoline.index, 0);
3574
6379
  CS_OnBuyAttemptListeners.push(changetype<(event: CS_OnBuyAttemptEvent) => void>(listener));
6380
+ CS_OnBuyAttemptDirect();
3575
6381
  return;
3576
6382
  }
3577
6383
  if (idof<E>() == idof<CS_OnBuyEvent>()) {
3578
- if (CS_OnBuyListeners.length == 0) _on("CS_OnBuy", CS_OnBuyTrampoline.index, 0);
6384
+ if (CS_OnBuyListeners.count == 0) _on("CS_OnBuy", CS_OnBuyTrampoline.index, 0);
3579
6385
  CS_OnBuyListeners.push(changetype<(event: CS_OnBuyEvent) => void>(listener));
6386
+ CS_OnBuyDirect();
3580
6387
  return;
3581
6388
  }
3582
6389
  if (idof<E>() == idof<ServerFrameEvent>()) {
3583
- if (frameListeners.length == 0) _on("server_frame", frameTrampoline.index, 0);
6390
+ if (frameListeners.count == 0) _on("server_frame", frameTrampoline.index, 0);
3584
6391
  frameListeners.push(changetype<(event: ServerFrameEvent) => void>(listener));
6392
+ frameDirect();
3585
6393
  return;
3586
6394
  }
3587
6395
  if (idof<E>() == idof<ClientKillEvent>()) {
3588
- if (suicideListeners.length == 0) _on("client_kill", suicideTrampoline.index, 0);
6396
+ if (suicideListeners.count == 0) _on("client_kill", suicideTrampoline.index, 0);
3589
6397
  suicideListeners.push(changetype<(event: ClientKillEvent) => void>(listener));
6398
+ suicideDirect();
3590
6399
  return;
3591
6400
  }
3592
6401
  if (idof<E>() == idof<ClientImpulseEvent>()) {
3593
- if (impulseListeners.length == 0) _on("client_impulse", impulseTrampoline.index, 0);
6402
+ if (impulseListeners.count == 0) _on("client_impulse", impulseTrampoline.index, 0);
3594
6403
  impulseListeners.push(changetype<(event: ClientImpulseEvent) => void>(listener));
6404
+ impulseDirect();
3595
6405
  return;
3596
6406
  }
3597
6407
  if (idof<E>() == idof<ClientCmdStartEvent>()) {
3598
- if (cmdStartListeners.length == 0) _on("client_cmdStart", cmdStartTrampoline.index, 0);
6408
+ if (cmdStartListeners.count == 0) _on("client_cmdStart", cmdStartTrampoline.index, 0);
3599
6409
  cmdStartListeners.push(changetype<(event: ClientCmdStartEvent) => void>(listener));
6410
+ cmdStartDirect();
3600
6411
  return;
3601
6412
  }
3602
6413
  if (idof<E>() == idof<PfnThinkEvent>()) {
3603
- if (entityThinkListeners.length == 0) _on("pfn_think", entityThinkTrampoline.index, 0);
6414
+ if (entityThinkListeners.count == 0) _on("pfn_think", entityThinkTrampoline.index, 0);
3604
6415
  entityThinkListeners.push(changetype<(event: PfnThinkEvent) => void>(listener));
6416
+ entityThinkDirect();
3605
6417
  return;
3606
6418
  }
3607
6419
  if (idof<E>() == idof<PfnPlaybackeventEvent>()) {
3608
- if (playbackEventListeners.length == 0) _on("pfn_playbackevent", playbackEventTrampoline.index, 0);
6420
+ if (playbackEventListeners.count == 0) _on("pfn_playbackevent", playbackEventTrampoline.index, 0);
3609
6421
  playbackEventListeners.push(changetype<(event: PfnPlaybackeventEvent) => void>(listener));
6422
+ playbackEventDirect();
3610
6423
  return;
3611
6424
  }
3612
6425
  if (idof<E>() == idof<PfnKeyvalueEvent>()) {
3613
- if (keyValueListeners.length == 0) _on("pfn_keyvalue", keyValueTrampoline.index, 0);
6426
+ if (keyValueListeners.count == 0) _on("pfn_keyvalue", keyValueTrampoline.index, 0);
3614
6427
  keyValueListeners.push(changetype<(event: PfnKeyvalueEvent) => void>(listener));
6428
+ keyValueDirect();
3615
6429
  return;
3616
6430
  }
3617
6431
  if (idof<E>() == idof<PfnSpawnEvent>()) {
3618
- if (entitySpawnListeners.length == 0) _on("pfn_spawn", entitySpawnTrampoline.index, 0);
6432
+ if (entitySpawnListeners.count == 0) _on("pfn_spawn", entitySpawnTrampoline.index, 0);
3619
6433
  entitySpawnListeners.push(changetype<(event: PfnSpawnEvent) => void>(listener));
6434
+ entitySpawnDirect();
3620
6435
  return;
3621
6436
  }
3622
6437
  }
@@ -3624,220 +6439,171 @@ export function addServerListener<E>(listener: (event: E) => void): void {
3624
6439
  /** Takes a listener off again - server.removeEventListener's hood. */
3625
6440
  export function removeServerListener<E>(listener: (event: E) => void): void {
3626
6441
  if (idof<E>() == idof<PluginInitEvent>()) {
3627
- const at = initListeners.indexOf(changetype<(event: PluginInitEvent) => void>(listener));
3628
- if (at < 0) return;
3629
- initListeners.splice(at, 1);
3630
- if (initListeners.length == 0) __off("plugin_init", initTrampoline.index);
3631
- return;
3632
- }
3633
- if (idof<E>() == idof<PluginPauseEvent>()) {
3634
- const at = pauseListeners.indexOf(changetype<(event: PluginPauseEvent) => void>(listener));
3635
- if (at < 0) return;
3636
- pauseListeners.splice(at, 1);
3637
- if (pauseListeners.length == 0) __off("plugin_pause", pauseTrampoline.index);
3638
- return;
3639
- }
3640
- if (idof<E>() == idof<PluginUnpauseEvent>()) {
3641
- const at = unpauseListeners.indexOf(changetype<(event: PluginUnpauseEvent) => void>(listener));
3642
- if (at < 0) return;
3643
- unpauseListeners.splice(at, 1);
3644
- if (unpauseListeners.length == 0) __off("plugin_unpause", unpauseTrampoline.index);
6442
+ if (!initListeners.remove(changetype<(event: PluginInitEvent) => void>(listener))) return;
6443
+ if (initListeners.count == 0) __off("plugin_init", initTrampoline.index);
6444
+ initDirect();
3645
6445
  return;
3646
6446
  }
3647
6447
  if (idof<E>() == idof<ServerChangelevelEvent>()) {
3648
- const at = changeLevelListeners.indexOf(changetype<(event: ServerChangelevelEvent) => void>(listener));
3649
- if (at < 0) return;
3650
- changeLevelListeners.splice(at, 1);
3651
- if (changeLevelListeners.length == 0) __off("server_changelevel", changeLevelTrampoline.index);
6448
+ if (!changeLevelListeners.remove(changetype<(event: ServerChangelevelEvent) => void>(listener))) return;
6449
+ if (changeLevelListeners.count == 0) __off("server_changelevel", changeLevelTrampoline.index);
6450
+ changeLevelDirect();
3652
6451
  return;
3653
6452
  }
3654
6453
  if (idof<E>() == idof<PluginCfgEvent>()) {
3655
- const at = pluginsLoadedListeners.indexOf(changetype<(event: PluginCfgEvent) => void>(listener));
3656
- if (at < 0) return;
3657
- pluginsLoadedListeners.splice(at, 1);
3658
- if (pluginsLoadedListeners.length == 0) __off("plugin_cfg", pluginsLoadedTrampoline.index);
6454
+ if (!pluginsLoadedListeners.remove(changetype<(event: PluginCfgEvent) => void>(listener))) return;
6455
+ if (pluginsLoadedListeners.count == 0) __off("plugin_cfg", pluginsLoadedTrampoline.index);
6456
+ pluginsLoadedDirect();
3659
6457
  return;
3660
6458
  }
3661
6459
  if (idof<E>() == idof<PluginEndEvent>()) {
3662
- const at = endListeners.indexOf(changetype<(event: PluginEndEvent) => void>(listener));
3663
- if (at < 0) return;
3664
- endListeners.splice(at, 1);
3665
- if (endListeners.length == 0) __off("plugin_end", endTrampoline.index);
6460
+ if (!endListeners.remove(changetype<(event: PluginEndEvent) => void>(listener))) return;
6461
+ if (endListeners.count == 0) __off("plugin_end", endTrampoline.index);
6462
+ endDirect();
3666
6463
  return;
3667
6464
  }
3668
6465
  if (idof<E>() == idof<PluginLogEvent>()) {
3669
- const at = logListeners.indexOf(changetype<(event: PluginLogEvent) => void>(listener));
3670
- if (at < 0) return;
3671
- logListeners.splice(at, 1);
3672
- if (logListeners.length == 0) __off("plugin_log", logTrampoline.index);
6466
+ if (!logListeners.remove(changetype<(event: PluginLogEvent) => void>(listener))) return;
6467
+ if (logListeners.count == 0) __off("plugin_log", logTrampoline.index);
6468
+ logDirect();
3673
6469
  return;
3674
6470
  }
3675
6471
  if (idof<E>() == idof<PluginPrecacheEvent>()) {
3676
- const at = precacheListeners.indexOf(changetype<(event: PluginPrecacheEvent) => void>(listener));
3677
- if (at < 0) return;
3678
- precacheListeners.splice(at, 1);
3679
- if (precacheListeners.length == 0) __off("plugin_precache", precacheTrampoline.index);
6472
+ if (!precacheListeners.remove(changetype<(event: PluginPrecacheEvent) => void>(listener))) return;
6473
+ if (precacheListeners.count == 0) __off("plugin_precache", precacheTrampoline.index);
6474
+ precacheDirect();
3680
6475
  return;
3681
6476
  }
3682
6477
  if (idof<E>() == idof<ClientInfochangedEvent>()) {
3683
- const at = clientInfochangedListeners.indexOf(changetype<(event: ClientInfochangedEvent) => void>(listener));
3684
- if (at < 0) return;
3685
- clientInfochangedListeners.splice(at, 1);
3686
- if (clientInfochangedListeners.length == 0) __off("client_infochanged", clientInfochangedTrampoline.index);
6478
+ if (!clientInfochangedListeners.remove(changetype<(event: ClientInfochangedEvent) => void>(listener))) return;
6479
+ if (clientInfochangedListeners.count == 0) __off("client_infochanged", clientInfochangedTrampoline.index);
6480
+ clientInfochangedDirect();
3687
6481
  return;
3688
6482
  }
3689
6483
  if (idof<E>() == idof<ClientConnectEvent>()) {
3690
- const at = connectListeners.indexOf(changetype<(event: ClientConnectEvent) => void>(listener));
3691
- if (at < 0) return;
3692
- connectListeners.splice(at, 1);
3693
- if (connectListeners.length == 0) __off("client_connect", connectTrampoline.index);
6484
+ if (!connectListeners.remove(changetype<(event: ClientConnectEvent) => void>(listener))) return;
6485
+ if (connectListeners.count == 0) __off("client_connect", connectTrampoline.index);
6486
+ connectDirect();
3694
6487
  return;
3695
6488
  }
3696
6489
  if (idof<E>() == idof<ClientConnectexEvent>()) {
3697
- const at = connectAttemptListeners.indexOf(changetype<(event: ClientConnectexEvent) => void>(listener));
3698
- if (at < 0) return;
3699
- connectAttemptListeners.splice(at, 1);
3700
- if (connectAttemptListeners.length == 0) __off("client_connectex", connectAttemptTrampoline.index);
6490
+ if (!connectAttemptListeners.remove(changetype<(event: ClientConnectexEvent) => void>(listener))) return;
6491
+ if (connectAttemptListeners.count == 0) __off("client_connectex", connectAttemptTrampoline.index);
6492
+ connectAttemptDirect();
3701
6493
  return;
3702
6494
  }
3703
6495
  if (idof<E>() == idof<ClientAuthorizedEvent>()) {
3704
- const at = authorizedListeners.indexOf(changetype<(event: ClientAuthorizedEvent) => void>(listener));
3705
- if (at < 0) return;
3706
- authorizedListeners.splice(at, 1);
3707
- if (authorizedListeners.length == 0) __off("client_authorized", authorizedTrampoline.index);
6496
+ if (!authorizedListeners.remove(changetype<(event: ClientAuthorizedEvent) => void>(listener))) return;
6497
+ if (authorizedListeners.count == 0) __off("client_authorized", authorizedTrampoline.index);
6498
+ authorizedDirect();
3708
6499
  return;
3709
6500
  }
3710
6501
  if (idof<E>() == idof<ClientDisconnectedEvent>()) {
3711
- const at = disconnectedListeners.indexOf(changetype<(event: ClientDisconnectedEvent) => void>(listener));
3712
- if (at < 0) return;
3713
- disconnectedListeners.splice(at, 1);
3714
- if (disconnectedListeners.length == 0) __off("client_disconnected", disconnectedTrampoline.index);
6502
+ if (!disconnectedListeners.remove(changetype<(event: ClientDisconnectedEvent) => void>(listener))) return;
6503
+ if (disconnectedListeners.count == 0) __off("client_disconnected", disconnectedTrampoline.index);
6504
+ disconnectedDirect();
3715
6505
  return;
3716
6506
  }
3717
6507
  if (idof<E>() == idof<ClientRemoveEvent>()) {
3718
- const at = removeListeners.indexOf(changetype<(event: ClientRemoveEvent) => void>(listener));
3719
- if (at < 0) return;
3720
- removeListeners.splice(at, 1);
3721
- if (removeListeners.length == 0) __off("client_remove", removeTrampoline.index);
6508
+ if (!removeListeners.remove(changetype<(event: ClientRemoveEvent) => void>(listener))) return;
6509
+ if (removeListeners.count == 0) __off("client_remove", removeTrampoline.index);
6510
+ removeDirect();
3722
6511
  return;
3723
6512
  }
3724
6513
  if (idof<E>() == idof<ClientCommandEvent>()) {
3725
- const at = commandListeners.indexOf(changetype<(event: ClientCommandEvent) => void>(listener));
3726
- if (at < 0) return;
3727
- commandListeners.splice(at, 1);
3728
- if (commandListeners.length == 0) __off("client_command", commandTrampoline.index);
6514
+ if (!commandListeners.remove(changetype<(event: ClientCommandEvent) => void>(listener))) return;
6515
+ if (commandListeners.count == 0) __off("client_command", commandTrampoline.index);
6516
+ commandDirect();
3729
6517
  return;
3730
6518
  }
3731
6519
  if (idof<E>() == idof<ClientPutinserverEvent>()) {
3732
- const at = putInServerListeners.indexOf(changetype<(event: ClientPutinserverEvent) => void>(listener));
3733
- if (at < 0) return;
3734
- putInServerListeners.splice(at, 1);
3735
- if (putInServerListeners.length == 0) __off("client_putinserver", putInServerTrampoline.index);
6520
+ if (!putInServerListeners.remove(changetype<(event: ClientPutinserverEvent) => void>(listener))) return;
6521
+ if (putInServerListeners.count == 0) __off("client_putinserver", putInServerTrampoline.index);
6522
+ putInServerDirect();
3736
6523
  return;
3737
6524
  }
3738
6525
  if (idof<E>() == idof<InconsistentFileEvent>()) {
3739
- const at = inconsistentFileListeners.indexOf(changetype<(event: InconsistentFileEvent) => void>(listener));
3740
- if (at < 0) return;
3741
- inconsistentFileListeners.splice(at, 1);
3742
- if (inconsistentFileListeners.length == 0) __off("inconsistent_file", inconsistentFileTrampoline.index);
3743
- return;
3744
- }
3745
- if (idof<E>() == idof<PluginModulesEvent>()) {
3746
- const at = modulesListeners.indexOf(changetype<(event: PluginModulesEvent) => void>(listener));
3747
- if (at < 0) return;
3748
- modulesListeners.splice(at, 1);
3749
- if (modulesListeners.length == 0) __off("plugin_modules", modulesTrampoline.index);
6526
+ if (!inconsistentFileListeners.remove(changetype<(event: InconsistentFileEvent) => void>(listener))) return;
6527
+ if (inconsistentFileListeners.count == 0) __off("inconsistent_file", inconsistentFileTrampoline.index);
6528
+ inconsistentFileDirect();
3750
6529
  return;
3751
6530
  }
3752
6531
  if (idof<E>() == idof<OnConfigsExecutedEvent>()) {
3753
- const at = configsExecutedListeners.indexOf(changetype<(event: OnConfigsExecutedEvent) => void>(listener));
3754
- if (at < 0) return;
3755
- configsExecutedListeners.splice(at, 1);
3756
- if (configsExecutedListeners.length == 0) __off("OnConfigsExecuted", configsExecutedTrampoline.index);
6532
+ if (!configsExecutedListeners.remove(changetype<(event: OnConfigsExecutedEvent) => void>(listener))) return;
6533
+ if (configsExecutedListeners.count == 0) __off("OnConfigsExecuted", configsExecutedTrampoline.index);
6534
+ configsExecutedDirect();
3757
6535
  return;
3758
6536
  }
3759
6537
  if (idof<E>() == idof<OnAutoConfigsBufferedEvent>()) {
3760
- const at = configsQueuedListeners.indexOf(changetype<(event: OnAutoConfigsBufferedEvent) => void>(listener));
3761
- if (at < 0) return;
3762
- configsQueuedListeners.splice(at, 1);
3763
- if (configsQueuedListeners.length == 0) __off("OnAutoConfigsBuffered", configsQueuedTrampoline.index);
6538
+ if (!configsQueuedListeners.remove(changetype<(event: OnAutoConfigsBufferedEvent) => void>(listener))) return;
6539
+ if (configsQueuedListeners.count == 0) __off("OnAutoConfigsBuffered", configsQueuedTrampoline.index);
6540
+ configsQueuedDirect();
3764
6541
  return;
3765
6542
  }
3766
6543
  if (idof<E>() == idof<CS_InternalCommandEvent>()) {
3767
- const at = internalCommandListeners.indexOf(changetype<(event: CS_InternalCommandEvent) => void>(listener));
3768
- if (at < 0) return;
3769
- internalCommandListeners.splice(at, 1);
3770
- if (internalCommandListeners.length == 0) __off("CS_InternalCommand", internalCommandTrampoline.index);
6544
+ if (!internalCommandListeners.remove(changetype<(event: CS_InternalCommandEvent) => void>(listener))) return;
6545
+ if (internalCommandListeners.count == 0) __off("CS_InternalCommand", internalCommandTrampoline.index);
6546
+ internalCommandDirect();
3771
6547
  return;
3772
6548
  }
3773
6549
  if (idof<E>() == idof<CS_OnBuyAttemptEvent>()) {
3774
- const at = CS_OnBuyAttemptListeners.indexOf(changetype<(event: CS_OnBuyAttemptEvent) => void>(listener));
3775
- if (at < 0) return;
3776
- CS_OnBuyAttemptListeners.splice(at, 1);
3777
- if (CS_OnBuyAttemptListeners.length == 0) __off("CS_OnBuyAttempt", CS_OnBuyAttemptTrampoline.index);
6550
+ if (!CS_OnBuyAttemptListeners.remove(changetype<(event: CS_OnBuyAttemptEvent) => void>(listener))) return;
6551
+ if (CS_OnBuyAttemptListeners.count == 0) __off("CS_OnBuyAttempt", CS_OnBuyAttemptTrampoline.index);
6552
+ CS_OnBuyAttemptDirect();
3778
6553
  return;
3779
6554
  }
3780
6555
  if (idof<E>() == idof<CS_OnBuyEvent>()) {
3781
- const at = CS_OnBuyListeners.indexOf(changetype<(event: CS_OnBuyEvent) => void>(listener));
3782
- if (at < 0) return;
3783
- CS_OnBuyListeners.splice(at, 1);
3784
- if (CS_OnBuyListeners.length == 0) __off("CS_OnBuy", CS_OnBuyTrampoline.index);
6556
+ if (!CS_OnBuyListeners.remove(changetype<(event: CS_OnBuyEvent) => void>(listener))) return;
6557
+ if (CS_OnBuyListeners.count == 0) __off("CS_OnBuy", CS_OnBuyTrampoline.index);
6558
+ CS_OnBuyDirect();
3785
6559
  return;
3786
6560
  }
3787
6561
  if (idof<E>() == idof<ServerFrameEvent>()) {
3788
- const at = frameListeners.indexOf(changetype<(event: ServerFrameEvent) => void>(listener));
3789
- if (at < 0) return;
3790
- frameListeners.splice(at, 1);
3791
- if (frameListeners.length == 0) __off("server_frame", frameTrampoline.index);
6562
+ if (!frameListeners.remove(changetype<(event: ServerFrameEvent) => void>(listener))) return;
6563
+ if (frameListeners.count == 0) __off("server_frame", frameTrampoline.index);
6564
+ frameDirect();
3792
6565
  return;
3793
6566
  }
3794
6567
  if (idof<E>() == idof<ClientKillEvent>()) {
3795
- const at = suicideListeners.indexOf(changetype<(event: ClientKillEvent) => void>(listener));
3796
- if (at < 0) return;
3797
- suicideListeners.splice(at, 1);
3798
- if (suicideListeners.length == 0) __off("client_kill", suicideTrampoline.index);
6568
+ if (!suicideListeners.remove(changetype<(event: ClientKillEvent) => void>(listener))) return;
6569
+ if (suicideListeners.count == 0) __off("client_kill", suicideTrampoline.index);
6570
+ suicideDirect();
3799
6571
  return;
3800
6572
  }
3801
6573
  if (idof<E>() == idof<ClientImpulseEvent>()) {
3802
- const at = impulseListeners.indexOf(changetype<(event: ClientImpulseEvent) => void>(listener));
3803
- if (at < 0) return;
3804
- impulseListeners.splice(at, 1);
3805
- if (impulseListeners.length == 0) __off("client_impulse", impulseTrampoline.index);
6574
+ if (!impulseListeners.remove(changetype<(event: ClientImpulseEvent) => void>(listener))) return;
6575
+ if (impulseListeners.count == 0) __off("client_impulse", impulseTrampoline.index);
6576
+ impulseDirect();
3806
6577
  return;
3807
6578
  }
3808
6579
  if (idof<E>() == idof<ClientCmdStartEvent>()) {
3809
- const at = cmdStartListeners.indexOf(changetype<(event: ClientCmdStartEvent) => void>(listener));
3810
- if (at < 0) return;
3811
- cmdStartListeners.splice(at, 1);
3812
- if (cmdStartListeners.length == 0) __off("client_cmdStart", cmdStartTrampoline.index);
6580
+ if (!cmdStartListeners.remove(changetype<(event: ClientCmdStartEvent) => void>(listener))) return;
6581
+ if (cmdStartListeners.count == 0) __off("client_cmdStart", cmdStartTrampoline.index);
6582
+ cmdStartDirect();
3813
6583
  return;
3814
6584
  }
3815
6585
  if (idof<E>() == idof<PfnThinkEvent>()) {
3816
- const at = entityThinkListeners.indexOf(changetype<(event: PfnThinkEvent) => void>(listener));
3817
- if (at < 0) return;
3818
- entityThinkListeners.splice(at, 1);
3819
- if (entityThinkListeners.length == 0) __off("pfn_think", entityThinkTrampoline.index);
6586
+ if (!entityThinkListeners.remove(changetype<(event: PfnThinkEvent) => void>(listener))) return;
6587
+ if (entityThinkListeners.count == 0) __off("pfn_think", entityThinkTrampoline.index);
6588
+ entityThinkDirect();
3820
6589
  return;
3821
6590
  }
3822
6591
  if (idof<E>() == idof<PfnPlaybackeventEvent>()) {
3823
- const at = playbackEventListeners.indexOf(changetype<(event: PfnPlaybackeventEvent) => void>(listener));
3824
- if (at < 0) return;
3825
- playbackEventListeners.splice(at, 1);
3826
- if (playbackEventListeners.length == 0) __off("pfn_playbackevent", playbackEventTrampoline.index);
6592
+ if (!playbackEventListeners.remove(changetype<(event: PfnPlaybackeventEvent) => void>(listener))) return;
6593
+ if (playbackEventListeners.count == 0) __off("pfn_playbackevent", playbackEventTrampoline.index);
6594
+ playbackEventDirect();
3827
6595
  return;
3828
6596
  }
3829
6597
  if (idof<E>() == idof<PfnKeyvalueEvent>()) {
3830
- const at = keyValueListeners.indexOf(changetype<(event: PfnKeyvalueEvent) => void>(listener));
3831
- if (at < 0) return;
3832
- keyValueListeners.splice(at, 1);
3833
- if (keyValueListeners.length == 0) __off("pfn_keyvalue", keyValueTrampoline.index);
6598
+ if (!keyValueListeners.remove(changetype<(event: PfnKeyvalueEvent) => void>(listener))) return;
6599
+ if (keyValueListeners.count == 0) __off("pfn_keyvalue", keyValueTrampoline.index);
6600
+ keyValueDirect();
3834
6601
  return;
3835
6602
  }
3836
6603
  if (idof<E>() == idof<PfnSpawnEvent>()) {
3837
- const at = entitySpawnListeners.indexOf(changetype<(event: PfnSpawnEvent) => void>(listener));
3838
- if (at < 0) return;
3839
- entitySpawnListeners.splice(at, 1);
3840
- if (entitySpawnListeners.length == 0) __off("pfn_spawn", entitySpawnTrampoline.index);
6604
+ if (!entitySpawnListeners.remove(changetype<(event: PfnSpawnEvent) => void>(listener))) return;
6605
+ if (entitySpawnListeners.count == 0) __off("pfn_spawn", entitySpawnTrampoline.index);
6606
+ entitySpawnDirect();
3841
6607
  return;
3842
6608
  }
3843
6609
  }