quake2ts 0.0.481 → 0.0.483

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 (26) hide show
  1. package/package.json +1 -1
  2. package/packages/client/dist/browser/index.global.js +16 -16
  3. package/packages/client/dist/browser/index.global.js.map +1 -1
  4. package/packages/client/dist/cjs/index.cjs +79 -1
  5. package/packages/client/dist/cjs/index.cjs.map +1 -1
  6. package/packages/client/dist/esm/index.js +80 -2
  7. package/packages/client/dist/esm/index.js.map +1 -1
  8. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  9. package/packages/client/dist/types/session.d.ts +21 -1
  10. package/packages/client/dist/types/session.d.ts.map +1 -1
  11. package/packages/game/dist/browser/index.global.js +4 -4
  12. package/packages/game/dist/browser/index.global.js.map +1 -1
  13. package/packages/game/dist/cjs/index.cjs +1867 -2058
  14. package/packages/game/dist/cjs/index.cjs.map +1 -1
  15. package/packages/game/dist/esm/index.js +1547 -1745
  16. package/packages/game/dist/esm/index.js.map +1 -1
  17. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  18. package/packages/game/dist/types/combat/weapons/animation.d.ts +0 -7
  19. package/packages/game/dist/types/combat/weapons/animation.d.ts.map +1 -1
  20. package/packages/game/dist/types/combat/weapons/common.d.ts +7 -0
  21. package/packages/game/dist/types/combat/weapons/common.d.ts.map +1 -1
  22. package/packages/game/dist/types/combat/weapons/grenadelauncher.d.ts.map +1 -1
  23. package/packages/game/dist/types/combat/weapons/switching.d.ts +1 -0
  24. package/packages/game/dist/types/combat/weapons/switching.d.ts.map +1 -1
  25. package/packages/game/dist/types/inventory/playerInventory.d.ts +1 -0
  26. package/packages/game/dist/types/inventory/playerInventory.d.ts.map +1 -1
@@ -3,9 +3,6 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __esm = (fn, res) => function __init() {
7
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
8
- };
9
6
  var __export = (target, all) => {
10
7
  for (var name in all)
11
8
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -20,7 +17,195 @@ var __copyProps = (to, from, except, desc) => {
20
17
  };
21
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
22
19
 
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ AIFlags: () => AIFlags,
24
+ AI_GetSightClient: () => AI_GetSightClient,
25
+ AMMO_TYPE_COUNT: () => AMMO_TYPE_COUNT,
26
+ ARMOR_INFO: () => ARMOR_INFO,
27
+ ARMOR_ITEMS: () => ARMOR_ITEMS,
28
+ AmmoItemId: () => AmmoItemId,
29
+ AmmoType: () => AmmoType,
30
+ ArmorType: () => ArmorType,
31
+ AttackState: () => AttackState,
32
+ BOTTOM_EMPTY: () => BOTTOM_EMPTY,
33
+ BOTTOM_LAVA: () => BOTTOM_LAVA,
34
+ BOTTOM_SLIME: () => BOTTOM_SLIME,
35
+ BOTTOM_SOLID: () => BOTTOM_SOLID,
36
+ BOTTOM_WATER: () => BOTTOM_WATER,
37
+ BlockedJumpResult: () => BlockedJumpResult,
38
+ CheckGround: () => CheckGround,
39
+ DamageFlags: () => DamageFlags,
40
+ DamageMod: () => DamageMod,
41
+ DeadFlag: () => DeadFlag,
42
+ ENTITY_FIELD_METADATA: () => ENTITY_FIELD_METADATA,
43
+ Entity: () => Entity,
44
+ EntityDamageFlags: () => EntityDamageFlags,
45
+ EntitySystem: () => EntitySystem,
46
+ EnvironmentalFlags: () => EnvironmentalFlags,
47
+ FLAG_ITEMS: () => FLAG_ITEMS,
48
+ FL_NOTARGET: () => FL_NOTARGET,
49
+ FL_NOVISIBLE: () => FL_NOVISIBLE,
50
+ G_IdealHoverPosition: () => G_IdealHoverPosition,
51
+ HEALTH_ITEMS: () => HEALTH_ITEMS,
52
+ KEY_ITEMS: () => KEY_ITEMS,
53
+ KeyId: () => KeyId,
54
+ M_CalculatePitchToFire: () => M_CalculatePitchToFire,
55
+ M_ChangeYaw: () => M_ChangeYaw,
56
+ M_CheckAttack: () => M_CheckAttack,
57
+ M_CheckAttack_Base: () => M_CheckAttack_Base,
58
+ M_CheckBottom: () => M_CheckBottom,
59
+ M_CheckBottomEx: () => M_CheckBottomEx,
60
+ M_MoveFrame: () => M_MoveFrame,
61
+ M_MoveStep: () => M_MoveStep,
62
+ M_MoveToGoal: () => M_MoveToGoal,
63
+ M_MoveToPath: () => M_MoveToPath,
64
+ M_droptofloor: () => M_droptofloor,
65
+ M_droptofloor_generic: () => M_droptofloor_generic,
66
+ M_walkmove: () => M_walkmove,
67
+ MonsterAttackState: () => MonsterAttackState,
68
+ MoveType: () => MoveType,
69
+ MulticastType: () => MulticastType,
70
+ ORDERED_DAMAGE_MODS: () => ORDERED_DAMAGE_MODS,
71
+ PNOISE_IMPACT: () => PNOISE_IMPACT,
72
+ PNOISE_SELF: () => PNOISE_SELF,
73
+ PNOISE_WEAPON: () => PNOISE_WEAPON,
74
+ POWERUP_ITEMS: () => POWERUP_ITEMS,
75
+ POWER_ARMOR_ITEMS: () => POWER_ARMOR_ITEMS,
76
+ PlayerNoise: () => PlayerNoise,
77
+ PowerupId: () => PowerupId,
78
+ PredictAim: () => PredictAim,
79
+ RANGE_MELEE: () => RANGE_MELEE,
80
+ RANGE_MID: () => RANGE_MID,
81
+ RANGE_NEAR: () => RANGE_NEAR,
82
+ Range: () => RangeCategory,
83
+ RangeCategory: () => RangeCategory,
84
+ SAVE_FORMAT_VERSION: () => SAVE_FORMAT_VERSION,
85
+ SPAWNFLAG_MONSTER_AMBUSH: () => SPAWNFLAG_MONSTER_AMBUSH,
86
+ SV_NewChaseDir: () => SV_NewChaseDir,
87
+ SV_StepDirection: () => SV_StepDirection,
88
+ SV_flystep: () => SV_flystep,
89
+ SaveStorage: () => SaveStorage,
90
+ ServerFlags: () => ServerFlags,
91
+ Solid: () => Solid,
92
+ SpawnRegistry: () => SpawnRegistry,
93
+ T_Damage: () => T_Damage,
94
+ T_RadiusDamage: () => T_RadiusDamage,
95
+ TraceMask: () => TraceMask,
96
+ WEAPONS: () => WEAPONS,
97
+ WEAPON_ITEMS: () => WEAPON_ITEMS,
98
+ WeaponId: () => WeaponId,
99
+ WeaponStateEnum: () => WeaponStateEnum,
100
+ WeaponType: () => WeaponType,
101
+ addAmmo: () => addAmmo,
102
+ addKey: () => addKey,
103
+ addPowerup: () => addPowerup,
104
+ ai_charge: () => ai_charge,
105
+ ai_checkattack: () => ai_checkattack,
106
+ ai_face: () => ai_face,
107
+ ai_move: () => ai_move,
108
+ ai_run: () => ai_run,
109
+ ai_run_slide: () => ai_run_slide,
110
+ ai_stand: () => ai_stand,
111
+ ai_turn: () => ai_turn,
112
+ ai_walk: () => ai_walk,
113
+ applyCrushDamage: () => applyCrushDamage,
114
+ applyEntityKeyValues: () => applyEntityKeyValues,
115
+ applyEnvironmentalDamage: () => applyEnvironmentalDamage,
116
+ applyFallingDamage: () => applyFallingDamage,
117
+ applyPowerArmor: () => applyPowerArmor,
118
+ applyRegularArmor: () => applyRegularArmor,
119
+ applySaveFile: () => applySaveFile,
120
+ blocked_checkjump: () => blocked_checkjump,
121
+ blocked_checkplat: () => blocked_checkplat,
122
+ calculateFallingDamage: () => calculateFallingDamage,
123
+ calculateSaveChecksum: () => calculateSaveChecksum,
124
+ canPickupHealth: () => canPickupHealth,
125
+ changeYaw: () => changeYaw,
126
+ clampAmmoCounts: () => clampAmmoCounts,
127
+ classifyRange: () => classifyRange,
128
+ clearExpiredPowerups: () => clearExpiredPowerups,
129
+ convertGameSaveToRereleaseLevel: () => convertGameSaveToRereleaseLevel,
130
+ convertRereleaseLevelToGameSave: () => convertRereleaseLevelToGameSave,
131
+ convertRereleaseSaveToGameSave: () => convertRereleaseSaveToGameSave,
132
+ createAmmoInventory: () => createAmmoInventory,
133
+ createAmmoPickupEntity: () => createAmmoPickupEntity,
134
+ createArmorPickupEntity: () => createArmorPickupEntity,
135
+ createBaseAmmoCaps: () => createBaseAmmoCaps,
136
+ createCallbackRegistry: () => createCallbackRegistry,
137
+ createDefaultSpawnRegistry: () => createDefaultSpawnRegistry,
138
+ createFoodCubePickupEntity: () => createFoodCubePickupEntity,
139
+ createGame: () => createGame,
140
+ createHealthPickupEntity: () => createHealthPickupEntity,
141
+ createKeyPickupEntity: () => createKeyPickupEntity,
142
+ createPlayerInventory: () => createPlayerInventory,
143
+ createPlayerWeaponStates: () => createPlayerWeaponStates,
144
+ createPowerupPickupEntity: () => createPowerupPickupEntity,
145
+ createSaveFile: () => createSaveFile,
146
+ createWeaponPickupEntity: () => createWeaponPickupEntity,
147
+ damageModName: () => damageModName,
148
+ deserializePlayerInventory: () => deserializePlayerInventory,
149
+ equipArmor: () => equipArmor,
150
+ facingIdeal: () => facingIdeal,
151
+ findTarget: () => findTarget,
152
+ foundTarget: () => foundTarget,
153
+ getAmmoItemDefinition: () => getAmmoItemDefinition,
154
+ getWeaponState: () => getWeaponState,
155
+ giveAmmoItem: () => giveAmmoItem,
156
+ giveWeapon: () => giveWeapon,
157
+ hasAnyDamageFlag: () => hasAnyDamageFlag,
158
+ hasItem: () => hasItem,
159
+ hasKey: () => hasKey,
160
+ hasPowerup: () => hasPowerup,
161
+ hasWeapon: () => hasWeapon,
162
+ hashEntitySystem: () => hashEntitySystem,
163
+ hashGameState: () => hashGameState,
164
+ huntTarget: () => huntTarget,
165
+ infront: () => infront,
166
+ isZeroVector: () => isZeroVector,
167
+ killBox: () => killBox,
168
+ monster_done_dodge: () => monster_done_dodge,
169
+ monster_jump_finished: () => monster_jump_finished,
170
+ monster_jump_start: () => monster_jump_start,
171
+ monster_think: () => monster_think,
172
+ parseEntityLump: () => parseEntityLump,
173
+ parseRereleaseSave: () => parseRereleaseSave,
174
+ parseSaveFile: () => parseSaveFile,
175
+ pickupAmmo: () => pickupAmmo,
176
+ pickupArmor: () => pickupArmor,
177
+ pickupFlag: () => pickupFlag,
178
+ pickupKey: () => pickupKey,
179
+ pickupPowerArmor: () => pickupPowerArmor,
180
+ pickupPowerup: () => pickupPowerup,
181
+ pickupWeapon: () => pickupWeapon,
182
+ player_noise: () => player_noise,
183
+ range: () => rangeTo,
184
+ rangeTo: () => rangeTo,
185
+ registerCallback: () => registerCallback,
186
+ registerDefaultSpawns: () => registerDefaultSpawns,
187
+ resetInventory: () => resetInventory,
188
+ selectWeapon: () => selectWeapon,
189
+ serializePlayerInventory: () => serializePlayerInventory,
190
+ serializeRereleaseSave: () => serializeRereleaseSave,
191
+ setMovedir: () => setMovedir,
192
+ spawnEntitiesFromText: () => spawnEntitiesFromText,
193
+ spawnEntityFromDictionary: () => spawnEntityFromDictionary,
194
+ summarizeRereleaseSave: () => summarizeRereleaseSave,
195
+ visible: () => visible,
196
+ walkMove: () => walkMove
197
+ });
198
+ module.exports = __toCommonJS(index_exports);
199
+
23
200
  // ../shared/dist/esm/index.js
201
+ var __defProp2 = Object.defineProperty;
202
+ var __export2 = (target, all) => {
203
+ for (var name in all)
204
+ __defProp2(target, name, { get: all[name], enumerable: true });
205
+ };
206
+ var ZERO_VEC3 = { x: 0, y: 0, z: 0 };
207
+ var STOP_EPSILON = 0.1;
208
+ var DEG_TO_RAD = Math.PI / 180;
24
209
  function copyVec3(a) {
25
210
  return { x: a.x, y: a.y, z: a.z };
26
211
  }
@@ -167,6 +352,11 @@ function rotatePointAroundVector(dir, point, degrees) {
167
352
  z: rot[2][0] * point.x + rot[2][1] * point.y + rot[2][2] * point.z
168
353
  };
169
354
  }
355
+ var PITCH = 0;
356
+ var YAW = 1;
357
+ var ROLL = 2;
358
+ var DEG2RAD_FACTOR = Math.PI / 180;
359
+ var RAD2DEG_FACTOR = 180 / Math.PI;
170
360
  function axisComponent(vec, axis) {
171
361
  switch (axis) {
172
362
  case PITCH:
@@ -252,9 +442,413 @@ function vectorToAngles(vec) {
252
442
  }
253
443
  return { x: -pitch, y: yaw, z: 0 };
254
444
  }
445
+ var ANORMS = [
446
+ [-0.525731, 0, 0.850651],
447
+ [-0.442863, 0.238856, 0.864188],
448
+ [-0.295242, 0, 0.955423],
449
+ [-0.309017, 0.5, 0.809017],
450
+ [-0.16246, 0.262866, 0.951056],
451
+ [0, 0, 1],
452
+ [0, 0.850651, 0.525731],
453
+ [-0.147621, 0.716567, 0.681718],
454
+ [0.147621, 0.716567, 0.681718],
455
+ [0, 0.525731, 0.850651],
456
+ [0.309017, 0.5, 0.809017],
457
+ [0.525731, 0, 0.850651],
458
+ [0.295242, 0, 0.955423],
459
+ [0.442863, 0.238856, 0.864188],
460
+ [0.16246, 0.262866, 0.951056],
461
+ [-0.681718, 0.147621, 0.716567],
462
+ [-0.809017, 0.309017, 0.5],
463
+ [-0.587785, 0.425325, 0.688191],
464
+ [-0.850651, 0.525731, 0],
465
+ [-0.864188, 0.442863, 0.238856],
466
+ [-0.716567, 0.681718, 0.147621],
467
+ [-0.688191, 0.587785, 0.425325],
468
+ [-0.5, 0.809017, 0.309017],
469
+ [-0.238856, 0.864188, 0.442863],
470
+ [-0.425325, 0.688191, 0.587785],
471
+ [-0.716567, 0.681718, -0.147621],
472
+ [-0.5, 0.809017, -0.309017],
473
+ [-0.525731, 0.850651, 0],
474
+ [0, 0.850651, -0.525731],
475
+ [-0.238856, 0.864188, -0.442863],
476
+ [0, 0.955423, -0.295242],
477
+ [-0.262866, 0.951056, -0.16246],
478
+ [0, 1, 0],
479
+ [0, 0.955423, 0.295242],
480
+ [-0.262866, 0.951056, 0.16246],
481
+ [0.238856, 0.864188, 0.442863],
482
+ [0.262866, 0.951056, 0.16246],
483
+ [0.5, 0.809017, 0.309017],
484
+ [0.238856, 0.864188, -0.442863],
485
+ [0.262866, 0.951056, -0.16246],
486
+ [0.5, 0.809017, -0.309017],
487
+ [0.850651, 0.525731, 0],
488
+ [0.716567, 0.681718, 0.147621],
489
+ [0.716567, 0.681718, -0.147621],
490
+ [0.525731, 0.850651, 0],
491
+ [0.425325, 0.688191, 0.587785],
492
+ [0.864188, 0.442863, 0.238856],
493
+ [0.688191, 0.587785, 0.425325],
494
+ [0.809017, 0.309017, 0.5],
495
+ [0.681718, 0.147621, 0.716567],
496
+ [0.587785, 0.425325, 0.688191],
497
+ [0.955423, 0.295242, 0],
498
+ [1, 0, 0],
499
+ [0.951056, 0.16246, 0.262866],
500
+ [0.850651, -0.525731, 0],
501
+ [0.955423, -0.295242, 0],
502
+ [0.864188, -0.442863, 0.238856],
503
+ [0.951056, -0.16246, 0.262866],
504
+ [0.809017, -0.309017, 0.5],
505
+ [0.681718, -0.147621, 0.716567],
506
+ [0.850651, 0, 0.525731],
507
+ [0.864188, 0.442863, -0.238856],
508
+ [0.809017, 0.309017, -0.5],
509
+ [0.951056, 0.16246, -0.262866],
510
+ [0.525731, 0, -0.850651],
511
+ [0.681718, 0.147621, -0.716567],
512
+ [0.681718, -0.147621, -0.716567],
513
+ [0.850651, 0, -0.525731],
514
+ [0.809017, -0.309017, -0.5],
515
+ [0.864188, -0.442863, -0.238856],
516
+ [0.951056, -0.16246, -0.262866],
517
+ [0.147621, 0.716567, -0.681718],
518
+ [0.309017, 0.5, -0.809017],
519
+ [0.425325, 0.688191, -0.587785],
520
+ [0.442863, 0.238856, -0.864188],
521
+ [0.587785, 0.425325, -0.688191],
522
+ [0.688191, 0.587785, -0.425325],
523
+ [-0.147621, 0.716567, -0.681718],
524
+ [-0.309017, 0.5, -0.809017],
525
+ [0, 0.525731, -0.850651],
526
+ [-0.525731, 0, -0.850651],
527
+ [-0.442863, 0.238856, -0.864188],
528
+ [-0.295242, 0, -0.955423],
529
+ [-0.16246, 0.262866, -0.951056],
530
+ [0, 0, -1],
531
+ [0.295242, 0, -0.955423],
532
+ [0.16246, 0.262866, -0.951056],
533
+ [-0.442863, -0.238856, -0.864188],
534
+ [-0.309017, -0.5, -0.809017],
535
+ [-0.16246, -0.262866, -0.951056],
536
+ [0, -0.850651, -0.525731],
537
+ [-0.147621, -0.716567, -0.681718],
538
+ [0.147621, -0.716567, -0.681718],
539
+ [0, -0.525731, -0.850651],
540
+ [0.309017, -0.5, -0.809017],
541
+ [0.442863, -0.238856, -0.864188],
542
+ [0.16246, -0.262866, -0.951056],
543
+ [0.238856, -0.864188, -0.442863],
544
+ [0.5, -0.809017, -0.309017],
545
+ [0.425325, -0.688191, -0.587785],
546
+ [0.716567, -0.681718, -0.147621],
547
+ [0.688191, -0.587785, -0.425325],
548
+ [0.587785, -0.425325, -0.688191],
549
+ [0, -0.955423, -0.295242],
550
+ [0, -1, 0],
551
+ [0.262866, -0.951056, -0.16246],
552
+ [0, -0.850651, 0.525731],
553
+ [0, -0.955423, 0.295242],
554
+ [0.238856, -0.864188, 0.442863],
555
+ [0.262866, -0.951056, 0.16246],
556
+ [0.5, -0.809017, 0.309017],
557
+ [0.716567, -0.681718, 0.147621],
558
+ [0.525731, -0.850651, 0],
559
+ [-0.238856, -0.864188, -0.442863],
560
+ [-0.5, -0.809017, -0.309017],
561
+ [-0.262866, -0.951056, -0.16246],
562
+ [-0.850651, -0.525731, 0],
563
+ [-0.716567, -0.681718, -0.147621],
564
+ [-0.716567, -0.681718, 0.147621],
565
+ [-0.525731, -0.850651, 0],
566
+ [-0.5, -0.809017, 0.309017],
567
+ [-0.238856, -0.864188, 0.442863],
568
+ [-0.262866, -0.951056, 0.16246],
569
+ [-0.864188, -0.442863, 0.238856],
570
+ [-0.809017, -0.309017, 0.5],
571
+ [-0.688191, -0.587785, 0.425325],
572
+ [-0.681718, -0.147621, 0.716567],
573
+ [-0.442863, -0.238856, 0.864188],
574
+ [-0.587785, -0.425325, 0.688191],
575
+ [-0.309017, -0.5, 0.809017],
576
+ [-0.147621, -0.716567, 0.681718],
577
+ [-0.425325, -0.688191, 0.587785],
578
+ [-0.16246, -0.262866, 0.951056],
579
+ [0.442863, -0.238856, 0.864188],
580
+ [0.16246, -0.262866, 0.951056],
581
+ [0.309017, -0.5, 0.809017],
582
+ [0.147621, -0.716567, 0.681718],
583
+ [0, -0.525731, 0.850651],
584
+ [0.425325, -0.688191, 0.587785],
585
+ [0.587785, -0.425325, 0.688191],
586
+ [0.688191, -0.587785, 0.425325],
587
+ [-0.955423, 0.295242, 0],
588
+ [-0.951056, 0.16246, 0.262866],
589
+ [-1, 0, 0],
590
+ [-0.850651, 0, 0.525731],
591
+ [-0.955423, -0.295242, 0],
592
+ [-0.951056, -0.16246, 0.262866],
593
+ [-0.864188, 0.442863, -0.238856],
594
+ [-0.951056, 0.16246, -0.262866],
595
+ [-0.809017, 0.309017, -0.5],
596
+ [-0.864188, -0.442863, -0.238856],
597
+ [-0.951056, -0.16246, -0.262866],
598
+ [-0.809017, -0.309017, -0.5],
599
+ [-0.681718, 0.147621, -0.716567],
600
+ [-0.681718, -0.147621, -0.716567],
601
+ [-0.850651, 0, -0.525731],
602
+ [-0.688191, 0.587785, -0.425325],
603
+ [-0.587785, 0.425325, -0.688191],
604
+ [-0.425325, 0.688191, -0.587785],
605
+ [-0.425325, -0.688191, -0.587785],
606
+ [-0.587785, -0.425325, -0.688191],
607
+ [-0.688191, -0.587785, -0.425325]
608
+ ];
609
+ var STATE_SIZE = 624;
610
+ var MIDDLE_WORD = 397;
611
+ var MATRIX_A = 2567483615;
612
+ var UPPER_MASK = 2147483648;
613
+ var LOWER_MASK = 2147483647;
614
+ var TWO_POW_32 = 4294967296;
615
+ var MersenneTwister19937 = class {
616
+ constructor(seed = 5489) {
617
+ this.state = new Uint32Array(STATE_SIZE);
618
+ this.index = STATE_SIZE;
619
+ this.seed(seed);
620
+ }
621
+ seed(seed) {
622
+ this.state[0] = seed >>> 0;
623
+ for (let i = 1; i < STATE_SIZE; i++) {
624
+ const prev = this.state[i - 1] ^ this.state[i - 1] >>> 30;
625
+ const next = Math.imul(prev >>> 0, 1812433253) + i;
626
+ this.state[i] = next >>> 0;
627
+ }
628
+ this.index = STATE_SIZE;
629
+ }
630
+ nextUint32() {
631
+ if (this.index >= STATE_SIZE) {
632
+ this.twist();
633
+ }
634
+ let y = this.state[this.index++];
635
+ y ^= y >>> 11;
636
+ y ^= y << 7 & 2636928640;
637
+ y ^= y << 15 & 4022730752;
638
+ y ^= y >>> 18;
639
+ return y >>> 0;
640
+ }
641
+ twist() {
642
+ for (let i = 0; i < STATE_SIZE; i++) {
643
+ const y = this.state[i] & UPPER_MASK | this.state[(i + 1) % STATE_SIZE] & LOWER_MASK;
644
+ let next = this.state[(i + MIDDLE_WORD) % STATE_SIZE] ^ y >>> 1;
645
+ if ((y & 1) !== 0) {
646
+ next ^= MATRIX_A;
647
+ }
648
+ this.state[i] = next >>> 0;
649
+ }
650
+ this.index = 0;
651
+ }
652
+ getState() {
653
+ return {
654
+ index: this.index,
655
+ state: Array.from(this.state)
656
+ };
657
+ }
658
+ setState(snapshot) {
659
+ if (snapshot.state.length !== STATE_SIZE) {
660
+ throw new Error(`Expected ${STATE_SIZE} MT state values, received ${snapshot.state.length}`);
661
+ }
662
+ this.index = snapshot.index;
663
+ this.state = Uint32Array.from(snapshot.state, (value) => value >>> 0);
664
+ }
665
+ };
666
+ var RandomGenerator = class {
667
+ constructor(options = {}) {
668
+ this.mt = new MersenneTwister19937(options.seed);
669
+ }
670
+ seed(seed) {
671
+ this.mt.seed(seed);
672
+ }
673
+ /** Uniform float in [0, 1). */
674
+ frandom() {
675
+ return this.mt.nextUint32() / TWO_POW_32;
676
+ }
677
+ /** Uniform float in [min, max). */
678
+ frandomRange(minInclusive, maxExclusive) {
679
+ return minInclusive + (maxExclusive - minInclusive) * this.frandom();
680
+ }
681
+ /** Uniform float in [0, max). */
682
+ frandomMax(maxExclusive) {
683
+ return this.frandomRange(0, maxExclusive);
684
+ }
685
+ /** Uniform float in [-1, 1). */
686
+ crandom() {
687
+ return this.frandomRange(-1, 1);
688
+ }
689
+ /** Uniform float in (-1, 1). */
690
+ crandomOpen() {
691
+ const epsilon = Number.EPSILON;
692
+ return this.frandomRange(-1 + epsilon, 1);
693
+ }
694
+ /** Raw uint32 sample. */
695
+ irandomUint32() {
696
+ return this.mt.nextUint32();
697
+ }
698
+ /** Uniform integer in [min, max). */
699
+ irandomRange(minInclusive, maxExclusive) {
700
+ if (maxExclusive - minInclusive <= 1) {
701
+ return minInclusive;
702
+ }
703
+ const span = maxExclusive - minInclusive;
704
+ const limit = TWO_POW_32 - TWO_POW_32 % span;
705
+ let sample;
706
+ do {
707
+ sample = this.mt.nextUint32();
708
+ } while (sample >= limit);
709
+ return minInclusive + sample % span;
710
+ }
711
+ /** Uniform integer in [0, max). */
712
+ irandom(maxExclusive) {
713
+ if (maxExclusive <= 0) {
714
+ return 0;
715
+ }
716
+ return this.irandomRange(0, maxExclusive);
717
+ }
718
+ /** Uniform time in milliseconds [min, max). */
719
+ randomTimeRange(minMs, maxMs) {
720
+ if (maxMs <= minMs) {
721
+ return minMs;
722
+ }
723
+ return this.irandomRange(minMs, maxMs);
724
+ }
725
+ /** Uniform time in milliseconds [0, max). */
726
+ randomTime(maxMs) {
727
+ return this.irandom(maxMs);
728
+ }
729
+ randomIndex(container) {
730
+ return this.irandom(container.length);
731
+ }
732
+ getState() {
733
+ return { mt: this.mt.getState() };
734
+ }
735
+ setState(snapshot) {
736
+ this.mt.setState(snapshot.mt);
737
+ }
738
+ };
255
739
  function createRandomGenerator(options) {
256
740
  return new RandomGenerator(options);
257
741
  }
742
+ var CONTENTS_SOLID = 1 << 0;
743
+ var CONTENTS_WINDOW = 1 << 1;
744
+ var CONTENTS_AUX = 1 << 2;
745
+ var CONTENTS_LAVA = 1 << 3;
746
+ var CONTENTS_SLIME = 1 << 4;
747
+ var CONTENTS_WATER = 1 << 5;
748
+ var CONTENTS_MIST = 1 << 6;
749
+ var CONTENTS_NO_WATERJUMP = 1 << 13;
750
+ var CONTENTS_PROJECTILECLIP = 1 << 14;
751
+ var CONTENTS_AREAPORTAL = 1 << 15;
752
+ var CONTENTS_PLAYERCLIP = 1 << 16;
753
+ var CONTENTS_MONSTERCLIP = 1 << 17;
754
+ var CONTENTS_CURRENT_0 = 1 << 18;
755
+ var CONTENTS_CURRENT_90 = 1 << 19;
756
+ var CONTENTS_CURRENT_180 = 1 << 20;
757
+ var CONTENTS_CURRENT_270 = 1 << 21;
758
+ var CONTENTS_CURRENT_UP = 1 << 22;
759
+ var CONTENTS_CURRENT_DOWN = 1 << 23;
760
+ var CONTENTS_ORIGIN = 1 << 24;
761
+ var CONTENTS_MONSTER = 1 << 25;
762
+ var CONTENTS_DEADMONSTER = 1 << 26;
763
+ var CONTENTS_DETAIL = 1 << 27;
764
+ var CONTENTS_TRANSLUCENT = 1 << 28;
765
+ var CONTENTS_LADDER = 1 << 29;
766
+ var CONTENTS_PLAYER = 1 << 30;
767
+ var CONTENTS_PROJECTILE = 1 << 31;
768
+ var SURF_LIGHT = 1 << 0;
769
+ var SURF_SLICK = 1 << 1;
770
+ var SURF_SKY = 1 << 2;
771
+ var SURF_WARP = 1 << 3;
772
+ var SURF_TRANS33 = 1 << 4;
773
+ var SURF_TRANS66 = 1 << 5;
774
+ var SURF_FLOWING = 1 << 6;
775
+ var SURF_NODRAW = 1 << 7;
776
+ var SURF_ALPHATEST = 1 << 25;
777
+ var SURF_N64_UV = 1 << 28;
778
+ var SURF_N64_SCROLL_X = 1 << 29;
779
+ var SURF_N64_SCROLL_Y = 1 << 30;
780
+ var SURF_N64_SCROLL_FLIP = 1 << 31;
781
+ var MASK_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
782
+ var MASK_PLAYERSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
783
+ var MASK_DEADSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
784
+ var MASK_MONSTERSOLID = CONTENTS_SOLID | CONTENTS_MONSTERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
785
+ var MASK_WATER = CONTENTS_WATER | CONTENTS_LAVA | CONTENTS_SLIME;
786
+ var MASK_OPAQUE = CONTENTS_SOLID | CONTENTS_SLIME | CONTENTS_LAVA;
787
+ var MASK_SHOT = CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_PLAYER | CONTENTS_WINDOW | CONTENTS_DEADMONSTER;
788
+ var MASK_CURRENT = CONTENTS_CURRENT_0 | CONTENTS_CURRENT_90 | CONTENTS_CURRENT_180 | CONTENTS_CURRENT_270 | CONTENTS_CURRENT_UP | CONTENTS_CURRENT_DOWN;
789
+ var MASK_BLOCK_SIGHT = CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_MONSTER | CONTENTS_PLAYER;
790
+ var MASK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
791
+ var MASK_LADDER_NAV_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
792
+ var MASK_WALK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTERCLIP;
793
+ var MASK_PROJECTILE = MASK_SHOT | CONTENTS_PROJECTILECLIP;
794
+ var MAX_CHECKCOUNT = Number.MAX_SAFE_INTEGER - 1;
795
+ var CvarFlags = /* @__PURE__ */ ((CvarFlags2) => {
796
+ CvarFlags2[CvarFlags2["None"] = 0] = "None";
797
+ CvarFlags2[CvarFlags2["Archive"] = 1] = "Archive";
798
+ CvarFlags2[CvarFlags2["UserInfo"] = 2] = "UserInfo";
799
+ CvarFlags2[CvarFlags2["ServerInfo"] = 4] = "ServerInfo";
800
+ CvarFlags2[CvarFlags2["Latch"] = 8] = "Latch";
801
+ CvarFlags2[CvarFlags2["Cheat"] = 16] = "Cheat";
802
+ return CvarFlags2;
803
+ })(CvarFlags || {});
804
+ var MAX_CLIENTS = 256;
805
+ var MAX_LIGHTSTYLES = 256;
806
+ var MAX_MODELS = 8192;
807
+ var MAX_SOUNDS = 2048;
808
+ var MAX_IMAGES = 512;
809
+ var MAX_ITEMS = 256;
810
+ var MAX_GENERAL = MAX_CLIENTS * 2;
811
+ var MAX_SHADOW_LIGHTS = 256;
812
+ var MAX_WHEEL_ITEMS = 32;
813
+ var ConfigStringIndex = ((ConfigStringIndex2) => {
814
+ ConfigStringIndex2[ConfigStringIndex2["Name"] = 0] = "Name";
815
+ ConfigStringIndex2[ConfigStringIndex2["CdTrack"] = 1] = "CdTrack";
816
+ ConfigStringIndex2[ConfigStringIndex2["Sky"] = 2] = "Sky";
817
+ ConfigStringIndex2[ConfigStringIndex2["SkyAxis"] = 3] = "SkyAxis";
818
+ ConfigStringIndex2[ConfigStringIndex2["SkyRotate"] = 4] = "SkyRotate";
819
+ ConfigStringIndex2[ConfigStringIndex2["StatusBar"] = 5] = "StatusBar";
820
+ ConfigStringIndex2[ConfigStringIndex2["HealthBarName"] = 55] = "HealthBarName";
821
+ ConfigStringIndex2[ConfigStringIndex2["CONFIG_N64_PHYSICS"] = 56] = "CONFIG_N64_PHYSICS";
822
+ ConfigStringIndex2[ConfigStringIndex2["CONFIG_CTF_TEAMS"] = 57] = "CONFIG_CTF_TEAMS";
823
+ ConfigStringIndex2[ConfigStringIndex2["CONFIG_COOP_RESPAWN_STRING"] = 58] = "CONFIG_COOP_RESPAWN_STRING";
824
+ ConfigStringIndex2[ConfigStringIndex2["Story"] = 54] = "Story";
825
+ ConfigStringIndex2[ConfigStringIndex2["AirAccel"] = 59] = "AirAccel";
826
+ ConfigStringIndex2[ConfigStringIndex2["MaxClients"] = 60] = "MaxClients";
827
+ ConfigStringIndex2[ConfigStringIndex2["MapChecksum"] = 61] = "MapChecksum";
828
+ ConfigStringIndex2[ConfigStringIndex2["Models"] = 62] = "Models";
829
+ ConfigStringIndex2[ConfigStringIndex2["Sounds"] = 62 + MAX_MODELS] = "Sounds";
830
+ ConfigStringIndex2[ConfigStringIndex2["Images"] = ConfigStringIndex2.Sounds + MAX_SOUNDS] = "Images";
831
+ ConfigStringIndex2[ConfigStringIndex2["Lights"] = ConfigStringIndex2.Images + MAX_IMAGES] = "Lights";
832
+ ConfigStringIndex2[ConfigStringIndex2["ShadowLights"] = ConfigStringIndex2.Lights + MAX_LIGHTSTYLES] = "ShadowLights";
833
+ ConfigStringIndex2[ConfigStringIndex2["Items"] = ConfigStringIndex2.ShadowLights + MAX_SHADOW_LIGHTS] = "Items";
834
+ ConfigStringIndex2[ConfigStringIndex2["PlayerSkins"] = ConfigStringIndex2.Items + MAX_ITEMS] = "PlayerSkins";
835
+ ConfigStringIndex2[ConfigStringIndex2["General"] = ConfigStringIndex2.PlayerSkins + MAX_CLIENTS] = "General";
836
+ ConfigStringIndex2[ConfigStringIndex2["WheelWeapons"] = ConfigStringIndex2.General + MAX_GENERAL] = "WheelWeapons";
837
+ ConfigStringIndex2[ConfigStringIndex2["WheelAmmo"] = ConfigStringIndex2.WheelWeapons + MAX_WHEEL_ITEMS] = "WheelAmmo";
838
+ ConfigStringIndex2[ConfigStringIndex2["WheelPowerups"] = ConfigStringIndex2.WheelAmmo + MAX_WHEEL_ITEMS] = "WheelPowerups";
839
+ ConfigStringIndex2[ConfigStringIndex2["CdLoopCount"] = ConfigStringIndex2.WheelPowerups + MAX_WHEEL_ITEMS] = "CdLoopCount";
840
+ ConfigStringIndex2[ConfigStringIndex2["GameStyle"] = ConfigStringIndex2.CdLoopCount + 1] = "GameStyle";
841
+ ConfigStringIndex2[ConfigStringIndex2["MaxConfigStrings"] = ConfigStringIndex2.GameStyle + 1] = "MaxConfigStrings";
842
+ return ConfigStringIndex2;
843
+ })(ConfigStringIndex || {});
844
+ var MAX_CONFIGSTRINGS = ConfigStringIndex.MaxConfigStrings;
845
+ var replay_exports = {};
846
+ __export2(replay_exports, {
847
+ addReplayFrame: () => addReplayFrame,
848
+ createReplaySession: () => createReplaySession,
849
+ deserializeReplay: () => deserializeReplay,
850
+ serializeReplay: () => serializeReplay
851
+ });
258
852
  function serializeReplay(session) {
259
853
  return JSON.stringify(session, null, 2);
260
854
  }
@@ -283,6 +877,14 @@ function addReplayFrame(session, cmd, serverFrame, startTime) {
283
877
  timestamp: Date.now() - startTime
284
878
  });
285
879
  }
880
+ var WaterLevel = /* @__PURE__ */ ((WaterLevel4) => {
881
+ WaterLevel4[WaterLevel4["None"] = 0] = "None";
882
+ WaterLevel4[WaterLevel4["Feet"] = 1] = "Feet";
883
+ WaterLevel4[WaterLevel4["Waist"] = 2] = "Waist";
884
+ WaterLevel4[WaterLevel4["Under"] = 3] = "Under";
885
+ return WaterLevel4;
886
+ })(WaterLevel || {});
887
+ var WATERJUMP_CLEAR = 8 | 16 | 32 | 1024;
286
888
  function applyPmoveFriction(params) {
287
889
  const {
288
890
  velocity,
@@ -381,6 +983,120 @@ function buildWaterWish(params) {
381
983
  wishspeed
382
984
  };
383
985
  }
986
+ var ServerCommand = /* @__PURE__ */ ((ServerCommand22) => {
987
+ ServerCommand22[ServerCommand22["bad"] = 0] = "bad";
988
+ ServerCommand22[ServerCommand22["muzzleflash"] = 1] = "muzzleflash";
989
+ ServerCommand22[ServerCommand22["muzzleflash2"] = 2] = "muzzleflash2";
990
+ ServerCommand22[ServerCommand22["temp_entity"] = 3] = "temp_entity";
991
+ ServerCommand22[ServerCommand22["layout"] = 4] = "layout";
992
+ ServerCommand22[ServerCommand22["inventory"] = 5] = "inventory";
993
+ ServerCommand22[ServerCommand22["nop"] = 6] = "nop";
994
+ ServerCommand22[ServerCommand22["disconnect"] = 7] = "disconnect";
995
+ ServerCommand22[ServerCommand22["reconnect"] = 8] = "reconnect";
996
+ ServerCommand22[ServerCommand22["sound"] = 9] = "sound";
997
+ ServerCommand22[ServerCommand22["print"] = 10] = "print";
998
+ ServerCommand22[ServerCommand22["stufftext"] = 11] = "stufftext";
999
+ ServerCommand22[ServerCommand22["serverdata"] = 12] = "serverdata";
1000
+ ServerCommand22[ServerCommand22["configstring"] = 13] = "configstring";
1001
+ ServerCommand22[ServerCommand22["spawnbaseline"] = 14] = "spawnbaseline";
1002
+ ServerCommand22[ServerCommand22["centerprint"] = 15] = "centerprint";
1003
+ ServerCommand22[ServerCommand22["download"] = 16] = "download";
1004
+ ServerCommand22[ServerCommand22["playerinfo"] = 17] = "playerinfo";
1005
+ ServerCommand22[ServerCommand22["packetentities"] = 18] = "packetentities";
1006
+ ServerCommand22[ServerCommand22["deltapacketentities"] = 19] = "deltapacketentities";
1007
+ ServerCommand22[ServerCommand22["frame"] = 20] = "frame";
1008
+ ServerCommand22[ServerCommand22["splitclient"] = 21] = "splitclient";
1009
+ ServerCommand22[ServerCommand22["configblast"] = 22] = "configblast";
1010
+ ServerCommand22[ServerCommand22["spawnbaselineblast"] = 23] = "spawnbaselineblast";
1011
+ ServerCommand22[ServerCommand22["level_restart"] = 24] = "level_restart";
1012
+ ServerCommand22[ServerCommand22["damage"] = 25] = "damage";
1013
+ ServerCommand22[ServerCommand22["locprint"] = 26] = "locprint";
1014
+ ServerCommand22[ServerCommand22["fog"] = 27] = "fog";
1015
+ ServerCommand22[ServerCommand22["waitingforplayers"] = 28] = "waitingforplayers";
1016
+ ServerCommand22[ServerCommand22["bot_chat"] = 29] = "bot_chat";
1017
+ ServerCommand22[ServerCommand22["poi"] = 30] = "poi";
1018
+ ServerCommand22[ServerCommand22["help_path"] = 31] = "help_path";
1019
+ ServerCommand22[ServerCommand22["muzzleflash3"] = 32] = "muzzleflash3";
1020
+ ServerCommand22[ServerCommand22["achievement"] = 33] = "achievement";
1021
+ return ServerCommand22;
1022
+ })(ServerCommand || {});
1023
+ var TempEntity = /* @__PURE__ */ ((TempEntity2) => {
1024
+ TempEntity2[TempEntity2["GUNSHOT"] = 0] = "GUNSHOT";
1025
+ TempEntity2[TempEntity2["BLOOD"] = 1] = "BLOOD";
1026
+ TempEntity2[TempEntity2["BLASTER"] = 2] = "BLASTER";
1027
+ TempEntity2[TempEntity2["RAILTRAIL"] = 3] = "RAILTRAIL";
1028
+ TempEntity2[TempEntity2["SHOTGUN"] = 4] = "SHOTGUN";
1029
+ TempEntity2[TempEntity2["EXPLOSION1"] = 5] = "EXPLOSION1";
1030
+ TempEntity2[TempEntity2["EXPLOSION2"] = 6] = "EXPLOSION2";
1031
+ TempEntity2[TempEntity2["ROCKET_EXPLOSION"] = 7] = "ROCKET_EXPLOSION";
1032
+ TempEntity2[TempEntity2["GRENADE_EXPLOSION"] = 8] = "GRENADE_EXPLOSION";
1033
+ TempEntity2[TempEntity2["SPARKS"] = 9] = "SPARKS";
1034
+ TempEntity2[TempEntity2["SPLASH"] = 10] = "SPLASH";
1035
+ TempEntity2[TempEntity2["BUBBLETRAIL"] = 11] = "BUBBLETRAIL";
1036
+ TempEntity2[TempEntity2["SCREEN_SPARKS"] = 12] = "SCREEN_SPARKS";
1037
+ TempEntity2[TempEntity2["SHIELD_SPARKS"] = 13] = "SHIELD_SPARKS";
1038
+ TempEntity2[TempEntity2["BULLET_SPARKS"] = 14] = "BULLET_SPARKS";
1039
+ TempEntity2[TempEntity2["LASER_SPARKS"] = 15] = "LASER_SPARKS";
1040
+ TempEntity2[TempEntity2["PARASITE_ATTACK"] = 16] = "PARASITE_ATTACK";
1041
+ TempEntity2[TempEntity2["ROCKET_EXPLOSION_WATER"] = 17] = "ROCKET_EXPLOSION_WATER";
1042
+ TempEntity2[TempEntity2["GRENADE_EXPLOSION_WATER"] = 18] = "GRENADE_EXPLOSION_WATER";
1043
+ TempEntity2[TempEntity2["MEDIC_CABLE_ATTACK"] = 19] = "MEDIC_CABLE_ATTACK";
1044
+ TempEntity2[TempEntity2["BFG_EXPLOSION"] = 20] = "BFG_EXPLOSION";
1045
+ TempEntity2[TempEntity2["BFG_BIGEXPLOSION"] = 21] = "BFG_BIGEXPLOSION";
1046
+ TempEntity2[TempEntity2["BOSSTPORT"] = 22] = "BOSSTPORT";
1047
+ TempEntity2[TempEntity2["BFG_LASER"] = 23] = "BFG_LASER";
1048
+ TempEntity2[TempEntity2["GRAPPLE_CABLE"] = 24] = "GRAPPLE_CABLE";
1049
+ TempEntity2[TempEntity2["WELDING_SPARKS"] = 25] = "WELDING_SPARKS";
1050
+ TempEntity2[TempEntity2["GREENBLOOD"] = 26] = "GREENBLOOD";
1051
+ TempEntity2[TempEntity2["BLUEHYPERBLASTER"] = 27] = "BLUEHYPERBLASTER";
1052
+ TempEntity2[TempEntity2["PLASMA_EXPLOSION"] = 28] = "PLASMA_EXPLOSION";
1053
+ TempEntity2[TempEntity2["TUNNEL_SPARKS"] = 29] = "TUNNEL_SPARKS";
1054
+ TempEntity2[TempEntity2["BLASTER2"] = 30] = "BLASTER2";
1055
+ TempEntity2[TempEntity2["RAILTRAIL2"] = 31] = "RAILTRAIL2";
1056
+ TempEntity2[TempEntity2["FLAME"] = 32] = "FLAME";
1057
+ TempEntity2[TempEntity2["LIGHTNING"] = 33] = "LIGHTNING";
1058
+ TempEntity2[TempEntity2["DEBUGTRAIL"] = 34] = "DEBUGTRAIL";
1059
+ TempEntity2[TempEntity2["PLAIN_EXPLOSION"] = 35] = "PLAIN_EXPLOSION";
1060
+ TempEntity2[TempEntity2["FLASHLIGHT"] = 36] = "FLASHLIGHT";
1061
+ TempEntity2[TempEntity2["FORCEWALL"] = 37] = "FORCEWALL";
1062
+ TempEntity2[TempEntity2["HEATBEAM"] = 38] = "HEATBEAM";
1063
+ TempEntity2[TempEntity2["MONSTER_HEATBEAM"] = 39] = "MONSTER_HEATBEAM";
1064
+ TempEntity2[TempEntity2["STEAM"] = 40] = "STEAM";
1065
+ TempEntity2[TempEntity2["BUBBLETRAIL2"] = 41] = "BUBBLETRAIL2";
1066
+ TempEntity2[TempEntity2["MOREBLOOD"] = 42] = "MOREBLOOD";
1067
+ TempEntity2[TempEntity2["HEATBEAM_SPARKS"] = 43] = "HEATBEAM_SPARKS";
1068
+ TempEntity2[TempEntity2["HEATBEAM_STEAM"] = 44] = "HEATBEAM_STEAM";
1069
+ TempEntity2[TempEntity2["CHAINFIST_SMOKE"] = 45] = "CHAINFIST_SMOKE";
1070
+ TempEntity2[TempEntity2["ELECTRIC_SPARKS"] = 46] = "ELECTRIC_SPARKS";
1071
+ TempEntity2[TempEntity2["TRACKER_EXPLOSION"] = 47] = "TRACKER_EXPLOSION";
1072
+ TempEntity2[TempEntity2["TELEPORT_EFFECT"] = 48] = "TELEPORT_EFFECT";
1073
+ TempEntity2[TempEntity2["DBALL_GOAL"] = 49] = "DBALL_GOAL";
1074
+ TempEntity2[TempEntity2["WIDOWBEAMOUT"] = 50] = "WIDOWBEAMOUT";
1075
+ TempEntity2[TempEntity2["NUKEBLAST"] = 51] = "NUKEBLAST";
1076
+ TempEntity2[TempEntity2["WIDOWSPLASH"] = 52] = "WIDOWSPLASH";
1077
+ TempEntity2[TempEntity2["EXPLOSION1_BIG"] = 53] = "EXPLOSION1_BIG";
1078
+ TempEntity2[TempEntity2["EXPLOSION1_NP"] = 54] = "EXPLOSION1_NP";
1079
+ TempEntity2[TempEntity2["FLECHETTE"] = 55] = "FLECHETTE";
1080
+ TempEntity2[TempEntity2["BLUEHYPERBLASTER_KEX"] = 56] = "BLUEHYPERBLASTER_KEX";
1081
+ TempEntity2[TempEntity2["BFG_ZAP"] = 57] = "BFG_ZAP";
1082
+ TempEntity2[TempEntity2["BERSERK_SLAM"] = 58] = "BERSERK_SLAM";
1083
+ TempEntity2[TempEntity2["GRAPPLE_CABLE_2"] = 59] = "GRAPPLE_CABLE_2";
1084
+ TempEntity2[TempEntity2["POWER_SPLASH"] = 60] = "POWER_SPLASH";
1085
+ TempEntity2[TempEntity2["LIGHTNING_BEAM"] = 61] = "LIGHTNING_BEAM";
1086
+ TempEntity2[TempEntity2["EXPLOSION1_NL"] = 62] = "EXPLOSION1_NL";
1087
+ TempEntity2[TempEntity2["EXPLOSION2_NL"] = 63] = "EXPLOSION2_NL";
1088
+ return TempEntity2;
1089
+ })(TempEntity || {});
1090
+ var MZ_BLASTER = 0;
1091
+ var MZ_MACHINEGUN = 1;
1092
+ var MZ_SHOTGUN = 2;
1093
+ var MZ_CHAINGUN1 = 3;
1094
+ var MZ_RAILGUN = 6;
1095
+ var MZ_ROCKET = 7;
1096
+ var MZ_GRENADE = 8;
1097
+ var MZ_SSHOTGUN = 11;
1098
+ var MZ_BFG = 12;
1099
+ var MZ_HYPERBLASTER = 13;
384
1100
  function toSigned16(val) {
385
1101
  return val << 16 >> 16;
386
1102
  }
@@ -426,6 +1142,191 @@ function setCompressedInteger(stats, startIndex, id, count, bitsPerValue) {
426
1142
  const valueToWrite = base & ~mask | count << bitShift & mask;
427
1143
  writeUint16LE(stats, startIndex, byteOffset, valueToWrite & 65535);
428
1144
  }
1145
+ var PowerupId = /* @__PURE__ */ ((PowerupId22) => {
1146
+ PowerupId22["QuadDamage"] = "quad";
1147
+ PowerupId22["Invulnerability"] = "invulnerability";
1148
+ PowerupId22["EnviroSuit"] = "enviro_suit";
1149
+ PowerupId22["Rebreather"] = "rebreather";
1150
+ PowerupId22["Silencer"] = "silencer";
1151
+ PowerupId22["PowerScreen"] = "power_screen";
1152
+ PowerupId22["PowerShield"] = "power_shield";
1153
+ PowerupId22["QuadFire"] = "quad_fire";
1154
+ PowerupId22["Invisibility"] = "invisibility";
1155
+ PowerupId22["Bandolier"] = "bandolier";
1156
+ PowerupId22["AmmoPack"] = "ammo_pack";
1157
+ PowerupId22["IRGoggles"] = "ir_goggles";
1158
+ PowerupId22["DoubleDamage"] = "double_damage";
1159
+ PowerupId22["SphereVengeance"] = "sphere_vengeance";
1160
+ PowerupId22["SphereHunter"] = "sphere_hunter";
1161
+ PowerupId22["SphereDefender"] = "sphere_defender";
1162
+ PowerupId22["Doppelganger"] = "doppelganger";
1163
+ PowerupId22["TagToken"] = "tag_token";
1164
+ PowerupId22["TechResistance"] = "tech_resistance";
1165
+ PowerupId22["TechStrength"] = "tech_strength";
1166
+ PowerupId22["TechHaste"] = "tech_haste";
1167
+ PowerupId22["TechRegeneration"] = "tech_regeneration";
1168
+ PowerupId22["Flashlight"] = "flashlight";
1169
+ PowerupId22["Compass"] = "compass";
1170
+ return PowerupId22;
1171
+ })(PowerupId || {});
1172
+ var PlayerStat = /* @__PURE__ */ ((PlayerStat2) => {
1173
+ PlayerStat2[PlayerStat2["STAT_HEALTH_ICON"] = 0] = "STAT_HEALTH_ICON";
1174
+ PlayerStat2[PlayerStat2["STAT_HEALTH"] = 1] = "STAT_HEALTH";
1175
+ PlayerStat2[PlayerStat2["STAT_AMMO_ICON"] = 2] = "STAT_AMMO_ICON";
1176
+ PlayerStat2[PlayerStat2["STAT_AMMO"] = 3] = "STAT_AMMO";
1177
+ PlayerStat2[PlayerStat2["STAT_ARMOR_ICON"] = 4] = "STAT_ARMOR_ICON";
1178
+ PlayerStat2[PlayerStat2["STAT_ARMOR"] = 5] = "STAT_ARMOR";
1179
+ PlayerStat2[PlayerStat2["STAT_SELECTED_ICON"] = 6] = "STAT_SELECTED_ICON";
1180
+ PlayerStat2[PlayerStat2["STAT_PICKUP_ICON"] = 7] = "STAT_PICKUP_ICON";
1181
+ PlayerStat2[PlayerStat2["STAT_PICKUP_STRING"] = 8] = "STAT_PICKUP_STRING";
1182
+ PlayerStat2[PlayerStat2["STAT_TIMER_ICON"] = 9] = "STAT_TIMER_ICON";
1183
+ PlayerStat2[PlayerStat2["STAT_TIMER"] = 10] = "STAT_TIMER";
1184
+ PlayerStat2[PlayerStat2["STAT_HELPICON"] = 11] = "STAT_HELPICON";
1185
+ PlayerStat2[PlayerStat2["STAT_SELECTED_ITEM"] = 12] = "STAT_SELECTED_ITEM";
1186
+ PlayerStat2[PlayerStat2["STAT_LAYOUTS"] = 13] = "STAT_LAYOUTS";
1187
+ PlayerStat2[PlayerStat2["STAT_FRAGS"] = 14] = "STAT_FRAGS";
1188
+ PlayerStat2[PlayerStat2["STAT_FLASHES"] = 15] = "STAT_FLASHES";
1189
+ PlayerStat2[PlayerStat2["STAT_CHASE"] = 16] = "STAT_CHASE";
1190
+ PlayerStat2[PlayerStat2["STAT_SPECTATOR"] = 17] = "STAT_SPECTATOR";
1191
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_PIC"] = 18] = "STAT_CTF_TEAM1_PIC";
1192
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_CAPS"] = 19] = "STAT_CTF_TEAM1_CAPS";
1193
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_PIC"] = 20] = "STAT_CTF_TEAM2_PIC";
1194
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_CAPS"] = 21] = "STAT_CTF_TEAM2_CAPS";
1195
+ PlayerStat2[PlayerStat2["STAT_CTF_FLAG_PIC"] = 22] = "STAT_CTF_FLAG_PIC";
1196
+ PlayerStat2[PlayerStat2["STAT_CTF_JOINED_TEAM1_PIC"] = 23] = "STAT_CTF_JOINED_TEAM1_PIC";
1197
+ PlayerStat2[PlayerStat2["STAT_CTF_JOINED_TEAM2_PIC"] = 24] = "STAT_CTF_JOINED_TEAM2_PIC";
1198
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_HEADER"] = 25] = "STAT_CTF_TEAM1_HEADER";
1199
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_HEADER"] = 26] = "STAT_CTF_TEAM2_HEADER";
1200
+ PlayerStat2[PlayerStat2["STAT_CTF_TECH"] = 27] = "STAT_CTF_TECH";
1201
+ PlayerStat2[PlayerStat2["STAT_CTF_ID_VIEW"] = 28] = "STAT_CTF_ID_VIEW";
1202
+ PlayerStat2[PlayerStat2["STAT_CTF_MATCH"] = 29] = "STAT_CTF_MATCH";
1203
+ PlayerStat2[PlayerStat2["STAT_CTF_ID_VIEW_COLOR"] = 30] = "STAT_CTF_ID_VIEW_COLOR";
1204
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAMINFO"] = 31] = "STAT_CTF_TEAMINFO";
1205
+ PlayerStat2[PlayerStat2["STAT_WEAPONS_OWNED_1"] = 32] = "STAT_WEAPONS_OWNED_1";
1206
+ PlayerStat2[PlayerStat2["STAT_WEAPONS_OWNED_2"] = 33] = "STAT_WEAPONS_OWNED_2";
1207
+ PlayerStat2[PlayerStat2["STAT_AMMO_INFO_START"] = 34] = "STAT_AMMO_INFO_START";
1208
+ PlayerStat2[PlayerStat2["STAT_POWERUP_INFO_START"] = 41] = "STAT_POWERUP_INFO_START";
1209
+ PlayerStat2[PlayerStat2["STAT_KEY_A"] = 44] = "STAT_KEY_A";
1210
+ PlayerStat2[PlayerStat2["STAT_KEY_B"] = 45] = "STAT_KEY_B";
1211
+ PlayerStat2[PlayerStat2["STAT_KEY_C"] = 46] = "STAT_KEY_C";
1212
+ PlayerStat2[PlayerStat2["STAT_ACTIVE_WHEEL_WEAPON"] = 47] = "STAT_ACTIVE_WHEEL_WEAPON";
1213
+ PlayerStat2[PlayerStat2["STAT_COOP_RESPAWN"] = 48] = "STAT_COOP_RESPAWN";
1214
+ PlayerStat2[PlayerStat2["STAT_LIVES"] = 49] = "STAT_LIVES";
1215
+ PlayerStat2[PlayerStat2["STAT_HIT_MARKER"] = 50] = "STAT_HIT_MARKER";
1216
+ PlayerStat2[PlayerStat2["STAT_SELECTED_ITEM_NAME"] = 51] = "STAT_SELECTED_ITEM_NAME";
1217
+ PlayerStat2[PlayerStat2["STAT_HEALTH_BARS"] = 52] = "STAT_HEALTH_BARS";
1218
+ PlayerStat2[PlayerStat2["STAT_ACTIVE_WEAPON"] = 53] = "STAT_ACTIVE_WEAPON";
1219
+ PlayerStat2[PlayerStat2["STAT_LAST"] = 54] = "STAT_LAST";
1220
+ return PlayerStat2;
1221
+ })(PlayerStat || {});
1222
+ var AMMO_MAX = 12;
1223
+ var NUM_BITS_FOR_AMMO = 9;
1224
+ var NUM_AMMO_STATS = Math.ceil(AMMO_MAX * NUM_BITS_FOR_AMMO / 16);
1225
+ var POWERUP_MAX = 23;
1226
+ var NUM_BITS_FOR_POWERUP = 2;
1227
+ var NUM_POWERUP_STATS = Math.ceil(POWERUP_MAX * NUM_BITS_FOR_POWERUP / 16);
1228
+ var POWERUP_STAT_MAP = {
1229
+ [
1230
+ "power_screen"
1231
+ /* PowerScreen */
1232
+ ]: 0,
1233
+ [
1234
+ "power_shield"
1235
+ /* PowerShield */
1236
+ ]: 1,
1237
+ // 2 is POWERUP_AM_BOMB (not in PowerupId?)
1238
+ [
1239
+ "quad"
1240
+ /* QuadDamage */
1241
+ ]: 3,
1242
+ [
1243
+ "quad_fire"
1244
+ /* QuadFire */
1245
+ ]: 4,
1246
+ [
1247
+ "invulnerability"
1248
+ /* Invulnerability */
1249
+ ]: 5,
1250
+ [
1251
+ "invisibility"
1252
+ /* Invisibility */
1253
+ ]: 6,
1254
+ [
1255
+ "silencer"
1256
+ /* Silencer */
1257
+ ]: 7,
1258
+ [
1259
+ "rebreather"
1260
+ /* Rebreather */
1261
+ ]: 8,
1262
+ [
1263
+ "enviro_suit"
1264
+ /* EnviroSuit */
1265
+ ]: 9,
1266
+ [
1267
+ "bandolier"
1268
+ /* Bandolier */
1269
+ ]: 10,
1270
+ // Placeholder/Map mismatch handling?
1271
+ [
1272
+ "ammo_pack"
1273
+ /* AmmoPack */
1274
+ ]: 10,
1275
+ // Original reused indices or had gaps?
1276
+ [
1277
+ "ir_goggles"
1278
+ /* IRGoggles */
1279
+ ]: 11,
1280
+ [
1281
+ "double_damage"
1282
+ /* DoubleDamage */
1283
+ ]: 12,
1284
+ [
1285
+ "sphere_vengeance"
1286
+ /* SphereVengeance */
1287
+ ]: 13,
1288
+ [
1289
+ "sphere_hunter"
1290
+ /* SphereHunter */
1291
+ ]: 14,
1292
+ [
1293
+ "sphere_defender"
1294
+ /* SphereDefender */
1295
+ ]: 15,
1296
+ [
1297
+ "doppelganger"
1298
+ /* Doppelganger */
1299
+ ]: 16,
1300
+ [
1301
+ "flashlight"
1302
+ /* Flashlight */
1303
+ ]: 17,
1304
+ [
1305
+ "compass"
1306
+ /* Compass */
1307
+ ]: 18,
1308
+ [
1309
+ "tech_resistance"
1310
+ /* TechResistance */
1311
+ ]: 19,
1312
+ [
1313
+ "tech_strength"
1314
+ /* TechStrength */
1315
+ ]: 20,
1316
+ [
1317
+ "tech_haste"
1318
+ /* TechHaste */
1319
+ ]: 21,
1320
+ [
1321
+ "tech_regeneration"
1322
+ /* TechRegeneration */
1323
+ ]: 22,
1324
+ // Add missing mappings to avoid runtime lookups failing for new types
1325
+ [
1326
+ "tag_token"
1327
+ /* TagToken */
1328
+ ]: -1
1329
+ };
429
1330
  function G_SetAmmoStat(stats, ammoId, count) {
430
1331
  if (ammoId < 0 || ammoId >= AMMO_MAX) return;
431
1332
  let val = count;
@@ -446,1382 +1347,666 @@ function G_SetPowerupStat(stats, powerupId, val) {
446
1347
  if (safeVal < 0) safeVal = 0;
447
1348
  setCompressedInteger(stats, 41, index, safeVal, NUM_BITS_FOR_POWERUP);
448
1349
  }
449
- var __defProp2, __export2, ZERO_VEC3, STOP_EPSILON, DEG_TO_RAD, PITCH, YAW, ROLL, DEG2RAD_FACTOR, RAD2DEG_FACTOR, ANORMS, STATE_SIZE, MIDDLE_WORD, MATRIX_A, UPPER_MASK, LOWER_MASK, TWO_POW_32, MersenneTwister19937, RandomGenerator, CONTENTS_SOLID, CONTENTS_WINDOW, CONTENTS_AUX, CONTENTS_LAVA, CONTENTS_SLIME, CONTENTS_WATER, CONTENTS_MIST, CONTENTS_NO_WATERJUMP, CONTENTS_PROJECTILECLIP, CONTENTS_AREAPORTAL, CONTENTS_PLAYERCLIP, CONTENTS_MONSTERCLIP, CONTENTS_CURRENT_0, CONTENTS_CURRENT_90, CONTENTS_CURRENT_180, CONTENTS_CURRENT_270, CONTENTS_CURRENT_UP, CONTENTS_CURRENT_DOWN, CONTENTS_ORIGIN, CONTENTS_MONSTER, CONTENTS_DEADMONSTER, CONTENTS_DETAIL, CONTENTS_TRANSLUCENT, CONTENTS_LADDER, CONTENTS_PLAYER, CONTENTS_PROJECTILE, SURF_LIGHT, SURF_SLICK, SURF_SKY, SURF_WARP, SURF_TRANS33, SURF_TRANS66, SURF_FLOWING, SURF_NODRAW, SURF_ALPHATEST, SURF_N64_UV, SURF_N64_SCROLL_X, SURF_N64_SCROLL_Y, SURF_N64_SCROLL_FLIP, MASK_SOLID, MASK_PLAYERSOLID, MASK_DEADSOLID, MASK_MONSTERSOLID, MASK_WATER, MASK_OPAQUE, MASK_SHOT, MASK_CURRENT, MASK_BLOCK_SIGHT, MASK_NAV_SOLID, MASK_LADDER_NAV_SOLID, MASK_WALK_NAV_SOLID, MASK_PROJECTILE, MAX_CHECKCOUNT, CvarFlags, MAX_CLIENTS, MAX_LIGHTSTYLES, MAX_MODELS, MAX_SOUNDS, MAX_IMAGES, MAX_ITEMS, MAX_GENERAL, MAX_SHADOW_LIGHTS, MAX_WHEEL_ITEMS, ConfigStringIndex, MAX_CONFIGSTRINGS, replay_exports, WaterLevel, WATERJUMP_CLEAR, ServerCommand, TempEntity, MZ_BLASTER, MZ_MACHINEGUN, MZ_SHOTGUN, MZ_CHAINGUN1, MZ_RAILGUN, MZ_ROCKET, MZ_GRENADE, MZ_SSHOTGUN, MZ_BFG, MZ_HYPERBLASTER, PowerupId, PlayerStat, AMMO_MAX, NUM_BITS_FOR_AMMO, NUM_AMMO_STATS, POWERUP_MAX, NUM_BITS_FOR_POWERUP, NUM_POWERUP_STATS, POWERUP_STAT_MAP, RenderFx, entityFlags_exports, U_NUMBER, U_MODEL, U_SOUND, U_ORIGIN1, U_ORIGIN2, U_ORIGIN3, U_ANGLE1, U_ANGLE2, U_ANGLE3, U_FRAME, U_SKIN, U_EFFECTS, U_RENDERFX, U_SOLID, U_EVENT, U_MOREBITS, U_MODEL2, U_MODEL3, U_MODEL4, U_REMOVE, FRAMETIME2, MASK_WATER2, WaterLevel3, categorizePosition2, checkWater, applyPmove, BinaryWriter, _NetChan, WeaponId, AmmoType, AMMO_TYPE_COUNT, AmmoItemId, WEAPON_WHEEL_ORDER, SoundChannel, ATTN_NORM, ATTN_IDLE;
450
- var init_esm = __esm({
451
- "../shared/dist/esm/index.js"() {
452
- "use strict";
453
- __defProp2 = Object.defineProperty;
454
- __export2 = (target, all) => {
455
- for (var name in all)
456
- __defProp2(target, name, { get: all[name], enumerable: true });
457
- };
458
- ZERO_VEC3 = { x: 0, y: 0, z: 0 };
459
- STOP_EPSILON = 0.1;
460
- DEG_TO_RAD = Math.PI / 180;
461
- PITCH = 0;
462
- YAW = 1;
463
- ROLL = 2;
464
- DEG2RAD_FACTOR = Math.PI / 180;
465
- RAD2DEG_FACTOR = 180 / Math.PI;
466
- ANORMS = [
467
- [-0.525731, 0, 0.850651],
468
- [-0.442863, 0.238856, 0.864188],
469
- [-0.295242, 0, 0.955423],
470
- [-0.309017, 0.5, 0.809017],
471
- [-0.16246, 0.262866, 0.951056],
472
- [0, 0, 1],
473
- [0, 0.850651, 0.525731],
474
- [-0.147621, 0.716567, 0.681718],
475
- [0.147621, 0.716567, 0.681718],
476
- [0, 0.525731, 0.850651],
477
- [0.309017, 0.5, 0.809017],
478
- [0.525731, 0, 0.850651],
479
- [0.295242, 0, 0.955423],
480
- [0.442863, 0.238856, 0.864188],
481
- [0.16246, 0.262866, 0.951056],
482
- [-0.681718, 0.147621, 0.716567],
483
- [-0.809017, 0.309017, 0.5],
484
- [-0.587785, 0.425325, 0.688191],
485
- [-0.850651, 0.525731, 0],
486
- [-0.864188, 0.442863, 0.238856],
487
- [-0.716567, 0.681718, 0.147621],
488
- [-0.688191, 0.587785, 0.425325],
489
- [-0.5, 0.809017, 0.309017],
490
- [-0.238856, 0.864188, 0.442863],
491
- [-0.425325, 0.688191, 0.587785],
492
- [-0.716567, 0.681718, -0.147621],
493
- [-0.5, 0.809017, -0.309017],
494
- [-0.525731, 0.850651, 0],
495
- [0, 0.850651, -0.525731],
496
- [-0.238856, 0.864188, -0.442863],
497
- [0, 0.955423, -0.295242],
498
- [-0.262866, 0.951056, -0.16246],
499
- [0, 1, 0],
500
- [0, 0.955423, 0.295242],
501
- [-0.262866, 0.951056, 0.16246],
502
- [0.238856, 0.864188, 0.442863],
503
- [0.262866, 0.951056, 0.16246],
504
- [0.5, 0.809017, 0.309017],
505
- [0.238856, 0.864188, -0.442863],
506
- [0.262866, 0.951056, -0.16246],
507
- [0.5, 0.809017, -0.309017],
508
- [0.850651, 0.525731, 0],
509
- [0.716567, 0.681718, 0.147621],
510
- [0.716567, 0.681718, -0.147621],
511
- [0.525731, 0.850651, 0],
512
- [0.425325, 0.688191, 0.587785],
513
- [0.864188, 0.442863, 0.238856],
514
- [0.688191, 0.587785, 0.425325],
515
- [0.809017, 0.309017, 0.5],
516
- [0.681718, 0.147621, 0.716567],
517
- [0.587785, 0.425325, 0.688191],
518
- [0.955423, 0.295242, 0],
519
- [1, 0, 0],
520
- [0.951056, 0.16246, 0.262866],
521
- [0.850651, -0.525731, 0],
522
- [0.955423, -0.295242, 0],
523
- [0.864188, -0.442863, 0.238856],
524
- [0.951056, -0.16246, 0.262866],
525
- [0.809017, -0.309017, 0.5],
526
- [0.681718, -0.147621, 0.716567],
527
- [0.850651, 0, 0.525731],
528
- [0.864188, 0.442863, -0.238856],
529
- [0.809017, 0.309017, -0.5],
530
- [0.951056, 0.16246, -0.262866],
531
- [0.525731, 0, -0.850651],
532
- [0.681718, 0.147621, -0.716567],
533
- [0.681718, -0.147621, -0.716567],
534
- [0.850651, 0, -0.525731],
535
- [0.809017, -0.309017, -0.5],
536
- [0.864188, -0.442863, -0.238856],
537
- [0.951056, -0.16246, -0.262866],
538
- [0.147621, 0.716567, -0.681718],
539
- [0.309017, 0.5, -0.809017],
540
- [0.425325, 0.688191, -0.587785],
541
- [0.442863, 0.238856, -0.864188],
542
- [0.587785, 0.425325, -0.688191],
543
- [0.688191, 0.587785, -0.425325],
544
- [-0.147621, 0.716567, -0.681718],
545
- [-0.309017, 0.5, -0.809017],
546
- [0, 0.525731, -0.850651],
547
- [-0.525731, 0, -0.850651],
548
- [-0.442863, 0.238856, -0.864188],
549
- [-0.295242, 0, -0.955423],
550
- [-0.16246, 0.262866, -0.951056],
551
- [0, 0, -1],
552
- [0.295242, 0, -0.955423],
553
- [0.16246, 0.262866, -0.951056],
554
- [-0.442863, -0.238856, -0.864188],
555
- [-0.309017, -0.5, -0.809017],
556
- [-0.16246, -0.262866, -0.951056],
557
- [0, -0.850651, -0.525731],
558
- [-0.147621, -0.716567, -0.681718],
559
- [0.147621, -0.716567, -0.681718],
560
- [0, -0.525731, -0.850651],
561
- [0.309017, -0.5, -0.809017],
562
- [0.442863, -0.238856, -0.864188],
563
- [0.16246, -0.262866, -0.951056],
564
- [0.238856, -0.864188, -0.442863],
565
- [0.5, -0.809017, -0.309017],
566
- [0.425325, -0.688191, -0.587785],
567
- [0.716567, -0.681718, -0.147621],
568
- [0.688191, -0.587785, -0.425325],
569
- [0.587785, -0.425325, -0.688191],
570
- [0, -0.955423, -0.295242],
571
- [0, -1, 0],
572
- [0.262866, -0.951056, -0.16246],
573
- [0, -0.850651, 0.525731],
574
- [0, -0.955423, 0.295242],
575
- [0.238856, -0.864188, 0.442863],
576
- [0.262866, -0.951056, 0.16246],
577
- [0.5, -0.809017, 0.309017],
578
- [0.716567, -0.681718, 0.147621],
579
- [0.525731, -0.850651, 0],
580
- [-0.238856, -0.864188, -0.442863],
581
- [-0.5, -0.809017, -0.309017],
582
- [-0.262866, -0.951056, -0.16246],
583
- [-0.850651, -0.525731, 0],
584
- [-0.716567, -0.681718, -0.147621],
585
- [-0.716567, -0.681718, 0.147621],
586
- [-0.525731, -0.850651, 0],
587
- [-0.5, -0.809017, 0.309017],
588
- [-0.238856, -0.864188, 0.442863],
589
- [-0.262866, -0.951056, 0.16246],
590
- [-0.864188, -0.442863, 0.238856],
591
- [-0.809017, -0.309017, 0.5],
592
- [-0.688191, -0.587785, 0.425325],
593
- [-0.681718, -0.147621, 0.716567],
594
- [-0.442863, -0.238856, 0.864188],
595
- [-0.587785, -0.425325, 0.688191],
596
- [-0.309017, -0.5, 0.809017],
597
- [-0.147621, -0.716567, 0.681718],
598
- [-0.425325, -0.688191, 0.587785],
599
- [-0.16246, -0.262866, 0.951056],
600
- [0.442863, -0.238856, 0.864188],
601
- [0.16246, -0.262866, 0.951056],
602
- [0.309017, -0.5, 0.809017],
603
- [0.147621, -0.716567, 0.681718],
604
- [0, -0.525731, 0.850651],
605
- [0.425325, -0.688191, 0.587785],
606
- [0.587785, -0.425325, 0.688191],
607
- [0.688191, -0.587785, 0.425325],
608
- [-0.955423, 0.295242, 0],
609
- [-0.951056, 0.16246, 0.262866],
610
- [-1, 0, 0],
611
- [-0.850651, 0, 0.525731],
612
- [-0.955423, -0.295242, 0],
613
- [-0.951056, -0.16246, 0.262866],
614
- [-0.864188, 0.442863, -0.238856],
615
- [-0.951056, 0.16246, -0.262866],
616
- [-0.809017, 0.309017, -0.5],
617
- [-0.864188, -0.442863, -0.238856],
618
- [-0.951056, -0.16246, -0.262866],
619
- [-0.809017, -0.309017, -0.5],
620
- [-0.681718, 0.147621, -0.716567],
621
- [-0.681718, -0.147621, -0.716567],
622
- [-0.850651, 0, -0.525731],
623
- [-0.688191, 0.587785, -0.425325],
624
- [-0.587785, 0.425325, -0.688191],
625
- [-0.425325, 0.688191, -0.587785],
626
- [-0.425325, -0.688191, -0.587785],
627
- [-0.587785, -0.425325, -0.688191],
628
- [-0.688191, -0.587785, -0.425325]
629
- ];
630
- STATE_SIZE = 624;
631
- MIDDLE_WORD = 397;
632
- MATRIX_A = 2567483615;
633
- UPPER_MASK = 2147483648;
634
- LOWER_MASK = 2147483647;
635
- TWO_POW_32 = 4294967296;
636
- MersenneTwister19937 = class {
637
- constructor(seed = 5489) {
638
- this.state = new Uint32Array(STATE_SIZE);
639
- this.index = STATE_SIZE;
640
- this.seed(seed);
1350
+ var RenderFx = /* @__PURE__ */ ((RenderFx2) => {
1351
+ RenderFx2[RenderFx2["MinLight"] = 1] = "MinLight";
1352
+ RenderFx2[RenderFx2["ViewerModel"] = 2] = "ViewerModel";
1353
+ RenderFx2[RenderFx2["WeaponModel"] = 4] = "WeaponModel";
1354
+ RenderFx2[RenderFx2["FullBright"] = 8] = "FullBright";
1355
+ RenderFx2[RenderFx2["DepthHack"] = 16] = "DepthHack";
1356
+ RenderFx2[RenderFx2["Translucent"] = 32] = "Translucent";
1357
+ RenderFx2[RenderFx2["FrameLerp"] = 64] = "FrameLerp";
1358
+ RenderFx2[RenderFx2["Beam"] = 128] = "Beam";
1359
+ RenderFx2[RenderFx2["CustomLight"] = 256] = "CustomLight";
1360
+ RenderFx2[RenderFx2["Glow"] = 512] = "Glow";
1361
+ RenderFx2[RenderFx2["ShellRed"] = 1024] = "ShellRed";
1362
+ RenderFx2[RenderFx2["ShellGreen"] = 2048] = "ShellGreen";
1363
+ RenderFx2[RenderFx2["ShellBlue"] = 4096] = "ShellBlue";
1364
+ RenderFx2[RenderFx2["IrVisible"] = 32768] = "IrVisible";
1365
+ RenderFx2[RenderFx2["ShellDouble"] = 65536] = "ShellDouble";
1366
+ RenderFx2[RenderFx2["ShellHalfDam"] = 131072] = "ShellHalfDam";
1367
+ RenderFx2[RenderFx2["MinLightPlus"] = 262144] = "MinLightPlus";
1368
+ RenderFx2[RenderFx2["ExtraLight"] = 524288] = "ExtraLight";
1369
+ RenderFx2[RenderFx2["BeamLightning"] = 1048576] = "BeamLightning";
1370
+ RenderFx2[RenderFx2["Flashlight"] = 2097152] = "Flashlight";
1371
+ return RenderFx2;
1372
+ })(RenderFx || {});
1373
+ var entityFlags_exports = {};
1374
+ __export2(entityFlags_exports, {
1375
+ U_ANGLE1: () => U_ANGLE1,
1376
+ U_ANGLE2: () => U_ANGLE2,
1377
+ U_ANGLE3: () => U_ANGLE3,
1378
+ U_EFFECTS: () => U_EFFECTS,
1379
+ U_EVENT: () => U_EVENT,
1380
+ U_FRAME: () => U_FRAME,
1381
+ U_MODEL: () => U_MODEL,
1382
+ U_MODEL2: () => U_MODEL2,
1383
+ U_MODEL3: () => U_MODEL3,
1384
+ U_MODEL4: () => U_MODEL4,
1385
+ U_MOREBITS: () => U_MOREBITS,
1386
+ U_NUMBER: () => U_NUMBER,
1387
+ U_ORIGIN1: () => U_ORIGIN1,
1388
+ U_ORIGIN2: () => U_ORIGIN2,
1389
+ U_ORIGIN3: () => U_ORIGIN3,
1390
+ U_REMOVE: () => U_REMOVE,
1391
+ U_RENDERFX: () => U_RENDERFX,
1392
+ U_SKIN: () => U_SKIN,
1393
+ U_SOLID: () => U_SOLID,
1394
+ U_SOUND: () => U_SOUND
1395
+ });
1396
+ var U_NUMBER = 1 << 0;
1397
+ var U_MODEL = 1 << 1;
1398
+ var U_SOUND = 1 << 2;
1399
+ var U_ORIGIN1 = 1 << 3;
1400
+ var U_ORIGIN2 = 1 << 4;
1401
+ var U_ORIGIN3 = 1 << 5;
1402
+ var U_ANGLE1 = 1 << 6;
1403
+ var U_ANGLE2 = 1 << 7;
1404
+ var U_ANGLE3 = 1 << 8;
1405
+ var U_FRAME = 1 << 9;
1406
+ var U_SKIN = 1 << 10;
1407
+ var U_EFFECTS = 1 << 11;
1408
+ var U_RENDERFX = 1 << 12;
1409
+ var U_SOLID = 1 << 13;
1410
+ var U_EVENT = 1 << 14;
1411
+ var U_MOREBITS = 1 << 15;
1412
+ var U_MODEL2 = 1 << 0;
1413
+ var U_MODEL3 = 1 << 1;
1414
+ var U_MODEL4 = 1 << 2;
1415
+ var U_REMOVE = 32768;
1416
+ var FRAMETIME2 = 0.025;
1417
+ var MASK_WATER2 = 33554432;
1418
+ var WaterLevel3 = {
1419
+ None: 0,
1420
+ Feet: 1,
1421
+ Waist: 2,
1422
+ Under: 3
1423
+ };
1424
+ var categorizePosition2 = (state, trace) => {
1425
+ const point = { ...state.origin };
1426
+ point.z -= 0.25;
1427
+ const traceResult = trace(state.origin, point);
1428
+ return {
1429
+ ...state,
1430
+ onGround: traceResult.fraction < 1
1431
+ };
1432
+ };
1433
+ var checkWater = (state, pointContents2) => {
1434
+ const point = { ...state.origin };
1435
+ const { mins, maxs } = state;
1436
+ point.z = state.origin.z + mins.z + 1;
1437
+ const contents = pointContents2(point);
1438
+ if (!(contents & MASK_WATER2)) {
1439
+ return { ...state, waterLevel: WaterLevel3.None };
1440
+ }
1441
+ let waterLevel = WaterLevel3.Feet;
1442
+ const waist = state.origin.z + (mins.z + maxs.z) * 0.5;
1443
+ point.z = waist;
1444
+ const waistContents = pointContents2(point);
1445
+ if (waistContents & MASK_WATER2) {
1446
+ waterLevel = WaterLevel3.Waist;
1447
+ const head = state.origin.z + 22;
1448
+ point.z = head;
1449
+ const headContents = pointContents2(point);
1450
+ if (headContents & MASK_WATER2) {
1451
+ waterLevel = WaterLevel3.Under;
1452
+ }
1453
+ }
1454
+ return { ...state, waterLevel };
1455
+ };
1456
+ var applyPmove = (state, cmd, trace, pointContents2) => {
1457
+ let newState = { ...state };
1458
+ newState = categorizePosition2(newState, trace);
1459
+ newState = checkWater(newState, pointContents2);
1460
+ const { origin, velocity, onGround, waterLevel, viewAngles } = newState;
1461
+ const adjustedAngles = waterLevel >= 2 ? viewAngles : {
1462
+ // For ground/air movement, reduce pitch influence (rerelease/p_move.cpp:1689)
1463
+ x: viewAngles.x > 180 ? (viewAngles.x - 360) / 3 : viewAngles.x / 3,
1464
+ y: viewAngles.y,
1465
+ z: viewAngles.z
1466
+ };
1467
+ const { forward, right } = angleVectors(adjustedAngles);
1468
+ const frictionedVelocity = applyPmoveFriction({
1469
+ velocity,
1470
+ frametime: FRAMETIME2,
1471
+ onGround,
1472
+ groundIsSlick: false,
1473
+ onLadder: false,
1474
+ waterlevel: waterLevel,
1475
+ pmFriction: 6,
1476
+ pmStopSpeed: 100,
1477
+ pmWaterFriction: 1
1478
+ });
1479
+ const wish = waterLevel >= 2 ? buildWaterWish({
1480
+ forward,
1481
+ right,
1482
+ cmd,
1483
+ maxSpeed: 320
1484
+ }) : buildAirGroundWish({
1485
+ forward,
1486
+ right,
1487
+ cmd,
1488
+ maxSpeed: 320
1489
+ });
1490
+ const finalVelocity = applyPmoveAccelerate({
1491
+ velocity: frictionedVelocity,
1492
+ wishdir: wish.wishdir,
1493
+ wishspeed: wish.wishspeed,
1494
+ // Water movement uses ground acceleration (10), not air acceleration (1)
1495
+ accel: onGround || waterLevel >= 2 ? 10 : 1,
1496
+ frametime: FRAMETIME2
1497
+ });
1498
+ const traceResult = trace(origin, {
1499
+ x: origin.x + finalVelocity.x * FRAMETIME2,
1500
+ y: origin.y + finalVelocity.y * FRAMETIME2,
1501
+ z: origin.z + finalVelocity.z * FRAMETIME2
1502
+ });
1503
+ return {
1504
+ ...newState,
1505
+ origin: traceResult.endpos,
1506
+ velocity: finalVelocity
1507
+ };
1508
+ };
1509
+ var BinaryWriter = class {
1510
+ constructor(sizeOrBuffer = 1400) {
1511
+ if (typeof sizeOrBuffer === "number") {
1512
+ this.buffer = new Uint8Array(sizeOrBuffer);
1513
+ this.fixed = false;
1514
+ } else {
1515
+ this.buffer = sizeOrBuffer;
1516
+ this.fixed = true;
1517
+ }
1518
+ this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);
1519
+ this.offset = 0;
1520
+ }
1521
+ ensureSpace(bytes) {
1522
+ if (this.offset + bytes > this.buffer.byteLength) {
1523
+ if (this.fixed) {
1524
+ throw new Error(`Buffer overflow: capacity ${this.buffer.byteLength}, needed ${this.offset + bytes}`);
1525
+ }
1526
+ const newSize = Math.max(this.buffer.byteLength * 2, this.offset + bytes);
1527
+ const newBuffer = new Uint8Array(newSize);
1528
+ newBuffer.set(this.buffer);
1529
+ this.buffer = newBuffer;
1530
+ this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);
1531
+ }
1532
+ }
1533
+ writeByte(value) {
1534
+ this.ensureSpace(1);
1535
+ this.view.setUint8(this.offset, value);
1536
+ this.offset += 1;
1537
+ }
1538
+ writeChar(value) {
1539
+ this.ensureSpace(1);
1540
+ this.view.setInt8(this.offset, value);
1541
+ this.offset += 1;
1542
+ }
1543
+ writeShort(value) {
1544
+ this.ensureSpace(2);
1545
+ this.view.setInt16(this.offset, value, true);
1546
+ this.offset += 2;
1547
+ }
1548
+ writeLong(value) {
1549
+ this.ensureSpace(4);
1550
+ this.view.setInt32(this.offset, value, true);
1551
+ this.offset += 4;
1552
+ }
1553
+ writeFloat(value) {
1554
+ this.ensureSpace(4);
1555
+ this.view.setFloat32(this.offset, value, true);
1556
+ this.offset += 4;
1557
+ }
1558
+ writeString(value) {
1559
+ const len = value.length;
1560
+ this.ensureSpace(len + 1);
1561
+ for (let i = 0; i < len; i++) {
1562
+ this.view.setUint8(this.offset + i, value.charCodeAt(i));
1563
+ }
1564
+ this.view.setUint8(this.offset + len, 0);
1565
+ this.offset += len + 1;
1566
+ }
1567
+ writeCoord(value) {
1568
+ this.writeShort(Math.trunc(value * 8));
1569
+ }
1570
+ writeAngle(value) {
1571
+ this.writeByte(Math.trunc(value * 256 / 360) & 255);
1572
+ }
1573
+ writeAngle16(value) {
1574
+ this.writeShort(Math.trunc(value * 65536 / 360) & 65535);
1575
+ }
1576
+ writePos(pos) {
1577
+ this.writeCoord(pos.x);
1578
+ this.writeCoord(pos.y);
1579
+ this.writeCoord(pos.z);
1580
+ }
1581
+ writeDir(dir) {
1582
+ let maxDot = -1;
1583
+ let bestIndex = 0;
1584
+ if (dir.x === 0 && dir.y === 0 && dir.z === 0) {
1585
+ this.writeByte(0);
1586
+ return;
1587
+ }
1588
+ for (let i = 0; i < ANORMS.length; i++) {
1589
+ const norm = ANORMS[i];
1590
+ const dot = dir.x * norm[0] + dir.y * norm[1] + dir.z * norm[2];
1591
+ if (dot > maxDot) {
1592
+ maxDot = dot;
1593
+ bestIndex = i;
641
1594
  }
642
- seed(seed) {
643
- this.state[0] = seed >>> 0;
644
- for (let i = 1; i < STATE_SIZE; i++) {
645
- const prev = this.state[i - 1] ^ this.state[i - 1] >>> 30;
646
- const next = Math.imul(prev >>> 0, 1812433253) + i;
647
- this.state[i] = next >>> 0;
1595
+ }
1596
+ this.writeByte(bestIndex);
1597
+ }
1598
+ getData() {
1599
+ return this.buffer.slice(0, this.offset);
1600
+ }
1601
+ getBuffer() {
1602
+ return this.buffer;
1603
+ }
1604
+ getOffset() {
1605
+ return this.offset;
1606
+ }
1607
+ reset() {
1608
+ this.offset = 0;
1609
+ }
1610
+ };
1611
+ var _NetChan = class _NetChan2 {
1612
+ constructor() {
1613
+ this.qport = 0;
1614
+ this.incomingSequence = 0;
1615
+ this.outgoingSequence = 0;
1616
+ this.incomingAcknowledged = 0;
1617
+ this.incomingReliableAcknowledged = false;
1618
+ this.incomingReliableSequence = 0;
1619
+ this.outgoingReliableSequence = 0;
1620
+ this.reliableLength = 0;
1621
+ this.fragmentSendOffset = 0;
1622
+ this.fragmentBuffer = null;
1623
+ this.fragmentLength = 0;
1624
+ this.fragmentReceived = 0;
1625
+ this.lastReceived = 0;
1626
+ this.lastSent = 0;
1627
+ this.remoteAddress = null;
1628
+ this.reliableMessage = new BinaryWriter(_NetChan2.MAX_RELIABLE_BUFFER);
1629
+ const now = Date.now();
1630
+ this.lastReceived = now;
1631
+ this.lastSent = now;
1632
+ this.qport = Math.floor(Math.random() * 65536);
1633
+ }
1634
+ /**
1635
+ * Setup the netchan with specific settings
1636
+ */
1637
+ setup(qport, address = null) {
1638
+ this.qport = qport;
1639
+ this.remoteAddress = address;
1640
+ this.reset();
1641
+ }
1642
+ /**
1643
+ * Reset the netchan state
1644
+ */
1645
+ reset() {
1646
+ this.incomingSequence = 0;
1647
+ this.outgoingSequence = 0;
1648
+ this.incomingAcknowledged = 0;
1649
+ this.incomingReliableAcknowledged = false;
1650
+ this.incomingReliableSequence = 0;
1651
+ this.outgoingReliableSequence = 0;
1652
+ this.reliableLength = 0;
1653
+ this.reliableMessage.reset();
1654
+ this.fragmentSendOffset = 0;
1655
+ this.fragmentBuffer = null;
1656
+ this.fragmentLength = 0;
1657
+ this.fragmentReceived = 0;
1658
+ this.lastReceived = Date.now();
1659
+ this.lastSent = Date.now();
1660
+ }
1661
+ /**
1662
+ * Transmits a packet containing reliable and unreliable data
1663
+ */
1664
+ transmit(unreliableData) {
1665
+ this.outgoingSequence++;
1666
+ this.lastSent = Date.now();
1667
+ let sendReliableLength = 0;
1668
+ let isFragment = false;
1669
+ let fragmentStart = 0;
1670
+ if (this.reliableLength > 0) {
1671
+ if (this.reliableLength > _NetChan2.FRAGMENT_SIZE) {
1672
+ isFragment = true;
1673
+ if (this.fragmentSendOffset >= this.reliableLength) {
1674
+ this.fragmentSendOffset = 0;
648
1675
  }
649
- this.index = STATE_SIZE;
650
- }
651
- nextUint32() {
652
- if (this.index >= STATE_SIZE) {
653
- this.twist();
1676
+ const remaining = this.reliableLength - this.fragmentSendOffset;
1677
+ sendReliableLength = remaining;
1678
+ if (sendReliableLength > _NetChan2.FRAGMENT_SIZE) {
1679
+ sendReliableLength = _NetChan2.FRAGMENT_SIZE;
654
1680
  }
655
- let y = this.state[this.index++];
656
- y ^= y >>> 11;
657
- y ^= y << 7 & 2636928640;
658
- y ^= y << 15 & 4022730752;
659
- y ^= y >>> 18;
660
- return y >>> 0;
1681
+ fragmentStart = this.fragmentSendOffset;
1682
+ this.fragmentSendOffset += sendReliableLength;
1683
+ } else {
1684
+ sendReliableLength = this.reliableLength;
1685
+ }
1686
+ }
1687
+ const headerSize = _NetChan2.PACKET_HEADER;
1688
+ const reliableHeaderSize = sendReliableLength > 0 ? 2 + (isFragment ? 8 : 0) : 0;
1689
+ let unreliableSize = unreliableData ? unreliableData.length : 0;
1690
+ if (headerSize + reliableHeaderSize + sendReliableLength + unreliableSize > _NetChan2.MAX_MSGLEN) {
1691
+ unreliableSize = _NetChan2.MAX_MSGLEN - headerSize - reliableHeaderSize - sendReliableLength;
1692
+ if (unreliableSize < 0) unreliableSize = 0;
1693
+ }
1694
+ const buffer = new ArrayBuffer(headerSize + reliableHeaderSize + sendReliableLength + unreliableSize);
1695
+ const view = new DataView(buffer);
1696
+ const result = new Uint8Array(buffer);
1697
+ let sequence = this.outgoingSequence;
1698
+ if (sendReliableLength > 0) {
1699
+ sequence |= 2147483648;
1700
+ if ((this.outgoingReliableSequence & 1) !== 0) {
1701
+ sequence |= 1073741824;
1702
+ }
1703
+ }
1704
+ view.setUint32(0, sequence, true);
1705
+ let ack = this.incomingSequence;
1706
+ if ((this.incomingReliableSequence & 1) !== 0) {
1707
+ ack |= 2147483648;
1708
+ }
1709
+ view.setUint32(4, ack, true);
1710
+ view.setUint16(8, this.qport, true);
1711
+ let offset = headerSize;
1712
+ if (sendReliableLength > 0) {
1713
+ let lengthField = sendReliableLength;
1714
+ if (isFragment) {
1715
+ lengthField |= 32768;
1716
+ }
1717
+ view.setUint16(offset, lengthField, true);
1718
+ offset += 2;
1719
+ if (isFragment) {
1720
+ view.setUint32(offset, fragmentStart, true);
1721
+ offset += 4;
1722
+ view.setUint32(offset, this.reliableLength, true);
1723
+ offset += 4;
1724
+ }
1725
+ const reliableBuffer = this.reliableMessage.getBuffer();
1726
+ const reliableBytes = reliableBuffer.subarray(fragmentStart, fragmentStart + sendReliableLength);
1727
+ result.set(reliableBytes, offset);
1728
+ offset += sendReliableLength;
1729
+ }
1730
+ if (unreliableData && unreliableSize > 0) {
1731
+ const chunk = unreliableData.slice(0, unreliableSize);
1732
+ result.set(chunk, offset);
1733
+ }
1734
+ return result;
1735
+ }
1736
+ /**
1737
+ * Processes a received packet
1738
+ * Returns the payload data (reliable + unreliable) to be processed, or null if discarded
1739
+ */
1740
+ process(packet) {
1741
+ if (packet.length < _NetChan2.PACKET_HEADER) {
1742
+ return null;
1743
+ }
1744
+ this.lastReceived = Date.now();
1745
+ const view = new DataView(packet.buffer, packet.byteOffset, packet.byteLength);
1746
+ const sequence = view.getUint32(0, true);
1747
+ const ack = view.getUint32(4, true);
1748
+ const qport = view.getUint16(8, true);
1749
+ if (this.qport !== qport) {
1750
+ return null;
1751
+ }
1752
+ const seqNumberClean = sequence & ~(2147483648 | 1073741824);
1753
+ if ((seqNumberClean - this.incomingSequence | 0) <= 0) {
1754
+ return null;
1755
+ }
1756
+ this.incomingSequence = seqNumberClean;
1757
+ const ackNumber = ack & ~2147483648;
1758
+ const ackReliable = (ack & 2147483648) !== 0;
1759
+ if (ackNumber > this.incomingAcknowledged) {
1760
+ this.incomingAcknowledged = ackNumber;
1761
+ }
1762
+ if (this.reliableLength > 0) {
1763
+ const receivedAckBit = ackReliable ? 1 : 0;
1764
+ const currentReliableBit = this.outgoingReliableSequence & 1;
1765
+ if (receivedAckBit !== currentReliableBit) {
1766
+ this.reliableLength = 0;
1767
+ this.reliableMessage.reset();
1768
+ this.outgoingReliableSequence ^= 1;
1769
+ this.fragmentSendOffset = 0;
661
1770
  }
662
- twist() {
663
- for (let i = 0; i < STATE_SIZE; i++) {
664
- const y = this.state[i] & UPPER_MASK | this.state[(i + 1) % STATE_SIZE] & LOWER_MASK;
665
- let next = this.state[(i + MIDDLE_WORD) % STATE_SIZE] ^ y >>> 1;
666
- if ((y & 1) !== 0) {
667
- next ^= MATRIX_A;
1771
+ }
1772
+ const hasReliableData = (sequence & 2147483648) !== 0;
1773
+ const reliableSeqBit = (sequence & 1073741824) !== 0 ? 1 : 0;
1774
+ let payloadOffset = _NetChan2.PACKET_HEADER;
1775
+ let reliableData = null;
1776
+ if (hasReliableData) {
1777
+ if (payloadOffset + 2 > packet.byteLength) return null;
1778
+ let reliableLen = view.getUint16(payloadOffset, true);
1779
+ payloadOffset += 2;
1780
+ const isFragment = (reliableLen & 32768) !== 0;
1781
+ reliableLen &= 32767;
1782
+ const expectedBit = this.incomingReliableSequence & 1;
1783
+ if (reliableSeqBit === expectedBit) {
1784
+ if (isFragment) {
1785
+ if (payloadOffset + 8 > packet.byteLength) return null;
1786
+ const fragStart = view.getUint32(payloadOffset, true);
1787
+ payloadOffset += 4;
1788
+ const fragTotal = view.getUint32(payloadOffset, true);
1789
+ payloadOffset += 4;
1790
+ if (fragTotal > _NetChan2.MAX_RELIABLE_BUFFER) {
1791
+ console.warn(`NetChan: received invalid fragment total ${fragTotal} > ${_NetChan2.MAX_RELIABLE_BUFFER}`);
1792
+ return null;
668
1793
  }
669
- this.state[i] = next >>> 0;
1794
+ if (!this.fragmentBuffer || this.fragmentBuffer.length !== fragTotal) {
1795
+ this.fragmentBuffer = new Uint8Array(fragTotal);
1796
+ this.fragmentLength = fragTotal;
1797
+ this.fragmentReceived = 0;
1798
+ }
1799
+ if (payloadOffset + reliableLen > packet.byteLength) return null;
1800
+ const data = packet.subarray(payloadOffset, payloadOffset + reliableLen);
1801
+ if (fragStart === this.fragmentReceived && fragStart + reliableLen <= fragTotal) {
1802
+ this.fragmentBuffer.set(data, fragStart);
1803
+ this.fragmentReceived += reliableLen;
1804
+ if (this.fragmentReceived >= fragTotal) {
1805
+ reliableData = this.fragmentBuffer;
1806
+ this.incomingReliableSequence++;
1807
+ this.fragmentBuffer = null;
1808
+ this.fragmentLength = 0;
1809
+ this.fragmentReceived = 0;
1810
+ }
1811
+ }
1812
+ } else {
1813
+ this.incomingReliableSequence++;
1814
+ if (payloadOffset + reliableLen > packet.byteLength) return null;
1815
+ reliableData = packet.slice(payloadOffset, payloadOffset + reliableLen);
670
1816
  }
671
- this.index = 0;
672
- }
673
- getState() {
674
- return {
675
- index: this.index,
676
- state: Array.from(this.state)
677
- };
678
1817
  }
679
- setState(snapshot) {
680
- if (snapshot.state.length !== STATE_SIZE) {
681
- throw new Error(`Expected ${STATE_SIZE} MT state values, received ${snapshot.state.length}`);
682
- }
683
- this.index = snapshot.index;
684
- this.state = Uint32Array.from(snapshot.state, (value) => value >>> 0);
685
- }
686
- };
687
- RandomGenerator = class {
688
- constructor(options = {}) {
689
- this.mt = new MersenneTwister19937(options.seed);
690
- }
691
- seed(seed) {
692
- this.mt.seed(seed);
693
- }
694
- /** Uniform float in [0, 1). */
695
- frandom() {
696
- return this.mt.nextUint32() / TWO_POW_32;
697
- }
698
- /** Uniform float in [min, max). */
699
- frandomRange(minInclusive, maxExclusive) {
700
- return minInclusive + (maxExclusive - minInclusive) * this.frandom();
701
- }
702
- /** Uniform float in [0, max). */
703
- frandomMax(maxExclusive) {
704
- return this.frandomRange(0, maxExclusive);
705
- }
706
- /** Uniform float in [-1, 1). */
707
- crandom() {
708
- return this.frandomRange(-1, 1);
709
- }
710
- /** Uniform float in (-1, 1). */
711
- crandomOpen() {
712
- const epsilon = Number.EPSILON;
713
- return this.frandomRange(-1 + epsilon, 1);
714
- }
715
- /** Raw uint32 sample. */
716
- irandomUint32() {
717
- return this.mt.nextUint32();
718
- }
719
- /** Uniform integer in [min, max). */
720
- irandomRange(minInclusive, maxExclusive) {
721
- if (maxExclusive - minInclusive <= 1) {
722
- return minInclusive;
723
- }
724
- const span = maxExclusive - minInclusive;
725
- const limit = TWO_POW_32 - TWO_POW_32 % span;
726
- let sample;
727
- do {
728
- sample = this.mt.nextUint32();
729
- } while (sample >= limit);
730
- return minInclusive + sample % span;
731
- }
732
- /** Uniform integer in [0, max). */
733
- irandom(maxExclusive) {
734
- if (maxExclusive <= 0) {
735
- return 0;
736
- }
737
- return this.irandomRange(0, maxExclusive);
738
- }
739
- /** Uniform time in milliseconds [min, max). */
740
- randomTimeRange(minMs, maxMs) {
741
- if (maxMs <= minMs) {
742
- return minMs;
743
- }
744
- return this.irandomRange(minMs, maxMs);
745
- }
746
- /** Uniform time in milliseconds [0, max). */
747
- randomTime(maxMs) {
748
- return this.irandom(maxMs);
749
- }
750
- randomIndex(container) {
751
- return this.irandom(container.length);
752
- }
753
- getState() {
754
- return { mt: this.mt.getState() };
755
- }
756
- setState(snapshot) {
757
- this.mt.setState(snapshot.mt);
758
- }
759
- };
760
- CONTENTS_SOLID = 1 << 0;
761
- CONTENTS_WINDOW = 1 << 1;
762
- CONTENTS_AUX = 1 << 2;
763
- CONTENTS_LAVA = 1 << 3;
764
- CONTENTS_SLIME = 1 << 4;
765
- CONTENTS_WATER = 1 << 5;
766
- CONTENTS_MIST = 1 << 6;
767
- CONTENTS_NO_WATERJUMP = 1 << 13;
768
- CONTENTS_PROJECTILECLIP = 1 << 14;
769
- CONTENTS_AREAPORTAL = 1 << 15;
770
- CONTENTS_PLAYERCLIP = 1 << 16;
771
- CONTENTS_MONSTERCLIP = 1 << 17;
772
- CONTENTS_CURRENT_0 = 1 << 18;
773
- CONTENTS_CURRENT_90 = 1 << 19;
774
- CONTENTS_CURRENT_180 = 1 << 20;
775
- CONTENTS_CURRENT_270 = 1 << 21;
776
- CONTENTS_CURRENT_UP = 1 << 22;
777
- CONTENTS_CURRENT_DOWN = 1 << 23;
778
- CONTENTS_ORIGIN = 1 << 24;
779
- CONTENTS_MONSTER = 1 << 25;
780
- CONTENTS_DEADMONSTER = 1 << 26;
781
- CONTENTS_DETAIL = 1 << 27;
782
- CONTENTS_TRANSLUCENT = 1 << 28;
783
- CONTENTS_LADDER = 1 << 29;
784
- CONTENTS_PLAYER = 1 << 30;
785
- CONTENTS_PROJECTILE = 1 << 31;
786
- SURF_LIGHT = 1 << 0;
787
- SURF_SLICK = 1 << 1;
788
- SURF_SKY = 1 << 2;
789
- SURF_WARP = 1 << 3;
790
- SURF_TRANS33 = 1 << 4;
791
- SURF_TRANS66 = 1 << 5;
792
- SURF_FLOWING = 1 << 6;
793
- SURF_NODRAW = 1 << 7;
794
- SURF_ALPHATEST = 1 << 25;
795
- SURF_N64_UV = 1 << 28;
796
- SURF_N64_SCROLL_X = 1 << 29;
797
- SURF_N64_SCROLL_Y = 1 << 30;
798
- SURF_N64_SCROLL_FLIP = 1 << 31;
799
- MASK_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
800
- MASK_PLAYERSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
801
- MASK_DEADSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
802
- MASK_MONSTERSOLID = CONTENTS_SOLID | CONTENTS_MONSTERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
803
- MASK_WATER = CONTENTS_WATER | CONTENTS_LAVA | CONTENTS_SLIME;
804
- MASK_OPAQUE = CONTENTS_SOLID | CONTENTS_SLIME | CONTENTS_LAVA;
805
- MASK_SHOT = CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_PLAYER | CONTENTS_WINDOW | CONTENTS_DEADMONSTER;
806
- MASK_CURRENT = CONTENTS_CURRENT_0 | CONTENTS_CURRENT_90 | CONTENTS_CURRENT_180 | CONTENTS_CURRENT_270 | CONTENTS_CURRENT_UP | CONTENTS_CURRENT_DOWN;
807
- MASK_BLOCK_SIGHT = CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_MONSTER | CONTENTS_PLAYER;
808
- MASK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
809
- MASK_LADDER_NAV_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
810
- MASK_WALK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTERCLIP;
811
- MASK_PROJECTILE = MASK_SHOT | CONTENTS_PROJECTILECLIP;
812
- MAX_CHECKCOUNT = Number.MAX_SAFE_INTEGER - 1;
813
- CvarFlags = /* @__PURE__ */ ((CvarFlags2) => {
814
- CvarFlags2[CvarFlags2["None"] = 0] = "None";
815
- CvarFlags2[CvarFlags2["Archive"] = 1] = "Archive";
816
- CvarFlags2[CvarFlags2["UserInfo"] = 2] = "UserInfo";
817
- CvarFlags2[CvarFlags2["ServerInfo"] = 4] = "ServerInfo";
818
- CvarFlags2[CvarFlags2["Latch"] = 8] = "Latch";
819
- CvarFlags2[CvarFlags2["Cheat"] = 16] = "Cheat";
820
- return CvarFlags2;
821
- })(CvarFlags || {});
822
- MAX_CLIENTS = 256;
823
- MAX_LIGHTSTYLES = 256;
824
- MAX_MODELS = 8192;
825
- MAX_SOUNDS = 2048;
826
- MAX_IMAGES = 512;
827
- MAX_ITEMS = 256;
828
- MAX_GENERAL = MAX_CLIENTS * 2;
829
- MAX_SHADOW_LIGHTS = 256;
830
- MAX_WHEEL_ITEMS = 32;
831
- ConfigStringIndex = ((ConfigStringIndex2) => {
832
- ConfigStringIndex2[ConfigStringIndex2["Name"] = 0] = "Name";
833
- ConfigStringIndex2[ConfigStringIndex2["CdTrack"] = 1] = "CdTrack";
834
- ConfigStringIndex2[ConfigStringIndex2["Sky"] = 2] = "Sky";
835
- ConfigStringIndex2[ConfigStringIndex2["SkyAxis"] = 3] = "SkyAxis";
836
- ConfigStringIndex2[ConfigStringIndex2["SkyRotate"] = 4] = "SkyRotate";
837
- ConfigStringIndex2[ConfigStringIndex2["StatusBar"] = 5] = "StatusBar";
838
- ConfigStringIndex2[ConfigStringIndex2["HealthBarName"] = 55] = "HealthBarName";
839
- ConfigStringIndex2[ConfigStringIndex2["CONFIG_N64_PHYSICS"] = 56] = "CONFIG_N64_PHYSICS";
840
- ConfigStringIndex2[ConfigStringIndex2["CONFIG_CTF_TEAMS"] = 57] = "CONFIG_CTF_TEAMS";
841
- ConfigStringIndex2[ConfigStringIndex2["CONFIG_COOP_RESPAWN_STRING"] = 58] = "CONFIG_COOP_RESPAWN_STRING";
842
- ConfigStringIndex2[ConfigStringIndex2["Story"] = 54] = "Story";
843
- ConfigStringIndex2[ConfigStringIndex2["AirAccel"] = 59] = "AirAccel";
844
- ConfigStringIndex2[ConfigStringIndex2["MaxClients"] = 60] = "MaxClients";
845
- ConfigStringIndex2[ConfigStringIndex2["MapChecksum"] = 61] = "MapChecksum";
846
- ConfigStringIndex2[ConfigStringIndex2["Models"] = 62] = "Models";
847
- ConfigStringIndex2[ConfigStringIndex2["Sounds"] = 62 + MAX_MODELS] = "Sounds";
848
- ConfigStringIndex2[ConfigStringIndex2["Images"] = ConfigStringIndex2.Sounds + MAX_SOUNDS] = "Images";
849
- ConfigStringIndex2[ConfigStringIndex2["Lights"] = ConfigStringIndex2.Images + MAX_IMAGES] = "Lights";
850
- ConfigStringIndex2[ConfigStringIndex2["ShadowLights"] = ConfigStringIndex2.Lights + MAX_LIGHTSTYLES] = "ShadowLights";
851
- ConfigStringIndex2[ConfigStringIndex2["Items"] = ConfigStringIndex2.ShadowLights + MAX_SHADOW_LIGHTS] = "Items";
852
- ConfigStringIndex2[ConfigStringIndex2["PlayerSkins"] = ConfigStringIndex2.Items + MAX_ITEMS] = "PlayerSkins";
853
- ConfigStringIndex2[ConfigStringIndex2["General"] = ConfigStringIndex2.PlayerSkins + MAX_CLIENTS] = "General";
854
- ConfigStringIndex2[ConfigStringIndex2["WheelWeapons"] = ConfigStringIndex2.General + MAX_GENERAL] = "WheelWeapons";
855
- ConfigStringIndex2[ConfigStringIndex2["WheelAmmo"] = ConfigStringIndex2.WheelWeapons + MAX_WHEEL_ITEMS] = "WheelAmmo";
856
- ConfigStringIndex2[ConfigStringIndex2["WheelPowerups"] = ConfigStringIndex2.WheelAmmo + MAX_WHEEL_ITEMS] = "WheelPowerups";
857
- ConfigStringIndex2[ConfigStringIndex2["CdLoopCount"] = ConfigStringIndex2.WheelPowerups + MAX_WHEEL_ITEMS] = "CdLoopCount";
858
- ConfigStringIndex2[ConfigStringIndex2["GameStyle"] = ConfigStringIndex2.CdLoopCount + 1] = "GameStyle";
859
- ConfigStringIndex2[ConfigStringIndex2["MaxConfigStrings"] = ConfigStringIndex2.GameStyle + 1] = "MaxConfigStrings";
860
- return ConfigStringIndex2;
861
- })(ConfigStringIndex || {});
862
- MAX_CONFIGSTRINGS = ConfigStringIndex.MaxConfigStrings;
863
- replay_exports = {};
864
- __export2(replay_exports, {
865
- addReplayFrame: () => addReplayFrame,
866
- createReplaySession: () => createReplaySession,
867
- deserializeReplay: () => deserializeReplay,
868
- serializeReplay: () => serializeReplay
869
- });
870
- WaterLevel = /* @__PURE__ */ ((WaterLevel4) => {
871
- WaterLevel4[WaterLevel4["None"] = 0] = "None";
872
- WaterLevel4[WaterLevel4["Feet"] = 1] = "Feet";
873
- WaterLevel4[WaterLevel4["Waist"] = 2] = "Waist";
874
- WaterLevel4[WaterLevel4["Under"] = 3] = "Under";
875
- return WaterLevel4;
876
- })(WaterLevel || {});
877
- WATERJUMP_CLEAR = 8 | 16 | 32 | 1024;
878
- ServerCommand = /* @__PURE__ */ ((ServerCommand22) => {
879
- ServerCommand22[ServerCommand22["bad"] = 0] = "bad";
880
- ServerCommand22[ServerCommand22["muzzleflash"] = 1] = "muzzleflash";
881
- ServerCommand22[ServerCommand22["muzzleflash2"] = 2] = "muzzleflash2";
882
- ServerCommand22[ServerCommand22["temp_entity"] = 3] = "temp_entity";
883
- ServerCommand22[ServerCommand22["layout"] = 4] = "layout";
884
- ServerCommand22[ServerCommand22["inventory"] = 5] = "inventory";
885
- ServerCommand22[ServerCommand22["nop"] = 6] = "nop";
886
- ServerCommand22[ServerCommand22["disconnect"] = 7] = "disconnect";
887
- ServerCommand22[ServerCommand22["reconnect"] = 8] = "reconnect";
888
- ServerCommand22[ServerCommand22["sound"] = 9] = "sound";
889
- ServerCommand22[ServerCommand22["print"] = 10] = "print";
890
- ServerCommand22[ServerCommand22["stufftext"] = 11] = "stufftext";
891
- ServerCommand22[ServerCommand22["serverdata"] = 12] = "serverdata";
892
- ServerCommand22[ServerCommand22["configstring"] = 13] = "configstring";
893
- ServerCommand22[ServerCommand22["spawnbaseline"] = 14] = "spawnbaseline";
894
- ServerCommand22[ServerCommand22["centerprint"] = 15] = "centerprint";
895
- ServerCommand22[ServerCommand22["download"] = 16] = "download";
896
- ServerCommand22[ServerCommand22["playerinfo"] = 17] = "playerinfo";
897
- ServerCommand22[ServerCommand22["packetentities"] = 18] = "packetentities";
898
- ServerCommand22[ServerCommand22["deltapacketentities"] = 19] = "deltapacketentities";
899
- ServerCommand22[ServerCommand22["frame"] = 20] = "frame";
900
- ServerCommand22[ServerCommand22["splitclient"] = 21] = "splitclient";
901
- ServerCommand22[ServerCommand22["configblast"] = 22] = "configblast";
902
- ServerCommand22[ServerCommand22["spawnbaselineblast"] = 23] = "spawnbaselineblast";
903
- ServerCommand22[ServerCommand22["level_restart"] = 24] = "level_restart";
904
- ServerCommand22[ServerCommand22["damage"] = 25] = "damage";
905
- ServerCommand22[ServerCommand22["locprint"] = 26] = "locprint";
906
- ServerCommand22[ServerCommand22["fog"] = 27] = "fog";
907
- ServerCommand22[ServerCommand22["waitingforplayers"] = 28] = "waitingforplayers";
908
- ServerCommand22[ServerCommand22["bot_chat"] = 29] = "bot_chat";
909
- ServerCommand22[ServerCommand22["poi"] = 30] = "poi";
910
- ServerCommand22[ServerCommand22["help_path"] = 31] = "help_path";
911
- ServerCommand22[ServerCommand22["muzzleflash3"] = 32] = "muzzleflash3";
912
- ServerCommand22[ServerCommand22["achievement"] = 33] = "achievement";
913
- return ServerCommand22;
914
- })(ServerCommand || {});
915
- TempEntity = /* @__PURE__ */ ((TempEntity2) => {
916
- TempEntity2[TempEntity2["GUNSHOT"] = 0] = "GUNSHOT";
917
- TempEntity2[TempEntity2["BLOOD"] = 1] = "BLOOD";
918
- TempEntity2[TempEntity2["BLASTER"] = 2] = "BLASTER";
919
- TempEntity2[TempEntity2["RAILTRAIL"] = 3] = "RAILTRAIL";
920
- TempEntity2[TempEntity2["SHOTGUN"] = 4] = "SHOTGUN";
921
- TempEntity2[TempEntity2["EXPLOSION1"] = 5] = "EXPLOSION1";
922
- TempEntity2[TempEntity2["EXPLOSION2"] = 6] = "EXPLOSION2";
923
- TempEntity2[TempEntity2["ROCKET_EXPLOSION"] = 7] = "ROCKET_EXPLOSION";
924
- TempEntity2[TempEntity2["GRENADE_EXPLOSION"] = 8] = "GRENADE_EXPLOSION";
925
- TempEntity2[TempEntity2["SPARKS"] = 9] = "SPARKS";
926
- TempEntity2[TempEntity2["SPLASH"] = 10] = "SPLASH";
927
- TempEntity2[TempEntity2["BUBBLETRAIL"] = 11] = "BUBBLETRAIL";
928
- TempEntity2[TempEntity2["SCREEN_SPARKS"] = 12] = "SCREEN_SPARKS";
929
- TempEntity2[TempEntity2["SHIELD_SPARKS"] = 13] = "SHIELD_SPARKS";
930
- TempEntity2[TempEntity2["BULLET_SPARKS"] = 14] = "BULLET_SPARKS";
931
- TempEntity2[TempEntity2["LASER_SPARKS"] = 15] = "LASER_SPARKS";
932
- TempEntity2[TempEntity2["PARASITE_ATTACK"] = 16] = "PARASITE_ATTACK";
933
- TempEntity2[TempEntity2["ROCKET_EXPLOSION_WATER"] = 17] = "ROCKET_EXPLOSION_WATER";
934
- TempEntity2[TempEntity2["GRENADE_EXPLOSION_WATER"] = 18] = "GRENADE_EXPLOSION_WATER";
935
- TempEntity2[TempEntity2["MEDIC_CABLE_ATTACK"] = 19] = "MEDIC_CABLE_ATTACK";
936
- TempEntity2[TempEntity2["BFG_EXPLOSION"] = 20] = "BFG_EXPLOSION";
937
- TempEntity2[TempEntity2["BFG_BIGEXPLOSION"] = 21] = "BFG_BIGEXPLOSION";
938
- TempEntity2[TempEntity2["BOSSTPORT"] = 22] = "BOSSTPORT";
939
- TempEntity2[TempEntity2["BFG_LASER"] = 23] = "BFG_LASER";
940
- TempEntity2[TempEntity2["GRAPPLE_CABLE"] = 24] = "GRAPPLE_CABLE";
941
- TempEntity2[TempEntity2["WELDING_SPARKS"] = 25] = "WELDING_SPARKS";
942
- TempEntity2[TempEntity2["GREENBLOOD"] = 26] = "GREENBLOOD";
943
- TempEntity2[TempEntity2["BLUEHYPERBLASTER"] = 27] = "BLUEHYPERBLASTER";
944
- TempEntity2[TempEntity2["PLASMA_EXPLOSION"] = 28] = "PLASMA_EXPLOSION";
945
- TempEntity2[TempEntity2["TUNNEL_SPARKS"] = 29] = "TUNNEL_SPARKS";
946
- TempEntity2[TempEntity2["BLASTER2"] = 30] = "BLASTER2";
947
- TempEntity2[TempEntity2["RAILTRAIL2"] = 31] = "RAILTRAIL2";
948
- TempEntity2[TempEntity2["FLAME"] = 32] = "FLAME";
949
- TempEntity2[TempEntity2["LIGHTNING"] = 33] = "LIGHTNING";
950
- TempEntity2[TempEntity2["DEBUGTRAIL"] = 34] = "DEBUGTRAIL";
951
- TempEntity2[TempEntity2["PLAIN_EXPLOSION"] = 35] = "PLAIN_EXPLOSION";
952
- TempEntity2[TempEntity2["FLASHLIGHT"] = 36] = "FLASHLIGHT";
953
- TempEntity2[TempEntity2["FORCEWALL"] = 37] = "FORCEWALL";
954
- TempEntity2[TempEntity2["HEATBEAM"] = 38] = "HEATBEAM";
955
- TempEntity2[TempEntity2["MONSTER_HEATBEAM"] = 39] = "MONSTER_HEATBEAM";
956
- TempEntity2[TempEntity2["STEAM"] = 40] = "STEAM";
957
- TempEntity2[TempEntity2["BUBBLETRAIL2"] = 41] = "BUBBLETRAIL2";
958
- TempEntity2[TempEntity2["MOREBLOOD"] = 42] = "MOREBLOOD";
959
- TempEntity2[TempEntity2["HEATBEAM_SPARKS"] = 43] = "HEATBEAM_SPARKS";
960
- TempEntity2[TempEntity2["HEATBEAM_STEAM"] = 44] = "HEATBEAM_STEAM";
961
- TempEntity2[TempEntity2["CHAINFIST_SMOKE"] = 45] = "CHAINFIST_SMOKE";
962
- TempEntity2[TempEntity2["ELECTRIC_SPARKS"] = 46] = "ELECTRIC_SPARKS";
963
- TempEntity2[TempEntity2["TRACKER_EXPLOSION"] = 47] = "TRACKER_EXPLOSION";
964
- TempEntity2[TempEntity2["TELEPORT_EFFECT"] = 48] = "TELEPORT_EFFECT";
965
- TempEntity2[TempEntity2["DBALL_GOAL"] = 49] = "DBALL_GOAL";
966
- TempEntity2[TempEntity2["WIDOWBEAMOUT"] = 50] = "WIDOWBEAMOUT";
967
- TempEntity2[TempEntity2["NUKEBLAST"] = 51] = "NUKEBLAST";
968
- TempEntity2[TempEntity2["WIDOWSPLASH"] = 52] = "WIDOWSPLASH";
969
- TempEntity2[TempEntity2["EXPLOSION1_BIG"] = 53] = "EXPLOSION1_BIG";
970
- TempEntity2[TempEntity2["EXPLOSION1_NP"] = 54] = "EXPLOSION1_NP";
971
- TempEntity2[TempEntity2["FLECHETTE"] = 55] = "FLECHETTE";
972
- TempEntity2[TempEntity2["BLUEHYPERBLASTER_KEX"] = 56] = "BLUEHYPERBLASTER_KEX";
973
- TempEntity2[TempEntity2["BFG_ZAP"] = 57] = "BFG_ZAP";
974
- TempEntity2[TempEntity2["BERSERK_SLAM"] = 58] = "BERSERK_SLAM";
975
- TempEntity2[TempEntity2["GRAPPLE_CABLE_2"] = 59] = "GRAPPLE_CABLE_2";
976
- TempEntity2[TempEntity2["POWER_SPLASH"] = 60] = "POWER_SPLASH";
977
- TempEntity2[TempEntity2["LIGHTNING_BEAM"] = 61] = "LIGHTNING_BEAM";
978
- TempEntity2[TempEntity2["EXPLOSION1_NL"] = 62] = "EXPLOSION1_NL";
979
- TempEntity2[TempEntity2["EXPLOSION2_NL"] = 63] = "EXPLOSION2_NL";
980
- return TempEntity2;
981
- })(TempEntity || {});
982
- MZ_BLASTER = 0;
983
- MZ_MACHINEGUN = 1;
984
- MZ_SHOTGUN = 2;
985
- MZ_CHAINGUN1 = 3;
986
- MZ_RAILGUN = 6;
987
- MZ_ROCKET = 7;
988
- MZ_GRENADE = 8;
989
- MZ_SSHOTGUN = 11;
990
- MZ_BFG = 12;
991
- MZ_HYPERBLASTER = 13;
992
- PowerupId = /* @__PURE__ */ ((PowerupId22) => {
993
- PowerupId22["QuadDamage"] = "quad";
994
- PowerupId22["Invulnerability"] = "invulnerability";
995
- PowerupId22["EnviroSuit"] = "enviro_suit";
996
- PowerupId22["Rebreather"] = "rebreather";
997
- PowerupId22["Silencer"] = "silencer";
998
- PowerupId22["PowerScreen"] = "power_screen";
999
- PowerupId22["PowerShield"] = "power_shield";
1000
- PowerupId22["QuadFire"] = "quad_fire";
1001
- PowerupId22["Invisibility"] = "invisibility";
1002
- PowerupId22["Bandolier"] = "bandolier";
1003
- PowerupId22["AmmoPack"] = "ammo_pack";
1004
- PowerupId22["IRGoggles"] = "ir_goggles";
1005
- PowerupId22["DoubleDamage"] = "double_damage";
1006
- PowerupId22["SphereVengeance"] = "sphere_vengeance";
1007
- PowerupId22["SphereHunter"] = "sphere_hunter";
1008
- PowerupId22["SphereDefender"] = "sphere_defender";
1009
- PowerupId22["Doppelganger"] = "doppelganger";
1010
- PowerupId22["TagToken"] = "tag_token";
1011
- PowerupId22["TechResistance"] = "tech_resistance";
1012
- PowerupId22["TechStrength"] = "tech_strength";
1013
- PowerupId22["TechHaste"] = "tech_haste";
1014
- PowerupId22["TechRegeneration"] = "tech_regeneration";
1015
- PowerupId22["Flashlight"] = "flashlight";
1016
- PowerupId22["Compass"] = "compass";
1017
- return PowerupId22;
1018
- })(PowerupId || {});
1019
- PlayerStat = /* @__PURE__ */ ((PlayerStat2) => {
1020
- PlayerStat2[PlayerStat2["STAT_HEALTH_ICON"] = 0] = "STAT_HEALTH_ICON";
1021
- PlayerStat2[PlayerStat2["STAT_HEALTH"] = 1] = "STAT_HEALTH";
1022
- PlayerStat2[PlayerStat2["STAT_AMMO_ICON"] = 2] = "STAT_AMMO_ICON";
1023
- PlayerStat2[PlayerStat2["STAT_AMMO"] = 3] = "STAT_AMMO";
1024
- PlayerStat2[PlayerStat2["STAT_ARMOR_ICON"] = 4] = "STAT_ARMOR_ICON";
1025
- PlayerStat2[PlayerStat2["STAT_ARMOR"] = 5] = "STAT_ARMOR";
1026
- PlayerStat2[PlayerStat2["STAT_SELECTED_ICON"] = 6] = "STAT_SELECTED_ICON";
1027
- PlayerStat2[PlayerStat2["STAT_PICKUP_ICON"] = 7] = "STAT_PICKUP_ICON";
1028
- PlayerStat2[PlayerStat2["STAT_PICKUP_STRING"] = 8] = "STAT_PICKUP_STRING";
1029
- PlayerStat2[PlayerStat2["STAT_TIMER_ICON"] = 9] = "STAT_TIMER_ICON";
1030
- PlayerStat2[PlayerStat2["STAT_TIMER"] = 10] = "STAT_TIMER";
1031
- PlayerStat2[PlayerStat2["STAT_HELPICON"] = 11] = "STAT_HELPICON";
1032
- PlayerStat2[PlayerStat2["STAT_SELECTED_ITEM"] = 12] = "STAT_SELECTED_ITEM";
1033
- PlayerStat2[PlayerStat2["STAT_LAYOUTS"] = 13] = "STAT_LAYOUTS";
1034
- PlayerStat2[PlayerStat2["STAT_FRAGS"] = 14] = "STAT_FRAGS";
1035
- PlayerStat2[PlayerStat2["STAT_FLASHES"] = 15] = "STAT_FLASHES";
1036
- PlayerStat2[PlayerStat2["STAT_CHASE"] = 16] = "STAT_CHASE";
1037
- PlayerStat2[PlayerStat2["STAT_SPECTATOR"] = 17] = "STAT_SPECTATOR";
1038
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_PIC"] = 18] = "STAT_CTF_TEAM1_PIC";
1039
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_CAPS"] = 19] = "STAT_CTF_TEAM1_CAPS";
1040
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_PIC"] = 20] = "STAT_CTF_TEAM2_PIC";
1041
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_CAPS"] = 21] = "STAT_CTF_TEAM2_CAPS";
1042
- PlayerStat2[PlayerStat2["STAT_CTF_FLAG_PIC"] = 22] = "STAT_CTF_FLAG_PIC";
1043
- PlayerStat2[PlayerStat2["STAT_CTF_JOINED_TEAM1_PIC"] = 23] = "STAT_CTF_JOINED_TEAM1_PIC";
1044
- PlayerStat2[PlayerStat2["STAT_CTF_JOINED_TEAM2_PIC"] = 24] = "STAT_CTF_JOINED_TEAM2_PIC";
1045
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_HEADER"] = 25] = "STAT_CTF_TEAM1_HEADER";
1046
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_HEADER"] = 26] = "STAT_CTF_TEAM2_HEADER";
1047
- PlayerStat2[PlayerStat2["STAT_CTF_TECH"] = 27] = "STAT_CTF_TECH";
1048
- PlayerStat2[PlayerStat2["STAT_CTF_ID_VIEW"] = 28] = "STAT_CTF_ID_VIEW";
1049
- PlayerStat2[PlayerStat2["STAT_CTF_MATCH"] = 29] = "STAT_CTF_MATCH";
1050
- PlayerStat2[PlayerStat2["STAT_CTF_ID_VIEW_COLOR"] = 30] = "STAT_CTF_ID_VIEW_COLOR";
1051
- PlayerStat2[PlayerStat2["STAT_CTF_TEAMINFO"] = 31] = "STAT_CTF_TEAMINFO";
1052
- PlayerStat2[PlayerStat2["STAT_WEAPONS_OWNED_1"] = 32] = "STAT_WEAPONS_OWNED_1";
1053
- PlayerStat2[PlayerStat2["STAT_WEAPONS_OWNED_2"] = 33] = "STAT_WEAPONS_OWNED_2";
1054
- PlayerStat2[PlayerStat2["STAT_AMMO_INFO_START"] = 34] = "STAT_AMMO_INFO_START";
1055
- PlayerStat2[PlayerStat2["STAT_POWERUP_INFO_START"] = 41] = "STAT_POWERUP_INFO_START";
1056
- PlayerStat2[PlayerStat2["STAT_KEY_A"] = 44] = "STAT_KEY_A";
1057
- PlayerStat2[PlayerStat2["STAT_KEY_B"] = 45] = "STAT_KEY_B";
1058
- PlayerStat2[PlayerStat2["STAT_KEY_C"] = 46] = "STAT_KEY_C";
1059
- PlayerStat2[PlayerStat2["STAT_ACTIVE_WHEEL_WEAPON"] = 47] = "STAT_ACTIVE_WHEEL_WEAPON";
1060
- PlayerStat2[PlayerStat2["STAT_COOP_RESPAWN"] = 48] = "STAT_COOP_RESPAWN";
1061
- PlayerStat2[PlayerStat2["STAT_LIVES"] = 49] = "STAT_LIVES";
1062
- PlayerStat2[PlayerStat2["STAT_HIT_MARKER"] = 50] = "STAT_HIT_MARKER";
1063
- PlayerStat2[PlayerStat2["STAT_SELECTED_ITEM_NAME"] = 51] = "STAT_SELECTED_ITEM_NAME";
1064
- PlayerStat2[PlayerStat2["STAT_HEALTH_BARS"] = 52] = "STAT_HEALTH_BARS";
1065
- PlayerStat2[PlayerStat2["STAT_ACTIVE_WEAPON"] = 53] = "STAT_ACTIVE_WEAPON";
1066
- PlayerStat2[PlayerStat2["STAT_LAST"] = 54] = "STAT_LAST";
1067
- return PlayerStat2;
1068
- })(PlayerStat || {});
1069
- AMMO_MAX = 12;
1070
- NUM_BITS_FOR_AMMO = 9;
1071
- NUM_AMMO_STATS = Math.ceil(AMMO_MAX * NUM_BITS_FOR_AMMO / 16);
1072
- POWERUP_MAX = 23;
1073
- NUM_BITS_FOR_POWERUP = 2;
1074
- NUM_POWERUP_STATS = Math.ceil(POWERUP_MAX * NUM_BITS_FOR_POWERUP / 16);
1075
- POWERUP_STAT_MAP = {
1076
- [
1077
- "power_screen"
1078
- /* PowerScreen */
1079
- ]: 0,
1080
- [
1081
- "power_shield"
1082
- /* PowerShield */
1083
- ]: 1,
1084
- // 2 is POWERUP_AM_BOMB (not in PowerupId?)
1085
- [
1086
- "quad"
1087
- /* QuadDamage */
1088
- ]: 3,
1089
- [
1090
- "quad_fire"
1091
- /* QuadFire */
1092
- ]: 4,
1093
- [
1094
- "invulnerability"
1095
- /* Invulnerability */
1096
- ]: 5,
1097
- [
1098
- "invisibility"
1099
- /* Invisibility */
1100
- ]: 6,
1101
- [
1102
- "silencer"
1103
- /* Silencer */
1104
- ]: 7,
1105
- [
1106
- "rebreather"
1107
- /* Rebreather */
1108
- ]: 8,
1109
- [
1110
- "enviro_suit"
1111
- /* EnviroSuit */
1112
- ]: 9,
1113
- [
1114
- "bandolier"
1115
- /* Bandolier */
1116
- ]: 10,
1117
- // Placeholder/Map mismatch handling?
1118
- [
1119
- "ammo_pack"
1120
- /* AmmoPack */
1121
- ]: 10,
1122
- // Original reused indices or had gaps?
1123
- [
1124
- "ir_goggles"
1125
- /* IRGoggles */
1126
- ]: 11,
1127
- [
1128
- "double_damage"
1129
- /* DoubleDamage */
1130
- ]: 12,
1131
- [
1132
- "sphere_vengeance"
1133
- /* SphereVengeance */
1134
- ]: 13,
1135
- [
1136
- "sphere_hunter"
1137
- /* SphereHunter */
1138
- ]: 14,
1139
- [
1140
- "sphere_defender"
1141
- /* SphereDefender */
1142
- ]: 15,
1143
- [
1144
- "doppelganger"
1145
- /* Doppelganger */
1146
- ]: 16,
1147
- [
1148
- "flashlight"
1149
- /* Flashlight */
1150
- ]: 17,
1151
- [
1152
- "compass"
1153
- /* Compass */
1154
- ]: 18,
1155
- [
1156
- "tech_resistance"
1157
- /* TechResistance */
1158
- ]: 19,
1159
- [
1160
- "tech_strength"
1161
- /* TechStrength */
1162
- ]: 20,
1163
- [
1164
- "tech_haste"
1165
- /* TechHaste */
1166
- ]: 21,
1167
- [
1168
- "tech_regeneration"
1169
- /* TechRegeneration */
1170
- ]: 22,
1171
- // Add missing mappings to avoid runtime lookups failing for new types
1172
- [
1173
- "tag_token"
1174
- /* TagToken */
1175
- ]: -1
1176
- };
1177
- RenderFx = /* @__PURE__ */ ((RenderFx2) => {
1178
- RenderFx2[RenderFx2["MinLight"] = 1] = "MinLight";
1179
- RenderFx2[RenderFx2["ViewerModel"] = 2] = "ViewerModel";
1180
- RenderFx2[RenderFx2["WeaponModel"] = 4] = "WeaponModel";
1181
- RenderFx2[RenderFx2["FullBright"] = 8] = "FullBright";
1182
- RenderFx2[RenderFx2["DepthHack"] = 16] = "DepthHack";
1183
- RenderFx2[RenderFx2["Translucent"] = 32] = "Translucent";
1184
- RenderFx2[RenderFx2["FrameLerp"] = 64] = "FrameLerp";
1185
- RenderFx2[RenderFx2["Beam"] = 128] = "Beam";
1186
- RenderFx2[RenderFx2["CustomLight"] = 256] = "CustomLight";
1187
- RenderFx2[RenderFx2["Glow"] = 512] = "Glow";
1188
- RenderFx2[RenderFx2["ShellRed"] = 1024] = "ShellRed";
1189
- RenderFx2[RenderFx2["ShellGreen"] = 2048] = "ShellGreen";
1190
- RenderFx2[RenderFx2["ShellBlue"] = 4096] = "ShellBlue";
1191
- RenderFx2[RenderFx2["IrVisible"] = 32768] = "IrVisible";
1192
- RenderFx2[RenderFx2["ShellDouble"] = 65536] = "ShellDouble";
1193
- RenderFx2[RenderFx2["ShellHalfDam"] = 131072] = "ShellHalfDam";
1194
- RenderFx2[RenderFx2["MinLightPlus"] = 262144] = "MinLightPlus";
1195
- RenderFx2[RenderFx2["ExtraLight"] = 524288] = "ExtraLight";
1196
- RenderFx2[RenderFx2["BeamLightning"] = 1048576] = "BeamLightning";
1197
- RenderFx2[RenderFx2["Flashlight"] = 2097152] = "Flashlight";
1198
- return RenderFx2;
1199
- })(RenderFx || {});
1200
- entityFlags_exports = {};
1201
- __export2(entityFlags_exports, {
1202
- U_ANGLE1: () => U_ANGLE1,
1203
- U_ANGLE2: () => U_ANGLE2,
1204
- U_ANGLE3: () => U_ANGLE3,
1205
- U_EFFECTS: () => U_EFFECTS,
1206
- U_EVENT: () => U_EVENT,
1207
- U_FRAME: () => U_FRAME,
1208
- U_MODEL: () => U_MODEL,
1209
- U_MODEL2: () => U_MODEL2,
1210
- U_MODEL3: () => U_MODEL3,
1211
- U_MODEL4: () => U_MODEL4,
1212
- U_MOREBITS: () => U_MOREBITS,
1213
- U_NUMBER: () => U_NUMBER,
1214
- U_ORIGIN1: () => U_ORIGIN1,
1215
- U_ORIGIN2: () => U_ORIGIN2,
1216
- U_ORIGIN3: () => U_ORIGIN3,
1217
- U_REMOVE: () => U_REMOVE,
1218
- U_RENDERFX: () => U_RENDERFX,
1219
- U_SKIN: () => U_SKIN,
1220
- U_SOLID: () => U_SOLID,
1221
- U_SOUND: () => U_SOUND
1222
- });
1223
- U_NUMBER = 1 << 0;
1224
- U_MODEL = 1 << 1;
1225
- U_SOUND = 1 << 2;
1226
- U_ORIGIN1 = 1 << 3;
1227
- U_ORIGIN2 = 1 << 4;
1228
- U_ORIGIN3 = 1 << 5;
1229
- U_ANGLE1 = 1 << 6;
1230
- U_ANGLE2 = 1 << 7;
1231
- U_ANGLE3 = 1 << 8;
1232
- U_FRAME = 1 << 9;
1233
- U_SKIN = 1 << 10;
1234
- U_EFFECTS = 1 << 11;
1235
- U_RENDERFX = 1 << 12;
1236
- U_SOLID = 1 << 13;
1237
- U_EVENT = 1 << 14;
1238
- U_MOREBITS = 1 << 15;
1239
- U_MODEL2 = 1 << 0;
1240
- U_MODEL3 = 1 << 1;
1241
- U_MODEL4 = 1 << 2;
1242
- U_REMOVE = 32768;
1243
- FRAMETIME2 = 0.025;
1244
- MASK_WATER2 = 33554432;
1245
- WaterLevel3 = {
1246
- None: 0,
1247
- Feet: 1,
1248
- Waist: 2,
1249
- Under: 3
1250
- };
1251
- categorizePosition2 = (state, trace) => {
1252
- const point = { ...state.origin };
1253
- point.z -= 0.25;
1254
- const traceResult = trace(state.origin, point);
1255
- return {
1256
- ...state,
1257
- onGround: traceResult.fraction < 1
1258
- };
1259
- };
1260
- checkWater = (state, pointContents2) => {
1261
- const point = { ...state.origin };
1262
- const { mins, maxs } = state;
1263
- point.z = state.origin.z + mins.z + 1;
1264
- const contents = pointContents2(point);
1265
- if (!(contents & MASK_WATER2)) {
1266
- return { ...state, waterLevel: WaterLevel3.None };
1267
- }
1268
- let waterLevel = WaterLevel3.Feet;
1269
- const waist = state.origin.z + (mins.z + maxs.z) * 0.5;
1270
- point.z = waist;
1271
- const waistContents = pointContents2(point);
1272
- if (waistContents & MASK_WATER2) {
1273
- waterLevel = WaterLevel3.Waist;
1274
- const head = state.origin.z + 22;
1275
- point.z = head;
1276
- const headContents = pointContents2(point);
1277
- if (headContents & MASK_WATER2) {
1278
- waterLevel = WaterLevel3.Under;
1279
- }
1280
- }
1281
- return { ...state, waterLevel };
1282
- };
1283
- applyPmove = (state, cmd, trace, pointContents2) => {
1284
- let newState = { ...state };
1285
- newState = categorizePosition2(newState, trace);
1286
- newState = checkWater(newState, pointContents2);
1287
- const { origin, velocity, onGround, waterLevel, viewAngles } = newState;
1288
- const adjustedAngles = waterLevel >= 2 ? viewAngles : {
1289
- // For ground/air movement, reduce pitch influence (rerelease/p_move.cpp:1689)
1290
- x: viewAngles.x > 180 ? (viewAngles.x - 360) / 3 : viewAngles.x / 3,
1291
- y: viewAngles.y,
1292
- z: viewAngles.z
1293
- };
1294
- const { forward, right } = angleVectors(adjustedAngles);
1295
- const frictionedVelocity = applyPmoveFriction({
1296
- velocity,
1297
- frametime: FRAMETIME2,
1298
- onGround,
1299
- groundIsSlick: false,
1300
- onLadder: false,
1301
- waterlevel: waterLevel,
1302
- pmFriction: 6,
1303
- pmStopSpeed: 100,
1304
- pmWaterFriction: 1
1305
- });
1306
- const wish = waterLevel >= 2 ? buildWaterWish({
1307
- forward,
1308
- right,
1309
- cmd,
1310
- maxSpeed: 320
1311
- }) : buildAirGroundWish({
1312
- forward,
1313
- right,
1314
- cmd,
1315
- maxSpeed: 320
1316
- });
1317
- const finalVelocity = applyPmoveAccelerate({
1318
- velocity: frictionedVelocity,
1319
- wishdir: wish.wishdir,
1320
- wishspeed: wish.wishspeed,
1321
- // Water movement uses ground acceleration (10), not air acceleration (1)
1322
- accel: onGround || waterLevel >= 2 ? 10 : 1,
1323
- frametime: FRAMETIME2
1324
- });
1325
- const traceResult = trace(origin, {
1326
- x: origin.x + finalVelocity.x * FRAMETIME2,
1327
- y: origin.y + finalVelocity.y * FRAMETIME2,
1328
- z: origin.z + finalVelocity.z * FRAMETIME2
1329
- });
1330
- return {
1331
- ...newState,
1332
- origin: traceResult.endpos,
1333
- velocity: finalVelocity
1334
- };
1335
- };
1336
- BinaryWriter = class {
1337
- constructor(sizeOrBuffer = 1400) {
1338
- if (typeof sizeOrBuffer === "number") {
1339
- this.buffer = new Uint8Array(sizeOrBuffer);
1340
- this.fixed = false;
1341
- } else {
1342
- this.buffer = sizeOrBuffer;
1343
- this.fixed = true;
1344
- }
1345
- this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);
1346
- this.offset = 0;
1347
- }
1348
- ensureSpace(bytes) {
1349
- if (this.offset + bytes > this.buffer.byteLength) {
1350
- if (this.fixed) {
1351
- throw new Error(`Buffer overflow: capacity ${this.buffer.byteLength}, needed ${this.offset + bytes}`);
1352
- }
1353
- const newSize = Math.max(this.buffer.byteLength * 2, this.offset + bytes);
1354
- const newBuffer = new Uint8Array(newSize);
1355
- newBuffer.set(this.buffer);
1356
- this.buffer = newBuffer;
1357
- this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);
1358
- }
1359
- }
1360
- writeByte(value) {
1361
- this.ensureSpace(1);
1362
- this.view.setUint8(this.offset, value);
1363
- this.offset += 1;
1364
- }
1365
- writeChar(value) {
1366
- this.ensureSpace(1);
1367
- this.view.setInt8(this.offset, value);
1368
- this.offset += 1;
1369
- }
1370
- writeShort(value) {
1371
- this.ensureSpace(2);
1372
- this.view.setInt16(this.offset, value, true);
1373
- this.offset += 2;
1374
- }
1375
- writeLong(value) {
1376
- this.ensureSpace(4);
1377
- this.view.setInt32(this.offset, value, true);
1378
- this.offset += 4;
1379
- }
1380
- writeFloat(value) {
1381
- this.ensureSpace(4);
1382
- this.view.setFloat32(this.offset, value, true);
1383
- this.offset += 4;
1384
- }
1385
- writeString(value) {
1386
- const len = value.length;
1387
- this.ensureSpace(len + 1);
1388
- for (let i = 0; i < len; i++) {
1389
- this.view.setUint8(this.offset + i, value.charCodeAt(i));
1390
- }
1391
- this.view.setUint8(this.offset + len, 0);
1392
- this.offset += len + 1;
1393
- }
1394
- writeCoord(value) {
1395
- this.writeShort(Math.trunc(value * 8));
1396
- }
1397
- writeAngle(value) {
1398
- this.writeByte(Math.trunc(value * 256 / 360) & 255);
1399
- }
1400
- writeAngle16(value) {
1401
- this.writeShort(Math.trunc(value * 65536 / 360) & 65535);
1402
- }
1403
- writePos(pos) {
1404
- this.writeCoord(pos.x);
1405
- this.writeCoord(pos.y);
1406
- this.writeCoord(pos.z);
1407
- }
1408
- writeDir(dir) {
1409
- let maxDot = -1;
1410
- let bestIndex = 0;
1411
- if (dir.x === 0 && dir.y === 0 && dir.z === 0) {
1412
- this.writeByte(0);
1413
- return;
1414
- }
1415
- for (let i = 0; i < ANORMS.length; i++) {
1416
- const norm = ANORMS[i];
1417
- const dot = dir.x * norm[0] + dir.y * norm[1] + dir.z * norm[2];
1418
- if (dot > maxDot) {
1419
- maxDot = dot;
1420
- bestIndex = i;
1421
- }
1422
- }
1423
- this.writeByte(bestIndex);
1424
- }
1425
- getData() {
1426
- return this.buffer.slice(0, this.offset);
1427
- }
1428
- getBuffer() {
1429
- return this.buffer;
1430
- }
1431
- getOffset() {
1432
- return this.offset;
1433
- }
1434
- reset() {
1435
- this.offset = 0;
1436
- }
1437
- };
1438
- _NetChan = class _NetChan2 {
1439
- constructor() {
1440
- this.qport = 0;
1441
- this.incomingSequence = 0;
1442
- this.outgoingSequence = 0;
1443
- this.incomingAcknowledged = 0;
1444
- this.incomingReliableAcknowledged = false;
1445
- this.incomingReliableSequence = 0;
1446
- this.outgoingReliableSequence = 0;
1447
- this.reliableLength = 0;
1448
- this.fragmentSendOffset = 0;
1449
- this.fragmentBuffer = null;
1450
- this.fragmentLength = 0;
1451
- this.fragmentReceived = 0;
1452
- this.lastReceived = 0;
1453
- this.lastSent = 0;
1454
- this.remoteAddress = null;
1455
- this.reliableMessage = new BinaryWriter(_NetChan2.MAX_RELIABLE_BUFFER);
1456
- const now = Date.now();
1457
- this.lastReceived = now;
1458
- this.lastSent = now;
1459
- this.qport = Math.floor(Math.random() * 65536);
1460
- }
1461
- /**
1462
- * Setup the netchan with specific settings
1463
- */
1464
- setup(qport, address = null) {
1465
- this.qport = qport;
1466
- this.remoteAddress = address;
1467
- this.reset();
1468
- }
1469
- /**
1470
- * Reset the netchan state
1471
- */
1472
- reset() {
1473
- this.incomingSequence = 0;
1474
- this.outgoingSequence = 0;
1475
- this.incomingAcknowledged = 0;
1476
- this.incomingReliableAcknowledged = false;
1477
- this.incomingReliableSequence = 0;
1478
- this.outgoingReliableSequence = 0;
1479
- this.reliableLength = 0;
1480
- this.reliableMessage.reset();
1481
- this.fragmentSendOffset = 0;
1482
- this.fragmentBuffer = null;
1483
- this.fragmentLength = 0;
1484
- this.fragmentReceived = 0;
1485
- this.lastReceived = Date.now();
1486
- this.lastSent = Date.now();
1487
- }
1488
- /**
1489
- * Transmits a packet containing reliable and unreliable data
1490
- */
1491
- transmit(unreliableData) {
1492
- this.outgoingSequence++;
1493
- this.lastSent = Date.now();
1494
- let sendReliableLength = 0;
1495
- let isFragment = false;
1496
- let fragmentStart = 0;
1497
- if (this.reliableLength > 0) {
1498
- if (this.reliableLength > _NetChan2.FRAGMENT_SIZE) {
1499
- isFragment = true;
1500
- if (this.fragmentSendOffset >= this.reliableLength) {
1501
- this.fragmentSendOffset = 0;
1502
- }
1503
- const remaining = this.reliableLength - this.fragmentSendOffset;
1504
- sendReliableLength = remaining;
1505
- if (sendReliableLength > _NetChan2.FRAGMENT_SIZE) {
1506
- sendReliableLength = _NetChan2.FRAGMENT_SIZE;
1507
- }
1508
- fragmentStart = this.fragmentSendOffset;
1509
- this.fragmentSendOffset += sendReliableLength;
1510
- } else {
1511
- sendReliableLength = this.reliableLength;
1512
- }
1513
- }
1514
- const headerSize = _NetChan2.PACKET_HEADER;
1515
- const reliableHeaderSize = sendReliableLength > 0 ? 2 + (isFragment ? 8 : 0) : 0;
1516
- let unreliableSize = unreliableData ? unreliableData.length : 0;
1517
- if (headerSize + reliableHeaderSize + sendReliableLength + unreliableSize > _NetChan2.MAX_MSGLEN) {
1518
- unreliableSize = _NetChan2.MAX_MSGLEN - headerSize - reliableHeaderSize - sendReliableLength;
1519
- if (unreliableSize < 0) unreliableSize = 0;
1520
- }
1521
- const buffer = new ArrayBuffer(headerSize + reliableHeaderSize + sendReliableLength + unreliableSize);
1522
- const view = new DataView(buffer);
1523
- const result = new Uint8Array(buffer);
1524
- let sequence = this.outgoingSequence;
1525
- if (sendReliableLength > 0) {
1526
- sequence |= 2147483648;
1527
- if ((this.outgoingReliableSequence & 1) !== 0) {
1528
- sequence |= 1073741824;
1529
- }
1530
- }
1531
- view.setUint32(0, sequence, true);
1532
- let ack = this.incomingSequence;
1533
- if ((this.incomingReliableSequence & 1) !== 0) {
1534
- ack |= 2147483648;
1535
- }
1536
- view.setUint32(4, ack, true);
1537
- view.setUint16(8, this.qport, true);
1538
- let offset = headerSize;
1539
- if (sendReliableLength > 0) {
1540
- let lengthField = sendReliableLength;
1541
- if (isFragment) {
1542
- lengthField |= 32768;
1543
- }
1544
- view.setUint16(offset, lengthField, true);
1545
- offset += 2;
1546
- if (isFragment) {
1547
- view.setUint32(offset, fragmentStart, true);
1548
- offset += 4;
1549
- view.setUint32(offset, this.reliableLength, true);
1550
- offset += 4;
1551
- }
1552
- const reliableBuffer = this.reliableMessage.getBuffer();
1553
- const reliableBytes = reliableBuffer.subarray(fragmentStart, fragmentStart + sendReliableLength);
1554
- result.set(reliableBytes, offset);
1555
- offset += sendReliableLength;
1556
- }
1557
- if (unreliableData && unreliableSize > 0) {
1558
- const chunk = unreliableData.slice(0, unreliableSize);
1559
- result.set(chunk, offset);
1560
- }
1561
- return result;
1562
- }
1563
- /**
1564
- * Processes a received packet
1565
- * Returns the payload data (reliable + unreliable) to be processed, or null if discarded
1566
- */
1567
- process(packet) {
1568
- if (packet.length < _NetChan2.PACKET_HEADER) {
1569
- return null;
1570
- }
1571
- this.lastReceived = Date.now();
1572
- const view = new DataView(packet.buffer, packet.byteOffset, packet.byteLength);
1573
- const sequence = view.getUint32(0, true);
1574
- const ack = view.getUint32(4, true);
1575
- const qport = view.getUint16(8, true);
1576
- if (this.qport !== qport) {
1577
- return null;
1578
- }
1579
- const seqNumberClean = sequence & ~(2147483648 | 1073741824);
1580
- if ((seqNumberClean - this.incomingSequence | 0) <= 0) {
1581
- return null;
1582
- }
1583
- this.incomingSequence = seqNumberClean;
1584
- const ackNumber = ack & ~2147483648;
1585
- const ackReliable = (ack & 2147483648) !== 0;
1586
- if (ackNumber > this.incomingAcknowledged) {
1587
- this.incomingAcknowledged = ackNumber;
1588
- }
1589
- if (this.reliableLength > 0) {
1590
- const receivedAckBit = ackReliable ? 1 : 0;
1591
- const currentReliableBit = this.outgoingReliableSequence & 1;
1592
- if (receivedAckBit !== currentReliableBit) {
1593
- this.reliableLength = 0;
1594
- this.reliableMessage.reset();
1595
- this.outgoingReliableSequence ^= 1;
1596
- this.fragmentSendOffset = 0;
1597
- }
1598
- }
1599
- const hasReliableData = (sequence & 2147483648) !== 0;
1600
- const reliableSeqBit = (sequence & 1073741824) !== 0 ? 1 : 0;
1601
- let payloadOffset = _NetChan2.PACKET_HEADER;
1602
- let reliableData = null;
1603
- if (hasReliableData) {
1604
- if (payloadOffset + 2 > packet.byteLength) return null;
1605
- let reliableLen = view.getUint16(payloadOffset, true);
1606
- payloadOffset += 2;
1607
- const isFragment = (reliableLen & 32768) !== 0;
1608
- reliableLen &= 32767;
1609
- const expectedBit = this.incomingReliableSequence & 1;
1610
- if (reliableSeqBit === expectedBit) {
1611
- if (isFragment) {
1612
- if (payloadOffset + 8 > packet.byteLength) return null;
1613
- const fragStart = view.getUint32(payloadOffset, true);
1614
- payloadOffset += 4;
1615
- const fragTotal = view.getUint32(payloadOffset, true);
1616
- payloadOffset += 4;
1617
- if (fragTotal > _NetChan2.MAX_RELIABLE_BUFFER) {
1618
- console.warn(`NetChan: received invalid fragment total ${fragTotal} > ${_NetChan2.MAX_RELIABLE_BUFFER}`);
1619
- return null;
1620
- }
1621
- if (!this.fragmentBuffer || this.fragmentBuffer.length !== fragTotal) {
1622
- this.fragmentBuffer = new Uint8Array(fragTotal);
1623
- this.fragmentLength = fragTotal;
1624
- this.fragmentReceived = 0;
1625
- }
1626
- if (payloadOffset + reliableLen > packet.byteLength) return null;
1627
- const data = packet.subarray(payloadOffset, payloadOffset + reliableLen);
1628
- if (fragStart === this.fragmentReceived && fragStart + reliableLen <= fragTotal) {
1629
- this.fragmentBuffer.set(data, fragStart);
1630
- this.fragmentReceived += reliableLen;
1631
- if (this.fragmentReceived >= fragTotal) {
1632
- reliableData = this.fragmentBuffer;
1633
- this.incomingReliableSequence++;
1634
- this.fragmentBuffer = null;
1635
- this.fragmentLength = 0;
1636
- this.fragmentReceived = 0;
1637
- }
1638
- }
1639
- } else {
1640
- this.incomingReliableSequence++;
1641
- if (payloadOffset + reliableLen > packet.byteLength) return null;
1642
- reliableData = packet.slice(payloadOffset, payloadOffset + reliableLen);
1643
- }
1644
- }
1645
- payloadOffset += reliableLen;
1646
- }
1647
- const unreliableData = packet.slice(payloadOffset);
1648
- if (reliableData && reliableData.length > 0) {
1649
- const totalLen = reliableData.length + unreliableData.length;
1650
- const result = new Uint8Array(totalLen);
1651
- result.set(reliableData, 0);
1652
- result.set(unreliableData, reliableData.length);
1653
- return result;
1654
- }
1655
- if (unreliableData) {
1656
- return unreliableData;
1657
- }
1658
- return new Uint8Array(0);
1659
- }
1660
- /**
1661
- * Checks if reliable message buffer is empty and ready for new data
1662
- */
1663
- canSendReliable() {
1664
- return this.reliableLength === 0;
1665
- }
1666
- /**
1667
- * Writes a byte to the reliable message buffer
1668
- */
1669
- writeReliableByte(value) {
1670
- if (this.reliableLength + 1 > _NetChan2.MAX_RELIABLE_BUFFER) {
1671
- throw new Error("NetChan reliable buffer overflow");
1672
- }
1673
- this.reliableMessage.writeByte(value);
1674
- this.reliableLength++;
1675
- }
1676
- /**
1677
- * Writes a short to the reliable message buffer
1678
- */
1679
- writeReliableShort(value) {
1680
- if (this.reliableLength + 2 > _NetChan2.MAX_RELIABLE_BUFFER) {
1681
- throw new Error("NetChan reliable buffer overflow");
1682
- }
1683
- this.reliableMessage.writeShort(value);
1684
- this.reliableLength += 2;
1685
- }
1686
- /**
1687
- * Writes a long to the reliable message buffer
1688
- */
1689
- writeReliableLong(value) {
1690
- if (this.reliableLength + 4 > _NetChan2.MAX_RELIABLE_BUFFER) {
1691
- throw new Error("NetChan reliable buffer overflow");
1692
- }
1693
- this.reliableMessage.writeLong(value);
1694
- this.reliableLength += 4;
1695
- }
1696
- /**
1697
- * Writes a string to the reliable message buffer
1698
- */
1699
- writeReliableString(value) {
1700
- const len = value.length + 1;
1701
- if (this.reliableLength + len > _NetChan2.MAX_RELIABLE_BUFFER) {
1702
- throw new Error("NetChan reliable buffer overflow");
1703
- }
1704
- this.reliableMessage.writeString(value);
1705
- this.reliableLength += len;
1706
- }
1707
- /**
1708
- * Returns the current reliable data buffer
1709
- */
1710
- getReliableData() {
1711
- if (this.reliableLength === 0) {
1712
- return new Uint8Array(0);
1713
- }
1714
- const buffer = this.reliableMessage.getBuffer();
1715
- return buffer.subarray(0, this.reliableLength);
1716
- }
1717
- /**
1718
- * Checks if we need to send a keepalive packet
1719
- */
1720
- needsKeepalive(currentTime) {
1721
- return currentTime - this.lastSent > 1e3;
1722
- }
1723
- /**
1724
- * Checks if the connection has timed out
1725
- */
1726
- isTimedOut(currentTime, timeoutMs = 3e4) {
1727
- return currentTime - this.lastReceived > timeoutMs;
1728
- }
1729
- };
1730
- _NetChan.MAX_MSGLEN = 1400;
1731
- _NetChan.FRAGMENT_SIZE = 1024;
1732
- _NetChan.PACKET_HEADER = 10;
1733
- _NetChan.HEADER_OVERHEAD = _NetChan.PACKET_HEADER + 2;
1734
- _NetChan.MAX_RELIABLE_BUFFER = 262144;
1735
- WeaponId = /* @__PURE__ */ ((WeaponId22) => {
1736
- WeaponId22["Blaster"] = "blaster";
1737
- WeaponId22["Shotgun"] = "shotgun";
1738
- WeaponId22["SuperShotgun"] = "supershotgun";
1739
- WeaponId22["Machinegun"] = "machinegun";
1740
- WeaponId22["Chaingun"] = "chaingun";
1741
- WeaponId22["HandGrenade"] = "grenades";
1742
- WeaponId22["GrenadeLauncher"] = "grenadelauncher";
1743
- WeaponId22["RocketLauncher"] = "rocketlauncher";
1744
- WeaponId22["HyperBlaster"] = "hyperblaster";
1745
- WeaponId22["Railgun"] = "railgun";
1746
- WeaponId22["BFG10K"] = "bfg10k";
1747
- WeaponId22["Grapple"] = "grapple";
1748
- WeaponId22["ChainFist"] = "chainfist";
1749
- WeaponId22["EtfRifle"] = "etf_rifle";
1750
- WeaponId22["ProxLauncher"] = "prox_launcher";
1751
- WeaponId22["IonRipper"] = "ionripper";
1752
- WeaponId22["PlasmaBeam"] = "plasmabeam";
1753
- WeaponId22["Phalanx"] = "phalanx";
1754
- WeaponId22["Disruptor"] = "disruptor";
1755
- WeaponId22["Trap"] = "trap";
1756
- return WeaponId22;
1757
- })(WeaponId || {});
1758
- AmmoType = /* @__PURE__ */ ((AmmoType22) => {
1759
- AmmoType22[AmmoType22["Bullets"] = 0] = "Bullets";
1760
- AmmoType22[AmmoType22["Shells"] = 1] = "Shells";
1761
- AmmoType22[AmmoType22["Rockets"] = 2] = "Rockets";
1762
- AmmoType22[AmmoType22["Grenades"] = 3] = "Grenades";
1763
- AmmoType22[AmmoType22["Cells"] = 4] = "Cells";
1764
- AmmoType22[AmmoType22["Slugs"] = 5] = "Slugs";
1765
- AmmoType22[AmmoType22["MagSlugs"] = 6] = "MagSlugs";
1766
- AmmoType22[AmmoType22["Trap"] = 7] = "Trap";
1767
- AmmoType22[AmmoType22["Flechettes"] = 8] = "Flechettes";
1768
- AmmoType22[AmmoType22["Tesla"] = 9] = "Tesla";
1769
- AmmoType22[AmmoType22["Disruptor"] = 10] = "Disruptor";
1770
- AmmoType22[AmmoType22["Prox"] = 11] = "Prox";
1771
- AmmoType22[AmmoType22["Nuke"] = 12] = "Nuke";
1772
- AmmoType22[AmmoType22["Rounds"] = 13] = "Rounds";
1773
- return AmmoType22;
1774
- })(AmmoType || {});
1775
- AMMO_TYPE_COUNT = Object.keys(AmmoType).length / 2;
1776
- AmmoItemId = /* @__PURE__ */ ((AmmoItemId2) => {
1777
- AmmoItemId2["Shells"] = "ammo_shells";
1778
- AmmoItemId2["Bullets"] = "ammo_bullets";
1779
- AmmoItemId2["Rockets"] = "ammo_rockets";
1780
- AmmoItemId2["Grenades"] = "ammo_grenades";
1781
- AmmoItemId2["Cells"] = "ammo_cells";
1782
- AmmoItemId2["Slugs"] = "ammo_slugs";
1783
- AmmoItemId2["MagSlugs"] = "ammo_magslug";
1784
- AmmoItemId2["Flechettes"] = "ammo_flechettes";
1785
- AmmoItemId2["Disruptor"] = "ammo_disruptor";
1786
- AmmoItemId2["Tesla"] = "ammo_tesla";
1787
- AmmoItemId2["Trap"] = "ammo_trap";
1788
- AmmoItemId2["Prox"] = "ammo_prox";
1789
- return AmmoItemId2;
1790
- })(AmmoItemId || {});
1791
- WEAPON_WHEEL_ORDER = [
1792
- "blaster",
1793
- "shotgun",
1794
- "supershotgun",
1795
- "machinegun",
1796
- "chaingun",
1797
- "grenadelauncher",
1798
- "rocketlauncher",
1799
- "grenades",
1800
- "hyperblaster",
1801
- "railgun",
1802
- "bfg10k"
1803
- /* BFG10K */
1804
- ];
1805
- SoundChannel = /* @__PURE__ */ ((SoundChannel2) => {
1806
- SoundChannel2[SoundChannel2["Auto"] = 0] = "Auto";
1807
- SoundChannel2[SoundChannel2["Weapon"] = 1] = "Weapon";
1808
- SoundChannel2[SoundChannel2["Voice"] = 2] = "Voice";
1809
- SoundChannel2[SoundChannel2["Item"] = 3] = "Item";
1810
- SoundChannel2[SoundChannel2["Body"] = 4] = "Body";
1811
- SoundChannel2[SoundChannel2["Aux"] = 5] = "Aux";
1812
- SoundChannel2[SoundChannel2["Footstep"] = 6] = "Footstep";
1813
- SoundChannel2[SoundChannel2["Aux3"] = 7] = "Aux3";
1814
- SoundChannel2[SoundChannel2["NoPhsAdd"] = 8] = "NoPhsAdd";
1815
- SoundChannel2[SoundChannel2["Reliable"] = 16] = "Reliable";
1816
- SoundChannel2[SoundChannel2["ForcePos"] = 32] = "ForcePos";
1817
- return SoundChannel2;
1818
- })(SoundChannel || {});
1819
- ATTN_NORM = 1;
1820
- ATTN_IDLE = 2;
1821
- }
1822
- });
1818
+ payloadOffset += reliableLen;
1819
+ }
1820
+ const unreliableData = packet.slice(payloadOffset);
1821
+ if (reliableData && reliableData.length > 0) {
1822
+ const totalLen = reliableData.length + unreliableData.length;
1823
+ const result = new Uint8Array(totalLen);
1824
+ result.set(reliableData, 0);
1825
+ result.set(unreliableData, reliableData.length);
1826
+ return result;
1827
+ }
1828
+ if (unreliableData) {
1829
+ return unreliableData;
1830
+ }
1831
+ return new Uint8Array(0);
1832
+ }
1833
+ /**
1834
+ * Checks if reliable message buffer is empty and ready for new data
1835
+ */
1836
+ canSendReliable() {
1837
+ return this.reliableLength === 0;
1838
+ }
1839
+ /**
1840
+ * Writes a byte to the reliable message buffer
1841
+ */
1842
+ writeReliableByte(value) {
1843
+ if (this.reliableLength + 1 > _NetChan2.MAX_RELIABLE_BUFFER) {
1844
+ throw new Error("NetChan reliable buffer overflow");
1845
+ }
1846
+ this.reliableMessage.writeByte(value);
1847
+ this.reliableLength++;
1848
+ }
1849
+ /**
1850
+ * Writes a short to the reliable message buffer
1851
+ */
1852
+ writeReliableShort(value) {
1853
+ if (this.reliableLength + 2 > _NetChan2.MAX_RELIABLE_BUFFER) {
1854
+ throw new Error("NetChan reliable buffer overflow");
1855
+ }
1856
+ this.reliableMessage.writeShort(value);
1857
+ this.reliableLength += 2;
1858
+ }
1859
+ /**
1860
+ * Writes a long to the reliable message buffer
1861
+ */
1862
+ writeReliableLong(value) {
1863
+ if (this.reliableLength + 4 > _NetChan2.MAX_RELIABLE_BUFFER) {
1864
+ throw new Error("NetChan reliable buffer overflow");
1865
+ }
1866
+ this.reliableMessage.writeLong(value);
1867
+ this.reliableLength += 4;
1868
+ }
1869
+ /**
1870
+ * Writes a string to the reliable message buffer
1871
+ */
1872
+ writeReliableString(value) {
1873
+ const len = value.length + 1;
1874
+ if (this.reliableLength + len > _NetChan2.MAX_RELIABLE_BUFFER) {
1875
+ throw new Error("NetChan reliable buffer overflow");
1876
+ }
1877
+ this.reliableMessage.writeString(value);
1878
+ this.reliableLength += len;
1879
+ }
1880
+ /**
1881
+ * Returns the current reliable data buffer
1882
+ */
1883
+ getReliableData() {
1884
+ if (this.reliableLength === 0) {
1885
+ return new Uint8Array(0);
1886
+ }
1887
+ const buffer = this.reliableMessage.getBuffer();
1888
+ return buffer.subarray(0, this.reliableLength);
1889
+ }
1890
+ /**
1891
+ * Checks if we need to send a keepalive packet
1892
+ */
1893
+ needsKeepalive(currentTime) {
1894
+ return currentTime - this.lastSent > 1e3;
1895
+ }
1896
+ /**
1897
+ * Checks if the connection has timed out
1898
+ */
1899
+ isTimedOut(currentTime, timeoutMs = 3e4) {
1900
+ return currentTime - this.lastReceived > timeoutMs;
1901
+ }
1902
+ };
1903
+ _NetChan.MAX_MSGLEN = 1400;
1904
+ _NetChan.FRAGMENT_SIZE = 1024;
1905
+ _NetChan.PACKET_HEADER = 10;
1906
+ _NetChan.HEADER_OVERHEAD = _NetChan.PACKET_HEADER + 2;
1907
+ _NetChan.MAX_RELIABLE_BUFFER = 262144;
1908
+ var WeaponId = /* @__PURE__ */ ((WeaponId22) => {
1909
+ WeaponId22["Blaster"] = "blaster";
1910
+ WeaponId22["Shotgun"] = "shotgun";
1911
+ WeaponId22["SuperShotgun"] = "supershotgun";
1912
+ WeaponId22["Machinegun"] = "machinegun";
1913
+ WeaponId22["Chaingun"] = "chaingun";
1914
+ WeaponId22["HandGrenade"] = "grenades";
1915
+ WeaponId22["GrenadeLauncher"] = "grenadelauncher";
1916
+ WeaponId22["RocketLauncher"] = "rocketlauncher";
1917
+ WeaponId22["HyperBlaster"] = "hyperblaster";
1918
+ WeaponId22["Railgun"] = "railgun";
1919
+ WeaponId22["BFG10K"] = "bfg10k";
1920
+ WeaponId22["Grapple"] = "grapple";
1921
+ WeaponId22["ChainFist"] = "chainfist";
1922
+ WeaponId22["EtfRifle"] = "etf_rifle";
1923
+ WeaponId22["ProxLauncher"] = "prox_launcher";
1924
+ WeaponId22["IonRipper"] = "ionripper";
1925
+ WeaponId22["PlasmaBeam"] = "plasmabeam";
1926
+ WeaponId22["Phalanx"] = "phalanx";
1927
+ WeaponId22["Disruptor"] = "disruptor";
1928
+ WeaponId22["Trap"] = "trap";
1929
+ return WeaponId22;
1930
+ })(WeaponId || {});
1931
+ var AmmoType = /* @__PURE__ */ ((AmmoType22) => {
1932
+ AmmoType22[AmmoType22["Bullets"] = 0] = "Bullets";
1933
+ AmmoType22[AmmoType22["Shells"] = 1] = "Shells";
1934
+ AmmoType22[AmmoType22["Rockets"] = 2] = "Rockets";
1935
+ AmmoType22[AmmoType22["Grenades"] = 3] = "Grenades";
1936
+ AmmoType22[AmmoType22["Cells"] = 4] = "Cells";
1937
+ AmmoType22[AmmoType22["Slugs"] = 5] = "Slugs";
1938
+ AmmoType22[AmmoType22["MagSlugs"] = 6] = "MagSlugs";
1939
+ AmmoType22[AmmoType22["Trap"] = 7] = "Trap";
1940
+ AmmoType22[AmmoType22["Flechettes"] = 8] = "Flechettes";
1941
+ AmmoType22[AmmoType22["Tesla"] = 9] = "Tesla";
1942
+ AmmoType22[AmmoType22["Disruptor"] = 10] = "Disruptor";
1943
+ AmmoType22[AmmoType22["Prox"] = 11] = "Prox";
1944
+ AmmoType22[AmmoType22["Nuke"] = 12] = "Nuke";
1945
+ AmmoType22[AmmoType22["Rounds"] = 13] = "Rounds";
1946
+ return AmmoType22;
1947
+ })(AmmoType || {});
1948
+ var AMMO_TYPE_COUNT = Object.keys(AmmoType).length / 2;
1949
+ var AmmoItemId = /* @__PURE__ */ ((AmmoItemId2) => {
1950
+ AmmoItemId2["Shells"] = "ammo_shells";
1951
+ AmmoItemId2["Bullets"] = "ammo_bullets";
1952
+ AmmoItemId2["Rockets"] = "ammo_rockets";
1953
+ AmmoItemId2["Grenades"] = "ammo_grenades";
1954
+ AmmoItemId2["Cells"] = "ammo_cells";
1955
+ AmmoItemId2["Slugs"] = "ammo_slugs";
1956
+ AmmoItemId2["MagSlugs"] = "ammo_magslug";
1957
+ AmmoItemId2["Flechettes"] = "ammo_flechettes";
1958
+ AmmoItemId2["Disruptor"] = "ammo_disruptor";
1959
+ AmmoItemId2["Tesla"] = "ammo_tesla";
1960
+ AmmoItemId2["Trap"] = "ammo_trap";
1961
+ AmmoItemId2["Prox"] = "ammo_prox";
1962
+ return AmmoItemId2;
1963
+ })(AmmoItemId || {});
1964
+ var WEAPON_WHEEL_ORDER = [
1965
+ "blaster",
1966
+ "shotgun",
1967
+ "supershotgun",
1968
+ "machinegun",
1969
+ "chaingun",
1970
+ "grenadelauncher",
1971
+ "rocketlauncher",
1972
+ "grenades",
1973
+ "hyperblaster",
1974
+ "railgun",
1975
+ "bfg10k"
1976
+ /* BFG10K */
1977
+ ];
1978
+ var SoundChannel = /* @__PURE__ */ ((SoundChannel2) => {
1979
+ SoundChannel2[SoundChannel2["Auto"] = 0] = "Auto";
1980
+ SoundChannel2[SoundChannel2["Weapon"] = 1] = "Weapon";
1981
+ SoundChannel2[SoundChannel2["Voice"] = 2] = "Voice";
1982
+ SoundChannel2[SoundChannel2["Item"] = 3] = "Item";
1983
+ SoundChannel2[SoundChannel2["Body"] = 4] = "Body";
1984
+ SoundChannel2[SoundChannel2["Aux"] = 5] = "Aux";
1985
+ SoundChannel2[SoundChannel2["Footstep"] = 6] = "Footstep";
1986
+ SoundChannel2[SoundChannel2["Aux3"] = 7] = "Aux3";
1987
+ SoundChannel2[SoundChannel2["NoPhsAdd"] = 8] = "NoPhsAdd";
1988
+ SoundChannel2[SoundChannel2["Reliable"] = 16] = "Reliable";
1989
+ SoundChannel2[SoundChannel2["ForcePos"] = 32] = "ForcePos";
1990
+ return SoundChannel2;
1991
+ })(SoundChannel || {});
1992
+ var ATTN_NORM = 1;
1993
+ var ATTN_IDLE = 2;
1823
1994
 
1824
1995
  // src/inventory/ammo.ts
1996
+ var AMMO_ITEM_DEFINITIONS = {
1997
+ [AmmoItemId.Shells]: { id: AmmoItemId.Shells, ammoType: AmmoType.Shells, quantity: 10, weaponAmmo: false },
1998
+ [AmmoItemId.Bullets]: { id: AmmoItemId.Bullets, ammoType: AmmoType.Bullets, quantity: 50, weaponAmmo: false },
1999
+ [AmmoItemId.Rockets]: { id: AmmoItemId.Rockets, ammoType: AmmoType.Rockets, quantity: 5, weaponAmmo: false },
2000
+ [AmmoItemId.Grenades]: { id: AmmoItemId.Grenades, ammoType: AmmoType.Grenades, quantity: 5, weaponAmmo: true },
2001
+ [AmmoItemId.Cells]: { id: AmmoItemId.Cells, ammoType: AmmoType.Cells, quantity: 50, weaponAmmo: false },
2002
+ [AmmoItemId.Slugs]: { id: AmmoItemId.Slugs, ammoType: AmmoType.Slugs, quantity: 10, weaponAmmo: false },
2003
+ [AmmoItemId.MagSlugs]: { id: AmmoItemId.MagSlugs, ammoType: AmmoType.MagSlugs, quantity: 10, weaponAmmo: false },
2004
+ [AmmoItemId.Flechettes]: { id: AmmoItemId.Flechettes, ammoType: AmmoType.Flechettes, quantity: 50, weaponAmmo: false },
2005
+ [AmmoItemId.Disruptor]: { id: AmmoItemId.Disruptor, ammoType: AmmoType.Disruptor, quantity: 15, weaponAmmo: false },
2006
+ [AmmoItemId.Tesla]: { id: AmmoItemId.Tesla, ammoType: AmmoType.Tesla, quantity: 5, weaponAmmo: false },
2007
+ [AmmoItemId.Trap]: { id: AmmoItemId.Trap, ammoType: AmmoType.Trap, quantity: 5, weaponAmmo: false },
2008
+ [AmmoItemId.Prox]: { id: AmmoItemId.Prox, ammoType: AmmoType.Prox, quantity: 5, weaponAmmo: false }
2009
+ };
1825
2010
  function getAmmoItemDefinition(id) {
1826
2011
  return AMMO_ITEM_DEFINITIONS[id];
1827
2012
  }
@@ -1875,55 +2060,54 @@ function pickupAmmo(inventory, itemId, options = {}) {
1875
2060
  const amount = options.countOverride ?? def.quantity;
1876
2061
  return addAmmo(inventory, def.ammoType, amount);
1877
2062
  }
1878
- var AMMO_ITEM_DEFINITIONS;
1879
- var init_ammo = __esm({
1880
- "src/inventory/ammo.ts"() {
1881
- "use strict";
1882
- init_esm();
1883
- AMMO_ITEM_DEFINITIONS = {
1884
- [AmmoItemId.Shells]: { id: AmmoItemId.Shells, ammoType: AmmoType.Shells, quantity: 10, weaponAmmo: false },
1885
- [AmmoItemId.Bullets]: { id: AmmoItemId.Bullets, ammoType: AmmoType.Bullets, quantity: 50, weaponAmmo: false },
1886
- [AmmoItemId.Rockets]: { id: AmmoItemId.Rockets, ammoType: AmmoType.Rockets, quantity: 5, weaponAmmo: false },
1887
- [AmmoItemId.Grenades]: { id: AmmoItemId.Grenades, ammoType: AmmoType.Grenades, quantity: 5, weaponAmmo: true },
1888
- [AmmoItemId.Cells]: { id: AmmoItemId.Cells, ammoType: AmmoType.Cells, quantity: 50, weaponAmmo: false },
1889
- [AmmoItemId.Slugs]: { id: AmmoItemId.Slugs, ammoType: AmmoType.Slugs, quantity: 10, weaponAmmo: false },
1890
- [AmmoItemId.MagSlugs]: { id: AmmoItemId.MagSlugs, ammoType: AmmoType.MagSlugs, quantity: 10, weaponAmmo: false },
1891
- [AmmoItemId.Flechettes]: { id: AmmoItemId.Flechettes, ammoType: AmmoType.Flechettes, quantity: 50, weaponAmmo: false },
1892
- [AmmoItemId.Disruptor]: { id: AmmoItemId.Disruptor, ammoType: AmmoType.Disruptor, quantity: 15, weaponAmmo: false },
1893
- [AmmoItemId.Tesla]: { id: AmmoItemId.Tesla, ammoType: AmmoType.Tesla, quantity: 5, weaponAmmo: false },
1894
- [AmmoItemId.Trap]: { id: AmmoItemId.Trap, ammoType: AmmoType.Trap, quantity: 5, weaponAmmo: false },
1895
- [AmmoItemId.Prox]: { id: AmmoItemId.Prox, ammoType: AmmoType.Prox, quantity: 5, weaponAmmo: false }
1896
- };
1897
- }
1898
- });
1899
2063
 
1900
2064
  // src/combat/damageFlags.ts
2065
+ var DamageFlags = /* @__PURE__ */ ((DamageFlags2) => {
2066
+ DamageFlags2[DamageFlags2["NONE"] = 0] = "NONE";
2067
+ DamageFlags2[DamageFlags2["RADIUS"] = 1] = "RADIUS";
2068
+ DamageFlags2[DamageFlags2["NO_ARMOR"] = 2] = "NO_ARMOR";
2069
+ DamageFlags2[DamageFlags2["ENERGY"] = 4] = "ENERGY";
2070
+ DamageFlags2[DamageFlags2["NO_KNOCKBACK"] = 8] = "NO_KNOCKBACK";
2071
+ DamageFlags2[DamageFlags2["BULLET"] = 16] = "BULLET";
2072
+ DamageFlags2[DamageFlags2["NO_PROTECTION"] = 32] = "NO_PROTECTION";
2073
+ DamageFlags2[DamageFlags2["DESTROY_ARMOR"] = 64] = "DESTROY_ARMOR";
2074
+ DamageFlags2[DamageFlags2["NO_REG_ARMOR"] = 128] = "NO_REG_ARMOR";
2075
+ DamageFlags2[DamageFlags2["NO_POWER_ARMOR"] = 256] = "NO_POWER_ARMOR";
2076
+ DamageFlags2[DamageFlags2["NO_INDICATOR"] = 512] = "NO_INDICATOR";
2077
+ DamageFlags2[DamageFlags2["NO_DAMAGE_EFFECTS"] = 1024] = "NO_DAMAGE_EFFECTS";
2078
+ return DamageFlags2;
2079
+ })(DamageFlags || {});
1901
2080
  function hasAnyDamageFlag(flags, mask) {
1902
2081
  return (flags & mask) !== 0;
1903
2082
  }
1904
- var DamageFlags;
1905
- var init_damageFlags = __esm({
1906
- "src/combat/damageFlags.ts"() {
1907
- "use strict";
1908
- DamageFlags = /* @__PURE__ */ ((DamageFlags2) => {
1909
- DamageFlags2[DamageFlags2["NONE"] = 0] = "NONE";
1910
- DamageFlags2[DamageFlags2["RADIUS"] = 1] = "RADIUS";
1911
- DamageFlags2[DamageFlags2["NO_ARMOR"] = 2] = "NO_ARMOR";
1912
- DamageFlags2[DamageFlags2["ENERGY"] = 4] = "ENERGY";
1913
- DamageFlags2[DamageFlags2["NO_KNOCKBACK"] = 8] = "NO_KNOCKBACK";
1914
- DamageFlags2[DamageFlags2["BULLET"] = 16] = "BULLET";
1915
- DamageFlags2[DamageFlags2["NO_PROTECTION"] = 32] = "NO_PROTECTION";
1916
- DamageFlags2[DamageFlags2["DESTROY_ARMOR"] = 64] = "DESTROY_ARMOR";
1917
- DamageFlags2[DamageFlags2["NO_REG_ARMOR"] = 128] = "NO_REG_ARMOR";
1918
- DamageFlags2[DamageFlags2["NO_POWER_ARMOR"] = 256] = "NO_POWER_ARMOR";
1919
- DamageFlags2[DamageFlags2["NO_INDICATOR"] = 512] = "NO_INDICATOR";
1920
- DamageFlags2[DamageFlags2["NO_DAMAGE_EFFECTS"] = 1024] = "NO_DAMAGE_EFFECTS";
1921
- return DamageFlags2;
1922
- })(DamageFlags || {});
1923
- }
1924
- });
1925
2083
 
1926
2084
  // src/combat/armor.ts
2085
+ var ArmorType = /* @__PURE__ */ ((ArmorType2) => {
2086
+ ArmorType2["BODY"] = "body";
2087
+ ArmorType2["COMBAT"] = "combat";
2088
+ ArmorType2["JACKET"] = "jacket";
2089
+ return ArmorType2;
2090
+ })(ArmorType || {});
2091
+ var ARMOR_INFO = {
2092
+ ["jacket" /* JACKET */]: {
2093
+ baseCount: 25,
2094
+ maxCount: 50,
2095
+ normalProtection: 0.3,
2096
+ energyProtection: 0
2097
+ },
2098
+ ["combat" /* COMBAT */]: {
2099
+ baseCount: 50,
2100
+ maxCount: 100,
2101
+ normalProtection: 0.6,
2102
+ energyProtection: 0.3
2103
+ },
2104
+ ["body" /* BODY */]: {
2105
+ baseCount: 100,
2106
+ maxCount: 200,
2107
+ normalProtection: 0.8,
2108
+ energyProtection: 0.6
2109
+ }
2110
+ };
1927
2111
  function applyRegularArmor(damage, flags, state) {
1928
2112
  if (damage <= 0 || hasAnyDamageFlag(flags, 2 /* NO_ARMOR */ | 128 /* NO_REG_ARMOR */) || !state.armorType || state.armorCount <= 0) {
1929
2113
  return { saved: 0, remainingArmor: state.armorCount };
@@ -1987,42 +2171,28 @@ function applyPowerArmor(damage, flags, hitPoint, _hitNormal, state, options = {
1987
2171
  const remainingCells = Math.max(0, state.cellCount - cellsSpent);
1988
2172
  return { saved, remainingCells };
1989
2173
  }
1990
- var ArmorType, ARMOR_INFO;
1991
- var init_armor = __esm({
1992
- "src/combat/armor.ts"() {
1993
- "use strict";
1994
- init_esm();
1995
- init_damageFlags();
1996
- ArmorType = /* @__PURE__ */ ((ArmorType2) => {
1997
- ArmorType2["BODY"] = "body";
1998
- ArmorType2["COMBAT"] = "combat";
1999
- ArmorType2["JACKET"] = "jacket";
2000
- return ArmorType2;
2001
- })(ArmorType || {});
2002
- ARMOR_INFO = {
2003
- ["jacket" /* JACKET */]: {
2004
- baseCount: 25,
2005
- maxCount: 50,
2006
- normalProtection: 0.3,
2007
- energyProtection: 0
2008
- },
2009
- ["combat" /* COMBAT */]: {
2010
- baseCount: 50,
2011
- maxCount: 100,
2012
- normalProtection: 0.6,
2013
- energyProtection: 0.3
2014
- },
2015
- ["body" /* BODY */]: {
2016
- baseCount: 100,
2017
- maxCount: 200,
2018
- normalProtection: 0.8,
2019
- energyProtection: 0.6
2020
- }
2021
- };
2022
- }
2023
- });
2024
2174
 
2025
2175
  // src/inventory/playerInventory.ts
2176
+ var KeyId = /* @__PURE__ */ ((KeyId2) => {
2177
+ KeyId2["Blue"] = "key_blue";
2178
+ KeyId2["Red"] = "key_red";
2179
+ KeyId2["Green"] = "key_green";
2180
+ KeyId2["Yellow"] = "key_yellow";
2181
+ KeyId2["DataCD"] = "key_data_cd";
2182
+ KeyId2["PowerCube"] = "key_power_cube";
2183
+ KeyId2["ExplosiveCharges"] = "key_explosive_charges";
2184
+ KeyId2["PowerCore"] = "key_power_core";
2185
+ KeyId2["Pyramid"] = "key_pyramid";
2186
+ KeyId2["DataSpinner"] = "key_data_spinner";
2187
+ KeyId2["Pass"] = "key_pass";
2188
+ KeyId2["CommanderHead"] = "key_commander_head";
2189
+ KeyId2["Airstrike"] = "key_airstrike";
2190
+ KeyId2["NukeContainer"] = "key_nuke_container";
2191
+ KeyId2["Nuke"] = "key_nuke";
2192
+ KeyId2["RedFlag"] = "key_red_flag";
2193
+ KeyId2["BlueFlag"] = "key_blue_flag";
2194
+ return KeyId2;
2195
+ })(KeyId || {});
2026
2196
  function createPlayerInventory(init = {}) {
2027
2197
  const ammoCaps = init.ammoCaps;
2028
2198
  const inv = {
@@ -2195,452 +2365,135 @@ function pickupPowerup(client, item, time) {
2195
2365
  break;
2196
2366
  case "item_rebreather":
2197
2367
  powerupId = PowerupId.Rebreather;
2198
- icon = "p_rebreather";
2199
- break;
2200
- case "item_enviro":
2201
- powerupId = PowerupId.EnviroSuit;
2202
- icon = "p_envirosuit";
2203
- break;
2204
- case "item_double":
2205
- powerupId = PowerupId.DoubleDamage;
2206
- icon = "p_double";
2207
- break;
2208
- }
2209
- if (powerupId) {
2210
- const expiresAt = inventory.powerups.get(powerupId);
2211
- const newExpiresAt = expiresAt && expiresAt > time ? expiresAt + item.timer * 1e3 : time + item.timer * 1e3;
2212
- inventory.powerups.set(powerupId, newExpiresAt);
2213
- if (powerupId === PowerupId.QuadDamage) {
2214
- client.quad_time = newExpiresAt / 1e3;
2215
- } else if (powerupId === PowerupId.DoubleDamage) {
2216
- client.double_time = newExpiresAt / 1e3;
2217
- }
2218
- setPickup(inventory, icon, time);
2219
- return true;
2220
- }
2221
- return false;
2222
- }
2223
- function pickupPowerArmor(inventory, item, time) {
2224
- let icon = "";
2225
- if (item.armorType === "screen") {
2226
- icon = "i_powerscreen";
2227
- } else if (item.armorType === "shield") {
2228
- icon = "i_powershield";
2229
- }
2230
- const hadIt = inventory.items.has(item.id);
2231
- inventory.items.add(item.id);
2232
- if (!hadIt) {
2233
- setPickup(inventory, icon, time);
2234
- return true;
2235
- }
2236
- return false;
2237
- }
2238
- function pickupKey(inventory, item, time) {
2239
- let keyId = null;
2240
- let icon = "";
2241
- switch (item.id) {
2242
- case "key_blue":
2243
- keyId = "key_blue" /* Blue */;
2244
- icon = "k_bluekey";
2245
- break;
2246
- case "key_red":
2247
- keyId = "key_red" /* Red */;
2248
- icon = "k_redkey";
2249
- break;
2250
- case "key_green":
2251
- keyId = "key_green" /* Green */;
2252
- icon = "k_security";
2253
- break;
2254
- case "key_yellow":
2255
- keyId = "key_yellow" /* Yellow */;
2256
- icon = "k_pyramid";
2257
- break;
2258
- }
2259
- if (keyId) {
2260
- const res = addKey(inventory, keyId);
2261
- if (res) setPickup(inventory, icon, time);
2262
- return res;
2263
- }
2264
- return false;
2265
- }
2266
- function pickupFlag(client, item, time) {
2267
- const inventory = client.inventory;
2268
- let keyId = null;
2269
- let icon = "";
2270
- if (item.team === "red") {
2271
- keyId = "key_red_flag" /* RedFlag */;
2272
- icon = "i_ctf1";
2273
- } else {
2274
- keyId = "key_blue_flag" /* BlueFlag */;
2275
- icon = "i_ctf2";
2276
- }
2277
- if (keyId) {
2278
- const res = addKey(inventory, keyId);
2279
- if (res) setPickup(inventory, icon, time);
2280
- return true;
2281
- }
2282
- return false;
2283
- }
2284
- function pickupWeapon(inventory, weaponItem, time) {
2285
- const hadWeapon = hasWeapon(inventory, weaponItem.weaponId);
2286
- let ammoAdded = false;
2287
- if (weaponItem.ammoType) {
2288
- const ammoToAdd = hadWeapon ? weaponItem.pickupAmmo : weaponItem.initialAmmo;
2289
- const result = addAmmo(inventory.ammo, weaponItem.ammoType, ammoToAdd);
2290
- ammoAdded = result.pickedUp;
2291
- }
2292
- if (hadWeapon && !ammoAdded) {
2293
- return false;
2294
- }
2295
- giveWeapon(inventory, weaponItem.weaponId, true);
2296
- const icon = `w_${weaponItem.id.substring(7)}`;
2297
- setPickup(inventory, icon, time);
2298
- return true;
2299
- }
2300
- function serializePlayerInventory(inventory) {
2301
- return {
2302
- ammo: inventory.ammo.counts,
2303
- ownedWeapons: [...inventory.ownedWeapons],
2304
- currentWeapon: inventory.currentWeapon,
2305
- armor: inventory.armor ? { ...inventory.armor } : null,
2306
- powerups: [...inventory.powerups.entries()],
2307
- keys: [...inventory.keys],
2308
- items: [...inventory.items]
2309
- };
2310
- }
2311
- function deserializePlayerInventory(serialized, options = {}) {
2312
- const ammo = createAmmoInventory(options.ammoCaps);
2313
- const limit = Math.min(ammo.counts.length, serialized.ammo.length);
2314
- for (let i = 0; i < limit; i++) {
2315
- ammo.counts[i] = serialized.ammo[i];
2316
- }
2317
- return {
2318
- ammo,
2319
- ownedWeapons: new Set(serialized.ownedWeapons),
2320
- currentWeapon: serialized.currentWeapon,
2321
- armor: serialized.armor ? { ...serialized.armor } : null,
2322
- powerups: new Map(serialized.powerups),
2323
- keys: new Set(serialized.keys),
2324
- items: new Set(serialized.items)
2325
- };
2326
- }
2327
- var KeyId;
2328
- var init_playerInventory = __esm({
2329
- "src/inventory/playerInventory.ts"() {
2330
- "use strict";
2331
- init_ammo();
2332
- init_esm();
2333
- init_armor();
2334
- KeyId = /* @__PURE__ */ ((KeyId2) => {
2335
- KeyId2["Blue"] = "key_blue";
2336
- KeyId2["Red"] = "key_red";
2337
- KeyId2["Green"] = "key_green";
2338
- KeyId2["Yellow"] = "key_yellow";
2339
- KeyId2["DataCD"] = "key_data_cd";
2340
- KeyId2["PowerCube"] = "key_power_cube";
2341
- KeyId2["ExplosiveCharges"] = "key_explosive_charges";
2342
- KeyId2["PowerCore"] = "key_power_core";
2343
- KeyId2["Pyramid"] = "key_pyramid";
2344
- KeyId2["DataSpinner"] = "key_data_spinner";
2345
- KeyId2["Pass"] = "key_pass";
2346
- KeyId2["CommanderHead"] = "key_commander_head";
2347
- KeyId2["Airstrike"] = "key_airstrike";
2348
- KeyId2["NukeContainer"] = "key_nuke_container";
2349
- KeyId2["Nuke"] = "key_nuke";
2350
- KeyId2["RedFlag"] = "key_red_flag";
2351
- KeyId2["BlueFlag"] = "key_blue_flag";
2352
- return KeyId2;
2353
- })(KeyId || {});
2354
- }
2355
- });
2356
-
2357
- // src/combat/weapons/state.ts
2358
- function createPlayerWeaponStates() {
2359
- return {
2360
- states: /* @__PURE__ */ new Map()
2361
- };
2362
- }
2363
- function getWeaponState(playerStates, weaponId) {
2364
- let state = playerStates.states.get(weaponId);
2365
- if (!state) {
2366
- state = { lastFireTime: 0 };
2367
- playerStates.states.set(weaponId, state);
2368
- }
2369
- return state;
2370
- }
2371
- var WeaponStateEnum;
2372
- var init_state = __esm({
2373
- "src/combat/weapons/state.ts"() {
2374
- "use strict";
2375
- WeaponStateEnum = /* @__PURE__ */ ((WeaponStateEnum2) => {
2376
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_READY"] = 0] = "WEAPON_READY";
2377
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_ACTIVATING"] = 1] = "WEAPON_ACTIVATING";
2378
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_DROPPING"] = 2] = "WEAPON_DROPPING";
2379
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_FIRING"] = 3] = "WEAPON_FIRING";
2380
- return WeaponStateEnum2;
2381
- })(WeaponStateEnum || {});
2382
- }
2383
- });
2384
-
2385
- // src/combat/weapons/switching.ts
2386
- var switching_exports = {};
2387
- __export(switching_exports, {
2388
- ChangeWeapon: () => ChangeWeapon,
2389
- NoAmmoWeaponChange: () => NoAmmoWeaponChange,
2390
- setInstantSwitch: () => setInstantSwitch,
2391
- switchToBestWeapon: () => switchToBestWeapon
2392
- });
2393
- function setInstantSwitch(enabled) {
2394
- instantSwitch = enabled;
2395
- }
2396
- function ChangeWeapon(ent, weaponId) {
2397
- if (!ent.client) return;
2398
- const client = ent.client;
2399
- if (client.weaponstate === 2 /* WEAPON_DROPPING */) {
2400
- return;
2401
- }
2402
- if (weaponId) {
2403
- selectWeapon(client.inventory, weaponId);
2404
- client.weaponstate = 1 /* WEAPON_ACTIVATING */;
2405
- client.gun_frame = 0;
2406
- if (instantSwitch) {
2407
- client.weaponstate = 0 /* WEAPON_READY */;
2408
- client.weapon_think_time = 0;
2409
- return;
2410
- }
2411
- client.weapon_think_time = 0;
2412
- }
2413
- }
2414
- function NoAmmoWeaponChange(ent) {
2415
- if (!ent.client) return;
2416
- switchToBestWeapon(ent);
2417
- }
2418
- function switchToBestWeapon(player) {
2419
- if (!player.client) {
2420
- return;
2421
- }
2422
- const inventory = player.client.inventory;
2423
- let bestWeapon = null;
2424
- if (inventory.ownedWeapons.has(WeaponId.BFG10K) && inventory.ammo.counts[AmmoType.Cells] >= 50) {
2425
- bestWeapon = WeaponId.BFG10K;
2426
- } else if (inventory.ownedWeapons.has(WeaponId.RocketLauncher) && inventory.ammo.counts[AmmoType.Rockets] >= 1) {
2427
- bestWeapon = WeaponId.RocketLauncher;
2428
- } else if (inventory.ownedWeapons.has(WeaponId.Railgun) && inventory.ammo.counts[AmmoType.Slugs] >= 1) {
2429
- bestWeapon = WeaponId.Railgun;
2430
- } else if (inventory.ownedWeapons.has(WeaponId.Chaingun) && inventory.ammo.counts[AmmoType.Bullets] >= 1) {
2431
- bestWeapon = WeaponId.Chaingun;
2432
- } else if (inventory.ownedWeapons.has(WeaponId.SuperShotgun) && inventory.ammo.counts[AmmoType.Shells] >= 2) {
2433
- bestWeapon = WeaponId.SuperShotgun;
2434
- } else if (inventory.ownedWeapons.has(WeaponId.Machinegun) && inventory.ammo.counts[AmmoType.Bullets] >= 1) {
2435
- bestWeapon = WeaponId.Machinegun;
2436
- } else if (inventory.ownedWeapons.has(WeaponId.Shotgun) && inventory.ammo.counts[AmmoType.Shells] >= 1) {
2437
- bestWeapon = WeaponId.Shotgun;
2438
- } else {
2439
- bestWeapon = WeaponId.Blaster;
2440
- }
2441
- if (bestWeapon && bestWeapon !== inventory.currentWeapon) {
2442
- selectWeapon(inventory, bestWeapon);
2443
- player.client.weaponstate = 1 /* WEAPON_ACTIVATING */;
2444
- player.client.gun_frame = 0;
2445
- if (instantSwitch) {
2446
- player.client.weaponstate = 0 /* WEAPON_READY */;
2447
- }
2448
- player.client.weapon_think_time = 0;
2449
- }
2450
- }
2451
- var instantSwitch;
2452
- var init_switching = __esm({
2453
- "src/combat/weapons/switching.ts"() {
2454
- "use strict";
2455
- init_playerInventory();
2456
- init_ammo();
2457
- instantSwitch = false;
2458
- }
2459
- });
2460
-
2461
- // src/index.ts
2462
- var index_exports = {};
2463
- __export(index_exports, {
2464
- AIFlags: () => AIFlags,
2465
- AI_GetSightClient: () => AI_GetSightClient,
2466
- AMMO_TYPE_COUNT: () => AMMO_TYPE_COUNT,
2467
- ARMOR_INFO: () => ARMOR_INFO,
2468
- ARMOR_ITEMS: () => ARMOR_ITEMS,
2469
- AmmoItemId: () => AmmoItemId,
2470
- AmmoType: () => AmmoType,
2471
- ArmorType: () => ArmorType,
2472
- AttackState: () => AttackState,
2473
- BOTTOM_EMPTY: () => BOTTOM_EMPTY,
2474
- BOTTOM_LAVA: () => BOTTOM_LAVA,
2475
- BOTTOM_SLIME: () => BOTTOM_SLIME,
2476
- BOTTOM_SOLID: () => BOTTOM_SOLID,
2477
- BOTTOM_WATER: () => BOTTOM_WATER,
2478
- BlockedJumpResult: () => BlockedJumpResult,
2479
- CheckGround: () => CheckGround,
2480
- DamageFlags: () => DamageFlags,
2481
- DamageMod: () => DamageMod,
2482
- DeadFlag: () => DeadFlag,
2483
- ENTITY_FIELD_METADATA: () => ENTITY_FIELD_METADATA,
2484
- Entity: () => Entity,
2485
- EntityDamageFlags: () => EntityDamageFlags,
2486
- EntitySystem: () => EntitySystem,
2487
- EnvironmentalFlags: () => EnvironmentalFlags,
2488
- FLAG_ITEMS: () => FLAG_ITEMS,
2489
- FL_NOTARGET: () => FL_NOTARGET,
2490
- FL_NOVISIBLE: () => FL_NOVISIBLE,
2491
- G_IdealHoverPosition: () => G_IdealHoverPosition,
2492
- HEALTH_ITEMS: () => HEALTH_ITEMS,
2493
- KEY_ITEMS: () => KEY_ITEMS,
2494
- KeyId: () => KeyId,
2495
- M_CalculatePitchToFire: () => M_CalculatePitchToFire,
2496
- M_ChangeYaw: () => M_ChangeYaw,
2497
- M_CheckAttack: () => M_CheckAttack,
2498
- M_CheckAttack_Base: () => M_CheckAttack_Base,
2499
- M_CheckBottom: () => M_CheckBottom,
2500
- M_CheckBottomEx: () => M_CheckBottomEx,
2501
- M_MoveFrame: () => M_MoveFrame,
2502
- M_MoveStep: () => M_MoveStep,
2503
- M_MoveToGoal: () => M_MoveToGoal,
2504
- M_MoveToPath: () => M_MoveToPath,
2505
- M_droptofloor: () => M_droptofloor,
2506
- M_droptofloor_generic: () => M_droptofloor_generic,
2507
- M_walkmove: () => M_walkmove,
2508
- MonsterAttackState: () => MonsterAttackState,
2509
- MoveType: () => MoveType,
2510
- MulticastType: () => MulticastType,
2511
- ORDERED_DAMAGE_MODS: () => ORDERED_DAMAGE_MODS,
2512
- PNOISE_IMPACT: () => PNOISE_IMPACT,
2513
- PNOISE_SELF: () => PNOISE_SELF,
2514
- PNOISE_WEAPON: () => PNOISE_WEAPON,
2515
- POWERUP_ITEMS: () => POWERUP_ITEMS,
2516
- POWER_ARMOR_ITEMS: () => POWER_ARMOR_ITEMS,
2517
- PlayerNoise: () => PlayerNoise,
2518
- PowerupId: () => PowerupId,
2519
- PredictAim: () => PredictAim,
2520
- RANGE_MELEE: () => RANGE_MELEE,
2521
- RANGE_MID: () => RANGE_MID,
2522
- RANGE_NEAR: () => RANGE_NEAR,
2523
- Range: () => RangeCategory,
2524
- RangeCategory: () => RangeCategory,
2525
- SAVE_FORMAT_VERSION: () => SAVE_FORMAT_VERSION,
2526
- SPAWNFLAG_MONSTER_AMBUSH: () => SPAWNFLAG_MONSTER_AMBUSH,
2527
- SV_NewChaseDir: () => SV_NewChaseDir,
2528
- SV_StepDirection: () => SV_StepDirection,
2529
- SV_flystep: () => SV_flystep,
2530
- SaveStorage: () => SaveStorage,
2531
- ServerFlags: () => ServerFlags,
2532
- Solid: () => Solid,
2533
- SpawnRegistry: () => SpawnRegistry,
2534
- T_Damage: () => T_Damage,
2535
- T_RadiusDamage: () => T_RadiusDamage,
2536
- TraceMask: () => TraceMask,
2537
- WEAPONS: () => WEAPONS,
2538
- WEAPON_ITEMS: () => WEAPON_ITEMS,
2539
- WeaponId: () => WeaponId,
2540
- WeaponStateEnum: () => WeaponStateEnum,
2541
- WeaponType: () => WeaponType,
2542
- addAmmo: () => addAmmo,
2543
- addKey: () => addKey,
2544
- addPowerup: () => addPowerup,
2545
- ai_charge: () => ai_charge,
2546
- ai_checkattack: () => ai_checkattack,
2547
- ai_face: () => ai_face,
2548
- ai_move: () => ai_move,
2549
- ai_run: () => ai_run,
2550
- ai_run_slide: () => ai_run_slide,
2551
- ai_stand: () => ai_stand,
2552
- ai_turn: () => ai_turn,
2553
- ai_walk: () => ai_walk,
2554
- applyCrushDamage: () => applyCrushDamage,
2555
- applyEntityKeyValues: () => applyEntityKeyValues,
2556
- applyEnvironmentalDamage: () => applyEnvironmentalDamage,
2557
- applyFallingDamage: () => applyFallingDamage,
2558
- applyPowerArmor: () => applyPowerArmor,
2559
- applyRegularArmor: () => applyRegularArmor,
2560
- applySaveFile: () => applySaveFile,
2561
- blocked_checkjump: () => blocked_checkjump,
2562
- blocked_checkplat: () => blocked_checkplat,
2563
- calculateFallingDamage: () => calculateFallingDamage,
2564
- calculateSaveChecksum: () => calculateSaveChecksum,
2565
- canPickupHealth: () => canPickupHealth,
2566
- changeYaw: () => changeYaw,
2567
- clampAmmoCounts: () => clampAmmoCounts,
2568
- classifyRange: () => classifyRange,
2569
- clearExpiredPowerups: () => clearExpiredPowerups,
2570
- convertGameSaveToRereleaseLevel: () => convertGameSaveToRereleaseLevel,
2571
- convertRereleaseLevelToGameSave: () => convertRereleaseLevelToGameSave,
2572
- convertRereleaseSaveToGameSave: () => convertRereleaseSaveToGameSave,
2573
- createAmmoInventory: () => createAmmoInventory,
2574
- createAmmoPickupEntity: () => createAmmoPickupEntity,
2575
- createArmorPickupEntity: () => createArmorPickupEntity,
2576
- createBaseAmmoCaps: () => createBaseAmmoCaps,
2577
- createCallbackRegistry: () => createCallbackRegistry,
2578
- createDefaultSpawnRegistry: () => createDefaultSpawnRegistry,
2579
- createFoodCubePickupEntity: () => createFoodCubePickupEntity,
2580
- createGame: () => createGame,
2581
- createHealthPickupEntity: () => createHealthPickupEntity,
2582
- createKeyPickupEntity: () => createKeyPickupEntity,
2583
- createPlayerInventory: () => createPlayerInventory,
2584
- createPlayerWeaponStates: () => createPlayerWeaponStates,
2585
- createPowerupPickupEntity: () => createPowerupPickupEntity,
2586
- createSaveFile: () => createSaveFile,
2587
- createWeaponPickupEntity: () => createWeaponPickupEntity,
2588
- damageModName: () => damageModName,
2589
- deserializePlayerInventory: () => deserializePlayerInventory,
2590
- equipArmor: () => equipArmor,
2591
- facingIdeal: () => facingIdeal,
2592
- findTarget: () => findTarget,
2593
- foundTarget: () => foundTarget,
2594
- getAmmoItemDefinition: () => getAmmoItemDefinition,
2595
- getWeaponState: () => getWeaponState,
2596
- giveAmmoItem: () => giveAmmoItem,
2597
- giveWeapon: () => giveWeapon,
2598
- hasAnyDamageFlag: () => hasAnyDamageFlag,
2599
- hasItem: () => hasItem,
2600
- hasKey: () => hasKey,
2601
- hasPowerup: () => hasPowerup,
2602
- hasWeapon: () => hasWeapon,
2603
- hashEntitySystem: () => hashEntitySystem,
2604
- hashGameState: () => hashGameState,
2605
- huntTarget: () => huntTarget,
2606
- infront: () => infront,
2607
- isZeroVector: () => isZeroVector,
2608
- killBox: () => killBox,
2609
- monster_done_dodge: () => monster_done_dodge,
2610
- monster_jump_finished: () => monster_jump_finished,
2611
- monster_jump_start: () => monster_jump_start,
2612
- monster_think: () => monster_think,
2613
- parseEntityLump: () => parseEntityLump,
2614
- parseRereleaseSave: () => parseRereleaseSave,
2615
- parseSaveFile: () => parseSaveFile,
2616
- pickupAmmo: () => pickupAmmo,
2617
- pickupArmor: () => pickupArmor,
2618
- pickupFlag: () => pickupFlag,
2619
- pickupKey: () => pickupKey,
2620
- pickupPowerArmor: () => pickupPowerArmor,
2621
- pickupPowerup: () => pickupPowerup,
2622
- pickupWeapon: () => pickupWeapon,
2623
- player_noise: () => player_noise,
2624
- range: () => rangeTo,
2625
- rangeTo: () => rangeTo,
2626
- registerCallback: () => registerCallback,
2627
- registerDefaultSpawns: () => registerDefaultSpawns,
2628
- resetInventory: () => resetInventory,
2629
- selectWeapon: () => selectWeapon,
2630
- serializePlayerInventory: () => serializePlayerInventory,
2631
- serializeRereleaseSave: () => serializeRereleaseSave,
2632
- setMovedir: () => setMovedir,
2633
- spawnEntitiesFromText: () => spawnEntitiesFromText,
2634
- spawnEntityFromDictionary: () => spawnEntityFromDictionary,
2635
- summarizeRereleaseSave: () => summarizeRereleaseSave,
2636
- visible: () => visible,
2637
- walkMove: () => walkMove
2638
- });
2639
- module.exports = __toCommonJS(index_exports);
2640
-
2641
- // src/entities/entity.ts
2642
- init_esm();
2643
- init_playerInventory();
2368
+ icon = "p_rebreather";
2369
+ break;
2370
+ case "item_enviro":
2371
+ powerupId = PowerupId.EnviroSuit;
2372
+ icon = "p_envirosuit";
2373
+ break;
2374
+ case "item_double":
2375
+ powerupId = PowerupId.DoubleDamage;
2376
+ icon = "p_double";
2377
+ break;
2378
+ }
2379
+ if (powerupId) {
2380
+ const expiresAt = inventory.powerups.get(powerupId);
2381
+ const newExpiresAt = expiresAt && expiresAt > time ? expiresAt + item.timer * 1e3 : time + item.timer * 1e3;
2382
+ inventory.powerups.set(powerupId, newExpiresAt);
2383
+ if (powerupId === PowerupId.QuadDamage) {
2384
+ client.quad_time = newExpiresAt / 1e3;
2385
+ } else if (powerupId === PowerupId.DoubleDamage) {
2386
+ client.double_time = newExpiresAt / 1e3;
2387
+ }
2388
+ setPickup(inventory, icon, time);
2389
+ return true;
2390
+ }
2391
+ return false;
2392
+ }
2393
+ function pickupPowerArmor(inventory, item, time) {
2394
+ let icon = "";
2395
+ if (item.armorType === "screen") {
2396
+ icon = "i_powerscreen";
2397
+ } else if (item.armorType === "shield") {
2398
+ icon = "i_powershield";
2399
+ }
2400
+ const hadIt = inventory.items.has(item.id);
2401
+ inventory.items.add(item.id);
2402
+ if (!hadIt) {
2403
+ setPickup(inventory, icon, time);
2404
+ return true;
2405
+ }
2406
+ return false;
2407
+ }
2408
+ function pickupKey(inventory, item, time) {
2409
+ let keyId = null;
2410
+ let icon = "";
2411
+ switch (item.id) {
2412
+ case "key_blue":
2413
+ keyId = "key_blue" /* Blue */;
2414
+ icon = "k_bluekey";
2415
+ break;
2416
+ case "key_red":
2417
+ keyId = "key_red" /* Red */;
2418
+ icon = "k_redkey";
2419
+ break;
2420
+ case "key_green":
2421
+ keyId = "key_green" /* Green */;
2422
+ icon = "k_security";
2423
+ break;
2424
+ case "key_yellow":
2425
+ keyId = "key_yellow" /* Yellow */;
2426
+ icon = "k_pyramid";
2427
+ break;
2428
+ }
2429
+ if (keyId) {
2430
+ const res = addKey(inventory, keyId);
2431
+ if (res) setPickup(inventory, icon, time);
2432
+ return res;
2433
+ }
2434
+ return false;
2435
+ }
2436
+ function pickupFlag(client, item, time) {
2437
+ const inventory = client.inventory;
2438
+ let keyId = null;
2439
+ let icon = "";
2440
+ if (item.team === "red") {
2441
+ keyId = "key_red_flag" /* RedFlag */;
2442
+ icon = "i_ctf1";
2443
+ } else {
2444
+ keyId = "key_blue_flag" /* BlueFlag */;
2445
+ icon = "i_ctf2";
2446
+ }
2447
+ if (keyId) {
2448
+ const res = addKey(inventory, keyId);
2449
+ if (res) setPickup(inventory, icon, time);
2450
+ return true;
2451
+ }
2452
+ return false;
2453
+ }
2454
+ function pickupWeapon(inventory, weaponItem, time) {
2455
+ const hadWeapon = hasWeapon(inventory, weaponItem.weaponId);
2456
+ let ammoAdded = false;
2457
+ if (weaponItem.ammoType) {
2458
+ const ammoToAdd = hadWeapon ? weaponItem.pickupAmmo : weaponItem.initialAmmo;
2459
+ const result = addAmmo(inventory.ammo, weaponItem.ammoType, ammoToAdd);
2460
+ ammoAdded = result.pickedUp;
2461
+ }
2462
+ if (hadWeapon && !ammoAdded) {
2463
+ return false;
2464
+ }
2465
+ giveWeapon(inventory, weaponItem.weaponId, true);
2466
+ const icon = `w_${weaponItem.id.substring(7)}`;
2467
+ setPickup(inventory, icon, time);
2468
+ return true;
2469
+ }
2470
+ function serializePlayerInventory(inventory) {
2471
+ return {
2472
+ ammo: inventory.ammo.counts,
2473
+ ownedWeapons: [...inventory.ownedWeapons],
2474
+ currentWeapon: inventory.currentWeapon,
2475
+ armor: inventory.armor ? { ...inventory.armor } : null,
2476
+ powerups: [...inventory.powerups.entries()],
2477
+ keys: [...inventory.keys],
2478
+ items: [...inventory.items]
2479
+ };
2480
+ }
2481
+ function deserializePlayerInventory(serialized, options = {}) {
2482
+ const ammo = createAmmoInventory(options.ammoCaps);
2483
+ const limit = Math.min(ammo.counts.length, serialized.ammo.length);
2484
+ for (let i = 0; i < limit; i++) {
2485
+ ammo.counts[i] = serialized.ammo[i];
2486
+ }
2487
+ return {
2488
+ ammo,
2489
+ ownedWeapons: new Set(serialized.ownedWeapons),
2490
+ currentWeapon: serialized.currentWeapon,
2491
+ armor: serialized.armor ? { ...serialized.armor } : null,
2492
+ powerups: new Map(serialized.powerups),
2493
+ keys: new Set(serialized.keys),
2494
+ items: new Set(serialized.items)
2495
+ };
2496
+ }
2644
2497
 
2645
2498
  // src/combat/damageMods.ts
2646
2499
  var DamageMod = /* @__PURE__ */ ((DamageMod2) => {
@@ -2770,9 +2623,6 @@ function damageModName(mod) {
2770
2623
  return `MOD_${DamageMod[mod]}`;
2771
2624
  }
2772
2625
 
2773
- // src/entities/entity.ts
2774
- init_ammo();
2775
-
2776
2626
  // src/ai/constants.ts
2777
2627
  var RANGE_MELEE = 20;
2778
2628
  var RANGE_NEAR = 440;
@@ -3231,19 +3081,7 @@ var ENTITY_FIELD_METADATA = [
3231
3081
  { name: "fov", type: "float", save: true }
3232
3082
  ];
3233
3083
 
3234
- // src/entities/system.ts
3235
- init_esm();
3236
-
3237
- // src/physics/movement.ts
3238
- init_esm();
3239
-
3240
- // src/ai/movement.ts
3241
- init_esm();
3242
- init_esm();
3243
-
3244
3084
  // src/ai/perception.ts
3245
- init_esm();
3246
- init_esm();
3247
3085
  var RangeCategory = /* @__PURE__ */ ((RangeCategory6) => {
3248
3086
  RangeCategory6["Melee"] = "melee";
3249
3087
  RangeCategory6["Near"] = "near";
@@ -3303,11 +3141,7 @@ function visible(self, other, trace, options) {
3303
3141
  return result.fraction === 1 || result.ent === other;
3304
3142
  }
3305
3143
 
3306
- // src/ai/targeting.ts
3307
- init_esm();
3308
-
3309
3144
  // src/ai/monster.ts
3310
- init_esm();
3311
3145
  function M_CheckAttack_Base(self, context, stand_ground_chance, melee_chance, near_chance, mid_chance, far_chance, strafe_scalar) {
3312
3146
  if (self.enemy && self.enemy.flags & 1 << 24) {
3313
3147
  return false;
@@ -4220,15 +4054,6 @@ function checkTriggers(ent, system) {
4220
4054
  }
4221
4055
  }
4222
4056
 
4223
- // src/combat/specialDamage.ts
4224
- init_esm();
4225
-
4226
- // src/combat/damage.ts
4227
- init_esm();
4228
- init_armor();
4229
- init_damageFlags();
4230
- init_esm();
4231
-
4232
4057
  // src/imports.ts
4233
4058
  var MulticastType = /* @__PURE__ */ ((MulticastType2) => {
4234
4059
  MulticastType2[MulticastType2["All"] = 0] = "All";
@@ -4548,7 +4373,6 @@ function killBox(teleporter, targets, options = {}) {
4548
4373
  }
4549
4374
 
4550
4375
  // src/physics/fluid.ts
4551
- init_esm();
4552
4376
  function checkWater2(ent, system, imports) {
4553
4377
  const origin = ent.origin;
4554
4378
  const mins = ent.mins;
@@ -5116,9 +4940,6 @@ var ThinkScheduler = class {
5116
4940
  }
5117
4941
  };
5118
4942
 
5119
- // src/entities/system.ts
5120
- init_esm();
5121
-
5122
4943
  // src/entities/spatial.ts
5123
4944
  var CELL_SIZE = 256;
5124
4945
  function getCellKey(x, y, z) {
@@ -5861,14 +5682,7 @@ var EntitySystem = class {
5861
5682
  }
5862
5683
  };
5863
5684
 
5864
- // src/entities/misc.ts
5865
- init_esm();
5866
-
5867
- // src/entities/misc/flyers.ts
5868
- init_esm();
5869
-
5870
5685
  // src/entities/utils.ts
5871
- init_esm();
5872
5686
  var VEC_UP = { x: 0, y: -1, z: 0 };
5873
5687
  var MOVEDIR_UP = { x: 0, y: 0, z: 1 };
5874
5688
  var VEC_DOWN = { x: 0, y: -2, z: 0 };
@@ -6050,15 +5864,6 @@ function registerMiscBigViper(registry) {
6050
5864
  });
6051
5865
  }
6052
5866
 
6053
- // src/entities/misc/viperMissile.ts
6054
- init_esm();
6055
-
6056
- // src/entities/projectiles.ts
6057
- init_esm();
6058
-
6059
- // src/entities/projectiles/trap.ts
6060
- init_esm();
6061
-
6062
5867
  // src/entities/items/foodcube.ts
6063
5868
  var EF_GIB = 8;
6064
5869
  function createFoodCubePickupEntity(game) {
@@ -6085,7 +5890,6 @@ function createFoodCubePickupEntity(game) {
6085
5890
  }
6086
5891
 
6087
5892
  // src/entities/projectiles/trap.ts
6088
- init_esm();
6089
5893
  function clamp(val, min, max) {
6090
5894
  return Math.max(min, Math.min(max, val));
6091
5895
  }
@@ -6860,7 +6664,6 @@ function registerMiscViperMissile(registry) {
6860
6664
  }
6861
6665
 
6862
6666
  // src/entities/misc/decorative.ts
6863
- init_esm();
6864
6667
  var random = createRandomGenerator();
6865
6668
  function misc_satellite_dish_think(self, context) {
6866
6669
  self.frame++;
@@ -7358,7 +7161,6 @@ function registerMiscSpawns(registry) {
7358
7161
  }
7359
7162
 
7360
7163
  // src/entities/targets.ts
7361
- init_esm();
7362
7164
  var ATTN_NONE = 0;
7363
7165
  var ATTN_NORM2 = 1;
7364
7166
  var SPEAKER_SPAWNFLAGS = {
@@ -8105,11 +7907,7 @@ function registerTargetSpawns(registry) {
8105
7907
  });
8106
7908
  }
8107
7909
 
8108
- // src/entities/triggers.ts
8109
- init_esm();
8110
-
8111
7910
  // src/entities/triggers/fog.ts
8112
- init_esm();
8113
7911
  function clamp2(value, min, max) {
8114
7912
  return Math.min(Math.max(value, min), max);
8115
7913
  }
@@ -8228,7 +8026,6 @@ function registerTriggerFog(registry) {
8228
8026
  }
8229
8027
 
8230
8028
  // src/entities/triggers/flashlight.ts
8231
- init_esm();
8232
8029
  var registerTriggerFlashlight = (registry) => {
8233
8030
  registry.register("trigger_flashlight", (self, context) => {
8234
8031
  self.solid = 1 /* Trigger */;
@@ -8843,28 +8640,32 @@ function registerBadArea(registry) {
8843
8640
  });
8844
8641
  }
8845
8642
 
8846
- // src/inventory/items.ts
8847
- init_ammo();
8848
- init_playerInventory();
8849
-
8850
- // src/combat/weapons/chaingun.ts
8851
- init_state();
8852
- init_playerInventory();
8643
+ // src/combat/weapons/state.ts
8644
+ var WeaponStateEnum = /* @__PURE__ */ ((WeaponStateEnum2) => {
8645
+ WeaponStateEnum2[WeaponStateEnum2["WEAPON_READY"] = 0] = "WEAPON_READY";
8646
+ WeaponStateEnum2[WeaponStateEnum2["WEAPON_ACTIVATING"] = 1] = "WEAPON_ACTIVATING";
8647
+ WeaponStateEnum2[WeaponStateEnum2["WEAPON_DROPPING"] = 2] = "WEAPON_DROPPING";
8648
+ WeaponStateEnum2[WeaponStateEnum2["WEAPON_FIRING"] = 3] = "WEAPON_FIRING";
8649
+ return WeaponStateEnum2;
8650
+ })(WeaponStateEnum || {});
8651
+ function createPlayerWeaponStates() {
8652
+ return {
8653
+ states: /* @__PURE__ */ new Map()
8654
+ };
8655
+ }
8656
+ function getWeaponState(playerStates, weaponId) {
8657
+ let state = playerStates.states.get(weaponId);
8658
+ if (!state) {
8659
+ state = { lastFireTime: 0 };
8660
+ playerStates.states.set(weaponId, state);
8661
+ }
8662
+ return state;
8663
+ }
8853
8664
 
8854
8665
  // src/buttons.ts
8855
8666
  var BUTTON_ATTACK = 1;
8856
8667
 
8857
- // src/combat/weapons/animation.ts
8858
- init_playerInventory();
8859
-
8860
- // src/combat/weapons/firing.ts
8861
- init_state();
8862
- init_playerInventory();
8863
- init_ammo();
8864
- init_esm();
8865
-
8866
8668
  // src/combat/weapons/projectSource.ts
8867
- init_esm();
8868
8669
  var VIEW_HEIGHT = 22;
8869
8670
  function P_ProjectSource(game, ent, offset, forward, right, up) {
8870
8671
  const origin = copyVec3(ent.origin);
@@ -8881,6 +8682,7 @@ function P_ProjectSource(game, ent, offset, forward, right, up) {
8881
8682
  }
8882
8683
 
8883
8684
  // src/combat/weapons/frames.ts
8685
+ var FRAME_GRENADE_IDLE_LAST = 48;
8884
8686
  var FRAME_SHOTGUN_ACTIVATE_LAST = 7;
8885
8687
  var FRAME_SHOTGUN_FIRE_LAST = 18;
8886
8688
  var FRAME_SHOTGUN_IDLE_LAST = 36;
@@ -9347,7 +9149,79 @@ function fireBFG(game, player) {
9347
9149
  }
9348
9150
  }
9349
9151
 
9350
- // src/combat/weapons/animation.ts
9152
+ // src/combat/weapons/switching.ts
9153
+ var instantSwitch = false;
9154
+ function getWeaponIdleLastFrame(weaponId) {
9155
+ switch (weaponId) {
9156
+ case WeaponId.HandGrenade:
9157
+ return FRAME_GRENADE_IDLE_LAST;
9158
+ case WeaponId.Shotgun:
9159
+ return FRAME_SHOTGUN_IDLE_LAST;
9160
+ case WeaponId.SuperShotgun:
9161
+ return FRAME_SSHOTGUN_IDLE_LAST;
9162
+ case WeaponId.Machinegun:
9163
+ return FRAME_MACHINEGUN_IDLE_LAST;
9164
+ case WeaponId.Chaingun:
9165
+ return FRAME_CHAINGUN_IDLE_LAST;
9166
+ case WeaponId.Railgun:
9167
+ return FRAME_RAILGUN_IDLE_LAST;
9168
+ case WeaponId.RocketLauncher:
9169
+ return FRAME_ROCKET_IDLE_LAST;
9170
+ case WeaponId.HyperBlaster:
9171
+ return FRAME_HYPERBLASTER_IDLE_LAST;
9172
+ case WeaponId.BFG10K:
9173
+ return FRAME_BFG_IDLE_LAST;
9174
+ case WeaponId.GrenadeLauncher:
9175
+ return FRAME_GRENADELAUNCHER_IDLE_LAST;
9176
+ case WeaponId.Blaster:
9177
+ return FRAME_BLASTER_IDLE_LAST;
9178
+ default:
9179
+ return 0;
9180
+ }
9181
+ }
9182
+ function ChangeWeapon(ent, weaponId) {
9183
+ if (!ent.client) return;
9184
+ const client = ent.client;
9185
+ if (weaponId) {
9186
+ if (client.weaponstate === 2 /* WEAPON_DROPPING */) {
9187
+ client.newWeapon = weaponId;
9188
+ return;
9189
+ }
9190
+ if (client.weaponstate === 0 /* WEAPON_READY */ || client.weaponstate === 3 /* WEAPON_FIRING */) {
9191
+ client.newWeapon = weaponId;
9192
+ client.weaponstate = 2 /* WEAPON_DROPPING */;
9193
+ if (client.inventory.currentWeapon) {
9194
+ client.gun_frame = getWeaponIdleLastFrame(client.inventory.currentWeapon) + 1;
9195
+ } else {
9196
+ client.gun_frame = 0;
9197
+ }
9198
+ if (instantSwitch) {
9199
+ selectWeapon(client.inventory, weaponId);
9200
+ client.weaponstate = 0 /* WEAPON_READY */;
9201
+ client.weapon_think_time = 0;
9202
+ client.newWeapon = void 0;
9203
+ }
9204
+ return;
9205
+ }
9206
+ client.newWeapon = weaponId;
9207
+ return;
9208
+ }
9209
+ if (client.newWeapon) {
9210
+ selectWeapon(client.inventory, client.newWeapon);
9211
+ client.weaponstate = 1 /* WEAPON_ACTIVATING */;
9212
+ client.gun_frame = 0;
9213
+ client.weapon_think_time = 0;
9214
+ client.newWeapon = void 0;
9215
+ }
9216
+ }
9217
+
9218
+ // src/combat/weapons/common.ts
9219
+ function applyKick2(player, pitch, yaw = 0, kickOrigin = 0) {
9220
+ if (player.client) {
9221
+ player.client.kick_angles = { x: pitch, y: yaw, z: 0 };
9222
+ player.client.kick_origin = { x: kickOrigin, y: 0, z: 0 };
9223
+ }
9224
+ }
9351
9225
  function Weapon_AnimationTime(ent) {
9352
9226
  let time = 0.1;
9353
9227
  if (ent.client?.inventory.powerups.has(PowerupId.TechHaste)) {
@@ -9358,6 +9232,8 @@ function Weapon_AnimationTime(ent) {
9358
9232
  }
9359
9233
  return time;
9360
9234
  }
9235
+
9236
+ // src/combat/weapons/animation.ts
9361
9237
  function Weapon_Generic(ent, FRAME_ACTIVATE_LAST, FRAME_FIRE_LAST, FRAME_IDLE_LAST, FRAME_DEACTIVATE_LAST, pause_frames, fire_frames, fire, sys) {
9362
9238
  if (!ent.client) return;
9363
9239
  const client = ent.client;
@@ -9385,9 +9261,7 @@ function Weapon_Generic(ent, FRAME_ACTIVATE_LAST, FRAME_FIRE_LAST, FRAME_IDLE_LA
9385
9261
  client.weapon_think_time = time + Weapon_AnimationTime(ent);
9386
9262
  return;
9387
9263
  }
9388
- Promise.resolve().then(() => (init_switching(), switching_exports)).then(({ ChangeWeapon: ChangeWeapon2 }) => {
9389
- ChangeWeapon2(ent);
9390
- });
9264
+ ChangeWeapon(ent);
9391
9265
  return;
9392
9266
  }
9393
9267
  if (client.weaponstate === 0 /* WEAPON_READY */) {
@@ -9396,6 +9270,10 @@ function Weapon_Generic(ent, FRAME_ACTIVATE_LAST, FRAME_FIRE_LAST, FRAME_IDLE_LA
9396
9270
  client.gun_frame = FRAME_ACTIVATE_LAST + 1;
9397
9271
  return;
9398
9272
  }
9273
+ if (client.newWeapon) {
9274
+ ChangeWeapon(ent, client.newWeapon);
9275
+ return;
9276
+ }
9399
9277
  if (client.gun_frame < FRAME_IDLE_LAST) {
9400
9278
  client.gun_frame++;
9401
9279
  client.weapon_think_time = time + Weapon_AnimationTime(ent);
@@ -9428,6 +9306,10 @@ function Weapon_Generic(ent, FRAME_ACTIVATE_LAST, FRAME_FIRE_LAST, FRAME_IDLE_LA
9428
9306
  client.weapon_think_time = time + Weapon_AnimationTime(ent);
9429
9307
  return;
9430
9308
  }
9309
+ if (client.newWeapon) {
9310
+ ChangeWeapon(ent, client.newWeapon);
9311
+ return;
9312
+ }
9431
9313
  client.weaponstate = 0 /* WEAPON_READY */;
9432
9314
  client.gun_frame = FRAME_FIRE_LAST + 1;
9433
9315
  client.weapon_think_time = time + Weapon_AnimationTime(ent);
@@ -9450,6 +9332,10 @@ function Weapon_Repeating(ent, FRAME_ACTIVATE_LAST, FRAME_FIRE_LAST, FRAME_IDLE_
9450
9332
  if (!(client.buttons & 1)) {
9451
9333
  client.gun_frame = FRAME_IDLE_LAST + 1;
9452
9334
  client.weaponstate = 0 /* WEAPON_READY */;
9335
+ if (client.newWeapon) {
9336
+ ChangeWeapon(ent, client.newWeapon);
9337
+ return;
9338
+ }
9453
9339
  }
9454
9340
  client.weapon_think_time = sys.timeSeconds + Weapon_AnimationTime(ent);
9455
9341
  } else {
@@ -9474,12 +9360,20 @@ function Throw_Generic(ent, FRAME_FIRE_LAST, FRAME_IDLE_LAST, FRAME_THROW_FIRST,
9474
9360
  return;
9475
9361
  }
9476
9362
  client.weapon_think_time = time + 0.1;
9363
+ if (client.weaponstate === 2 /* WEAPON_DROPPING */) {
9364
+ ChangeWeapon(ent);
9365
+ return;
9366
+ }
9477
9367
  if (client.weaponstate === 0 /* WEAPON_READY */) {
9478
9368
  if (client.buttons & 1) {
9479
9369
  client.weaponstate = 3 /* WEAPON_FIRING */;
9480
9370
  client.gun_frame = FRAME_THROW_FIRST;
9481
9371
  return;
9482
9372
  }
9373
+ if (client.newWeapon) {
9374
+ ChangeWeapon(ent, client.newWeapon);
9375
+ return;
9376
+ }
9483
9377
  if (client.gun_frame < FRAME_IDLE_LAST) {
9484
9378
  client.gun_frame++;
9485
9379
  return;
@@ -9526,6 +9420,10 @@ function Throw_Generic(ent, FRAME_FIRE_LAST, FRAME_IDLE_LAST, FRAME_THROW_FIRST,
9526
9420
  client.gun_frame = FRAME_FIRE_LAST + 1;
9527
9421
  client.grenade_time = 0;
9528
9422
  client.grenade_blew_up = false;
9423
+ if (client.newWeapon) {
9424
+ ChangeWeapon(ent, client.newWeapon);
9425
+ return;
9426
+ }
9529
9427
  }
9530
9428
  }
9531
9429
 
@@ -9591,8 +9489,6 @@ function shotgunThink(player, sys) {
9591
9489
  }
9592
9490
 
9593
9491
  // src/combat/weapons/supershotgun.ts
9594
- init_state();
9595
- init_playerInventory();
9596
9492
  var SSHOTGUN_PAUSE_FRAMES = [29, 42, 57];
9597
9493
  var SSHOTGUN_FIRE_FRAMES = [22, 28];
9598
9494
  function superShotgunThink(player, sys) {
@@ -9646,8 +9542,6 @@ function rocketLauncherThink(player, sys) {
9646
9542
  }
9647
9543
 
9648
9544
  // src/combat/weapons/hyperblaster.ts
9649
- init_state();
9650
- init_playerInventory();
9651
9545
  function hyperBlasterThink(player, sys) {
9652
9546
  const weaponState = player.client ? getWeaponState(player.client.weaponStates, WeaponId.HyperBlaster) : null;
9653
9547
  if (weaponState && (weaponState.heat || 0) > 0) {
@@ -9817,17 +9711,6 @@ function blasterThink(player, sys) {
9817
9711
  );
9818
9712
  }
9819
9713
 
9820
- // src/combat/weapons/chainfist.ts
9821
- init_esm();
9822
-
9823
- // src/combat/weapons/common.ts
9824
- function applyKick2(player, pitch, yaw = 0, kickOrigin = 0) {
9825
- if (player.client) {
9826
- player.client.kick_angles = { x: pitch, y: yaw, z: 0 };
9827
- player.client.kick_origin = { x: kickOrigin, y: 0, z: 0 };
9828
- }
9829
- }
9830
-
9831
9714
  // src/combat/weapons/chainfist.ts
9832
9715
  var CHAINFIST_REACH = 24;
9833
9716
  function firePlayerMeleeBoxFilter(check, data) {
@@ -9990,8 +9873,6 @@ function Weapon_ChainFist(player, sys) {
9990
9873
  }
9991
9874
 
9992
9875
  // src/combat/weapons/trap.ts
9993
- init_ammo();
9994
- init_esm();
9995
9876
  var TRAP_MINSPEED = 300;
9996
9877
  var TRAP_MAXSPEED = 700;
9997
9878
  function Trap_Think(player, sys) {
@@ -10374,7 +10255,6 @@ var FLAG_ITEMS = {
10374
10255
  };
10375
10256
 
10376
10257
  // src/entities/items/common.ts
10377
- init_esm();
10378
10258
  function handleItemPickup(game, self, other, respawnTime = 30) {
10379
10259
  if (!game.deathmatch) {
10380
10260
  game.entities.free(self);
@@ -10509,7 +10389,6 @@ function createKeyPickupEntity(game, keyItem) {
10509
10389
  }
10510
10390
 
10511
10391
  // src/entities/items/ammo.ts
10512
- init_ammo();
10513
10392
  var AMMO_DISPLAY_NAMES = {
10514
10393
  [AmmoItemId.Shells]: "Shells",
10515
10394
  [AmmoItemId.Bullets]: "Bullets",
@@ -10572,9 +10451,6 @@ function createPowerArmorPickupEntity(game, item) {
10572
10451
  };
10573
10452
  }
10574
10453
 
10575
- // src/modes/ctf/flag.ts
10576
- init_playerInventory();
10577
-
10578
10454
  // src/modes/ctf/state.ts
10579
10455
  function setFlagState(flag, newState, context) {
10580
10456
  flag.flagState = newState;
@@ -10641,7 +10517,6 @@ function createFlagPickupEntity(game, flagItem) {
10641
10517
  }
10642
10518
 
10643
10519
  // src/entities/items.ts
10644
- init_ammo();
10645
10520
  function registerItemSpawns(game, registry) {
10646
10521
  registry.register("item_foodcube", (entity) => {
10647
10522
  Object.assign(entity, createFoodCubePickupEntity(game));
@@ -10688,11 +10563,7 @@ function registerItemSpawns(game, registry) {
10688
10563
  }
10689
10564
  }
10690
10565
 
10691
- // src/entities/funcs.ts
10692
- init_esm();
10693
-
10694
10566
  // src/entities/gibs.ts
10695
- init_esm();
10696
10567
  var GIB_ORGANIC = 0;
10697
10568
  var GIB_METALLIC = 1;
10698
10569
  var GIB_DEBRIS = 2;
@@ -12147,14 +12018,7 @@ function registerLightSpawns(registry) {
12147
12018
  });
12148
12019
  }
12149
12020
 
12150
- // src/entities/monsters/berserk.ts
12151
- init_esm();
12152
-
12153
- // src/ai/rogue.ts
12154
- init_esm();
12155
-
12156
12021
  // src/entities/monsters/common.ts
12157
- init_esm();
12158
12022
  var MONSTER_TICK2 = 0.1;
12159
12023
  function generic_ai_stand(self, dist, context) {
12160
12024
  ai_stand(self, dist, context);
@@ -12965,7 +12829,6 @@ function registerBerserkSpawns(registry) {
12965
12829
  }
12966
12830
 
12967
12831
  // src/entities/monsters/attack.ts
12968
- init_esm();
12969
12832
  function getDamageScale(skill) {
12970
12833
  if (skill >= 3) return 1.5;
12971
12834
  if (skill === 2) return 1.25;
@@ -13177,7 +13040,6 @@ function monster_fire_flechette(self, start, dir, damage, speed, flashtype, cont
13177
13040
  }
13178
13041
 
13179
13042
  // src/entities/monsters/boss2.ts
13180
- init_esm();
13181
13043
  var MONSTER_TICK4 = 0.1;
13182
13044
  var BOSS2_HEALTH = 3e3;
13183
13045
  var BOSS2_MASS = 1e3;
@@ -13382,7 +13244,6 @@ function registerBoss2Spawns(registry) {
13382
13244
  }
13383
13245
 
13384
13246
  // src/entities/monsters/brain.ts
13385
- init_esm();
13386
13247
  var MONSTER_TICK5 = 0.1;
13387
13248
  var MELEE_DISTANCE2 = 80;
13388
13249
  function monster_ai_stand3(self, dist, context) {
@@ -13923,7 +13784,6 @@ function registerBrainSpawns(registry) {
13923
13784
  }
13924
13785
 
13925
13786
  // src/entities/monsters/chick.ts
13926
- init_esm();
13927
13787
  var MONSTER_TICK6 = 0.1;
13928
13788
  var MELEE_DISTANCE3 = 80;
13929
13789
  function monster_ai_stand4(self, dist, context) {
@@ -14513,7 +14373,6 @@ function registerFlipperSpawns(registry) {
14513
14373
  }
14514
14374
 
14515
14375
  // src/entities/monsters/floater.ts
14516
- init_esm();
14517
14376
  var MONSTER_TICK8 = 0.1;
14518
14377
  function monster_ai_stand6(self, dist, context) {
14519
14378
  ai_stand(self, dist, context);
@@ -14674,7 +14533,6 @@ function registerFloaterSpawns(registry) {
14674
14533
  }
14675
14534
 
14676
14535
  // src/entities/monsters/flyer.ts
14677
- init_esm();
14678
14536
  var MONSTER_TICK9 = 0.1;
14679
14537
  function monster_ai_stand7(self, dist, context) {
14680
14538
  ai_stand(self, dist, context);
@@ -14856,7 +14714,6 @@ function registerFlyerSpawns(registry) {
14856
14714
  }
14857
14715
 
14858
14716
  // src/entities/monsters/gladiator.ts
14859
- init_esm();
14860
14717
  var MONSTER_TICK10 = 0.1;
14861
14718
  function monster_ai_stand8(self, dist, context) {
14862
14719
  ai_stand(self, dist, context);
@@ -15064,7 +14921,6 @@ function registerGladiatorSpawns(registry) {
15064
14921
  }
15065
14922
 
15066
14923
  // src/entities/monsters/gunner.ts
15067
- init_esm();
15068
14924
  var MONSTER_TICK11 = 0.1;
15069
14925
  var GUNNER_HEALTH = 175;
15070
14926
  var GUNNER_MASS = 200;
@@ -15497,7 +15353,6 @@ function registerGunnerSpawns(registry) {
15497
15353
  }
15498
15354
 
15499
15355
  // src/entities/monsters/hover.ts
15500
- init_esm();
15501
15356
  var MONSTER_TICK12 = 0.1;
15502
15357
  function monster_ai_stand10(self, dist, context) {
15503
15358
  ai_stand(self, dist, context);
@@ -15655,7 +15510,6 @@ function registerHoverSpawns(registry) {
15655
15510
  }
15656
15511
 
15657
15512
  // src/entities/monsters/icarus.ts
15658
- init_esm();
15659
15513
  var MONSTER_TICK13 = 0.1;
15660
15514
  function monster_ai_stand11(self, dist, context) {
15661
15515
  ai_stand(self, dist, context);
@@ -15813,7 +15667,6 @@ function registerIcarusSpawns(registry) {
15813
15667
  }
15814
15668
 
15815
15669
  // src/entities/monsters/infantry.ts
15816
- init_esm();
15817
15670
  var MONSTER_TICK14 = 0.1;
15818
15671
  var INFANTRY_HEALTH = 100;
15819
15672
  var INFANTRY_MASS = 200;
@@ -16032,7 +15885,6 @@ function registerInfantrySpawns(registry) {
16032
15885
  }
16033
15886
 
16034
15887
  // src/entities/monsters/makron.ts
16035
- init_esm();
16036
15888
  var MONSTER_TICK15 = 0.1;
16037
15889
  var MAKRON_BFG_OFFSET = { x: 30, y: 28, z: 24 };
16038
15890
  var MAKRON_BLASTER_OFFSET_1 = { x: 26, y: 16, z: 24 };
@@ -16282,7 +16134,6 @@ function registerMakronSpawns(registry) {
16282
16134
  }
16283
16135
 
16284
16136
  // src/entities/monsters/jorg.ts
16285
- init_esm();
16286
16137
  var MONSTER_TICK16 = 0.1;
16287
16138
  var JORG_HEALTH = 3e3;
16288
16139
  var JORG_MASS = 1e3;
@@ -17224,8 +17075,6 @@ function registerInsaneSpawns(registry) {
17224
17075
  }
17225
17076
 
17226
17077
  // src/entities/monsters/actor.ts
17227
- init_esm();
17228
- init_esm();
17229
17078
  var MONSTER_TICK18 = 0.1;
17230
17079
  var MZ2_ACTOR_MACHINEGUN_1 = 0;
17231
17080
  var actor_names = [
@@ -17786,11 +17635,7 @@ function registerActorSpawns(registry) {
17786
17635
  registry.register("target_actor", SP_target_actor);
17787
17636
  }
17788
17637
 
17789
- // src/entities/monsters/medic.ts
17790
- init_esm();
17791
-
17792
17638
  // src/ai/spawn_utils.ts
17793
- init_esm();
17794
17639
  function checkSpawnPoint(origin, mins, maxs, context) {
17795
17640
  if (!mins || !maxs) return false;
17796
17641
  const trace = context.trace(origin, mins, maxs, origin, null, MASK_MONSTERSOLID);
@@ -18508,7 +18353,6 @@ function registerMedicSpawns(registry) {
18508
18353
  }
18509
18354
 
18510
18355
  // src/entities/monsters/mutant.ts
18511
- init_esm();
18512
18356
  var MONSTER_TICK20 = 0.1;
18513
18357
  function monster_ai_stand16(self, dist, context) {
18514
18358
  ai_stand(self, dist, context);
@@ -18897,7 +18741,6 @@ function registerMutantSpawns(registry) {
18897
18741
  }
18898
18742
 
18899
18743
  // src/entities/monsters/parasite.ts
18900
- init_esm();
18901
18744
  var MONSTER_TICK21 = 0.1;
18902
18745
  var PARASITE_HEALTH = 175;
18903
18746
  var PARASITE_MASS = 250;
@@ -19302,7 +19145,6 @@ function registerParasiteSpawns(registry) {
19302
19145
  }
19303
19146
 
19304
19147
  // src/entities/monsters/soldier.ts
19305
- init_esm();
19306
19148
  var MONSTER_TICK22 = 0.1;
19307
19149
  var SOLDIER_LIGHT = 1;
19308
19150
  var SOLDIER_SSG = 2;
@@ -19650,7 +19492,6 @@ function registerMonsterSpawns(registry) {
19650
19492
  }
19651
19493
 
19652
19494
  // src/entities/monsters/supertank.ts
19653
- init_esm();
19654
19495
  var MONSTER_TICK23 = 0.1;
19655
19496
  var SUPERTANK_MACHINEGUN_OFFSET = { x: 30, y: 30, z: 40 };
19656
19497
  var SUPERTANK_ROCKET_OFFSET = { x: 30, y: -30, z: 40 };
@@ -19879,7 +19720,6 @@ function registerSupertankSpawns(registry) {
19879
19720
  }
19880
19721
 
19881
19722
  // src/entities/monsters/tank.ts
19882
- init_esm();
19883
19723
  var MONSTER_TICK24 = 0.1;
19884
19724
  function tank_blind_check(self, context) {
19885
19725
  if (self.monsterinfo.aiflags & 2048 /* ManualSteering */) {
@@ -20251,7 +20091,6 @@ function registerTankCommanderSpawns(registry) {
20251
20091
  }
20252
20092
 
20253
20093
  // src/entities/monsters/turret.ts
20254
- init_esm();
20255
20094
  var MONSTER_TICK25 = 0.1;
20256
20095
  function monster_ai_stand21(self, dist, context) {
20257
20096
  ai_stand(self, dist, context);
@@ -20403,7 +20242,6 @@ function registerTurretSpawns(registry) {
20403
20242
  }
20404
20243
 
20405
20244
  // src/entities/monsters/gekk.ts
20406
- init_esm();
20407
20245
  var MONSTER_TICK26 = 0.1;
20408
20246
  function monster_ai_stand22(self, dist, context) {
20409
20247
  ai_stand(self, dist, context);
@@ -21044,7 +20882,6 @@ function registerGekkSpawns(registry) {
21044
20882
  }
21045
20883
 
21046
20884
  // src/entities/monsters/fixbot.ts
21047
- init_esm();
21048
20885
  var MONSTER_TICK27 = 0.1;
21049
20886
  function monster_ai_walk21(self, dist, context) {
21050
20887
  ai_walk(self, dist, context);
@@ -21330,7 +21167,6 @@ function registerFixbotSpawns(registry) {
21330
21167
  }
21331
21168
 
21332
21169
  // src/entities/monsters/arachnid.ts
21333
- init_esm();
21334
21170
  var FRAME_rails1 = 0;
21335
21171
  var FRAME_rails4 = 3;
21336
21172
  var FRAME_rails8 = 7;
@@ -21712,7 +21548,6 @@ function registerArachnidSpawns(registry) {
21712
21548
  }
21713
21549
 
21714
21550
  // src/entities/monsters/gunnerCommander.ts
21715
- init_esm();
21716
21551
  var MONSTER_TICK28 = 0.1;
21717
21552
  var MORTAR_SPEED = 850;
21718
21553
  var GRENADE_SPEED = 600;
@@ -22575,7 +22410,6 @@ function registerGunCommanderSpawns(registry) {
22575
22410
  }
22576
22411
 
22577
22412
  // src/entities/monsters/guardian.ts
22578
- init_esm();
22579
22413
  var MONSTER_TICK29 = 0.1;
22580
22414
  var MELEE_DISTANCE6 = 80;
22581
22415
  var FRAME_idle12 = 76;
@@ -23021,7 +22855,6 @@ function registerGuardianSpawns(registry) {
23021
22855
  }
23022
22856
 
23023
22857
  // src/entities/monsters/rogue/stalker.ts
23024
- init_esm();
23025
22858
  function has_valid_enemy(self) {
23026
22859
  return self.enemy !== null && self.enemy.health > 0;
23027
22860
  }
@@ -23502,7 +23335,6 @@ function SP_monster_stalker(self, context) {
23502
23335
  }
23503
23336
 
23504
23337
  // src/entities/monsters/shambler.ts
23505
- init_esm();
23506
23338
  var MONSTER_TICK30 = 0.1;
23507
23339
  var MODEL_SCALE2 = 1;
23508
23340
  var MELEE_DISTANCE8 = 80;
@@ -23919,7 +23751,6 @@ function registerShamblerSpawns(registry) {
23919
23751
  }
23920
23752
 
23921
23753
  // src/entities/monsters/rogue/widow.ts
23922
- init_esm();
23923
23754
  var MODEL_SCALE3 = 1;
23924
23755
  var RANGE_MELEE3 = 100;
23925
23756
  var SOUND_PAIN1 = "widow/pain1.wav";
@@ -24280,7 +24111,6 @@ function registerMonsterSpawns2(registry) {
24280
24111
  }
24281
24112
 
24282
24113
  // src/entities/worldspawn.ts
24283
- init_esm();
24284
24114
  function SP_worldspawn(self, context) {
24285
24115
  self.classname = "worldspawn";
24286
24116
  self.movetype = 2 /* Push */;
@@ -24310,7 +24140,6 @@ function registerWorldSpawn(registry) {
24310
24140
  }
24311
24141
 
24312
24142
  // src/entities/camera.ts
24313
- init_esm();
24314
24143
  var CAMERA_TELEPORT_OUT = 2;
24315
24144
  var CAMERA_SKIPPABLE = 64;
24316
24145
  function camera_lookat_pathtarget(self, origin, dest, context) {
@@ -24881,9 +24710,6 @@ var LevelClock = class {
24881
24710
  }
24882
24711
  };
24883
24712
 
24884
- // src/save/save.ts
24885
- init_esm();
24886
-
24887
24713
  // src/checksum.ts
24888
24714
  var FNV_OFFSET_BASIS = 2166136261;
24889
24715
  var FNV_PRIME = 16777619;
@@ -25380,7 +25206,6 @@ function applySaveFile(save, targets) {
25380
25206
  }
25381
25207
 
25382
25208
  // src/save/rerelease.ts
25383
- init_esm();
25384
25209
  function ensureObject2(value, label) {
25385
25210
  if (!value || typeof value !== "object" || Array.isArray(value)) {
25386
25211
  throw new Error(`${label} must be an object`);
@@ -25803,9 +25628,6 @@ _SaveStorage.DEFAULT_STORE = "saves";
25803
25628
  _SaveStorage.QUICK_SLOT = "quicksave";
25804
25629
  var SaveStorage = _SaveStorage;
25805
25630
 
25806
- // src/index.ts
25807
- init_esm();
25808
-
25809
25631
  // src/ai/noise.ts
25810
25632
  var PNOISE_SELF = 0;
25811
25633
  var PNOISE_WEAPON = 1;
@@ -25863,12 +25685,7 @@ function PlayerNoise(who, where, type, context) {
25863
25685
  }
25864
25686
  }
25865
25687
 
25866
- // src/entities/player.ts
25867
- init_playerInventory();
25868
-
25869
25688
  // src/combat/obituary.ts
25870
- init_esm();
25871
- init_esm();
25872
25689
  var random4 = createRandomGenerator();
25873
25690
  var PRINT_MEDIUM = 1;
25874
25691
  function getGender(ent) {
@@ -26024,9 +25841,6 @@ function ClientObituary(self, inflictor, attacker, mod, sys) {
26024
25841
  }
26025
25842
  }
26026
25843
 
26027
- // src/modes/ctf/integration.ts
26028
- init_playerInventory();
26029
-
26030
25844
  // src/modes/ctf/drop.ts
26031
25845
  function dropFlag(flag, origin, game, context) {
26032
25846
  if (flag.flagState !== 1 /* CARRIED */) {
@@ -26235,8 +26049,6 @@ function player_think(self, sys) {
26235
26049
  }
26236
26050
 
26237
26051
  // src/entities/playerStats.ts
26238
- init_esm();
26239
- init_playerInventory();
26240
26052
  var POWERUP_TIMERS = [
26241
26053
  { id: PowerupId.QuadDamage, priority: 1 },
26242
26054
  { id: PowerupId.Invulnerability, priority: 2 },
@@ -26302,9 +26114,6 @@ function populatePlayerStats(player, timeSeconds) {
26302
26114
  return statArray;
26303
26115
  }
26304
26116
 
26305
- // src/index.ts
26306
- init_esm();
26307
-
26308
26117
  // src/save/adapter.ts
26309
26118
  function createSerializedGameState(context) {
26310
26119
  const { entitySystem, levelClock, random: random5 } = context;