quake2ts 0.0.407 → 0.0.410

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 (43) 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 +463 -74
  5. package/packages/client/dist/cjs/index.cjs.map +1 -1
  6. package/packages/client/dist/esm/index.js +463 -74
  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/demo/handler.d.ts +3 -0
  10. package/packages/client/dist/types/demo/handler.d.ts.map +1 -1
  11. package/packages/client/dist/types/effects-system.d.ts +17 -0
  12. package/packages/client/dist/types/effects-system.d.ts.map +1 -0
  13. package/packages/client/dist/types/index.d.ts +2 -0
  14. package/packages/client/dist/types/index.d.ts.map +1 -1
  15. package/packages/client/dist/types/net/connection.d.ts +21 -4
  16. package/packages/client/dist/types/net/connection.d.ts.map +1 -1
  17. package/packages/engine/dist/browser/index.global.js +14 -14
  18. package/packages/engine/dist/browser/index.global.js.map +1 -1
  19. package/packages/engine/dist/cjs/index.cjs +91 -7
  20. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  21. package/packages/engine/dist/esm/index.js +90 -7
  22. package/packages/engine/dist/esm/index.js.map +1 -1
  23. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  24. package/packages/engine/dist/types/assets/headlessLoader.d.ts +11 -0
  25. package/packages/engine/dist/types/assets/headlessLoader.d.ts.map +1 -0
  26. package/packages/engine/dist/types/index.d.ts +1 -1
  27. package/packages/engine/dist/types/index.d.ts.map +1 -1
  28. package/packages/engine/dist/types/render/bsp/generator.d.ts +25 -0
  29. package/packages/engine/dist/types/render/bsp/generator.d.ts.map +1 -0
  30. package/packages/engine/dist/types/render/bsp/geometry.d.ts.map +1 -1
  31. package/packages/engine/dist/types/render/camera.d.ts +11 -0
  32. package/packages/engine/dist/types/render/camera.d.ts.map +1 -1
  33. package/packages/engine/dist/types/render/cameraController.d.ts +23 -0
  34. package/packages/engine/dist/types/render/cameraController.d.ts.map +1 -0
  35. package/packages/engine/dist/types/render/debug.d.ts +20 -0
  36. package/packages/engine/dist/types/render/debug.d.ts.map +1 -0
  37. package/packages/engine/dist/types/render/options.d.ts +9 -0
  38. package/packages/engine/dist/types/render/options.d.ts.map +1 -0
  39. package/packages/engine/dist/types/render/renderer.d.ts +4 -1
  40. package/packages/engine/dist/types/render/renderer.d.ts.map +1 -1
  41. package/packages/engine/dist/types/render/types.d.ts +22 -0
  42. package/packages/engine/dist/types/render/types.d.ts.map +1 -0
  43. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
@@ -1880,6 +1880,7 @@ var DEG_TO_RAD = Math.PI / 180;
1880
1880
  var DEG2RAD_FACTOR = Math.PI / 180;
1881
1881
  var RAD2DEG_FACTOR = 180 / Math.PI;
1882
1882
  var DEG2RAD = DEG2RAD_FACTOR;
1883
+ var RAD2DEG = RAD2DEG_FACTOR;
1883
1884
  var ANORMS = [
1884
1885
  [-0.525731, 0, 0.850651],
1885
1886
  [-0.442863, 0.238856, 0.864188],
@@ -2220,72 +2221,72 @@ var ServerCommand = /* @__PURE__ */ ((ServerCommand22) => {
2220
2221
  ServerCommand22[ServerCommand22["achievement"] = 33] = "achievement";
2221
2222
  return ServerCommand22;
2222
2223
  })(ServerCommand || {});
2223
- var TempEntity = /* @__PURE__ */ ((TempEntity2) => {
2224
- TempEntity2[TempEntity2["GUNSHOT"] = 0] = "GUNSHOT";
2225
- TempEntity2[TempEntity2["BLOOD"] = 1] = "BLOOD";
2226
- TempEntity2[TempEntity2["BLASTER"] = 2] = "BLASTER";
2227
- TempEntity2[TempEntity2["RAILTRAIL"] = 3] = "RAILTRAIL";
2228
- TempEntity2[TempEntity2["SHOTGUN"] = 4] = "SHOTGUN";
2229
- TempEntity2[TempEntity2["EXPLOSION1"] = 5] = "EXPLOSION1";
2230
- TempEntity2[TempEntity2["EXPLOSION2"] = 6] = "EXPLOSION2";
2231
- TempEntity2[TempEntity2["ROCKET_EXPLOSION"] = 7] = "ROCKET_EXPLOSION";
2232
- TempEntity2[TempEntity2["GRENADE_EXPLOSION"] = 8] = "GRENADE_EXPLOSION";
2233
- TempEntity2[TempEntity2["SPARKS"] = 9] = "SPARKS";
2234
- TempEntity2[TempEntity2["SPLASH"] = 10] = "SPLASH";
2235
- TempEntity2[TempEntity2["BUBBLETRAIL"] = 11] = "BUBBLETRAIL";
2236
- TempEntity2[TempEntity2["SCREEN_SPARKS"] = 12] = "SCREEN_SPARKS";
2237
- TempEntity2[TempEntity2["SHIELD_SPARKS"] = 13] = "SHIELD_SPARKS";
2238
- TempEntity2[TempEntity2["BULLET_SPARKS"] = 14] = "BULLET_SPARKS";
2239
- TempEntity2[TempEntity2["LASER_SPARKS"] = 15] = "LASER_SPARKS";
2240
- TempEntity2[TempEntity2["PARASITE_ATTACK"] = 16] = "PARASITE_ATTACK";
2241
- TempEntity2[TempEntity2["ROCKET_EXPLOSION_WATER"] = 17] = "ROCKET_EXPLOSION_WATER";
2242
- TempEntity2[TempEntity2["GRENADE_EXPLOSION_WATER"] = 18] = "GRENADE_EXPLOSION_WATER";
2243
- TempEntity2[TempEntity2["MEDIC_CABLE_ATTACK"] = 19] = "MEDIC_CABLE_ATTACK";
2244
- TempEntity2[TempEntity2["BFG_EXPLOSION"] = 20] = "BFG_EXPLOSION";
2245
- TempEntity2[TempEntity2["BFG_BIGEXPLOSION"] = 21] = "BFG_BIGEXPLOSION";
2246
- TempEntity2[TempEntity2["BOSSTPORT"] = 22] = "BOSSTPORT";
2247
- TempEntity2[TempEntity2["BFG_LASER"] = 23] = "BFG_LASER";
2248
- TempEntity2[TempEntity2["GRAPPLE_CABLE"] = 24] = "GRAPPLE_CABLE";
2249
- TempEntity2[TempEntity2["WELDING_SPARKS"] = 25] = "WELDING_SPARKS";
2250
- TempEntity2[TempEntity2["GREENBLOOD"] = 26] = "GREENBLOOD";
2251
- TempEntity2[TempEntity2["BLUEHYPERBLASTER"] = 27] = "BLUEHYPERBLASTER";
2252
- TempEntity2[TempEntity2["PLASMA_EXPLOSION"] = 28] = "PLASMA_EXPLOSION";
2253
- TempEntity2[TempEntity2["TUNNEL_SPARKS"] = 29] = "TUNNEL_SPARKS";
2254
- TempEntity2[TempEntity2["BLASTER2"] = 30] = "BLASTER2";
2255
- TempEntity2[TempEntity2["RAILTRAIL2"] = 31] = "RAILTRAIL2";
2256
- TempEntity2[TempEntity2["FLAME"] = 32] = "FLAME";
2257
- TempEntity2[TempEntity2["LIGHTNING"] = 33] = "LIGHTNING";
2258
- TempEntity2[TempEntity2["DEBUGTRAIL"] = 34] = "DEBUGTRAIL";
2259
- TempEntity2[TempEntity2["PLAIN_EXPLOSION"] = 35] = "PLAIN_EXPLOSION";
2260
- TempEntity2[TempEntity2["FLASHLIGHT"] = 36] = "FLASHLIGHT";
2261
- TempEntity2[TempEntity2["FORCEWALL"] = 37] = "FORCEWALL";
2262
- TempEntity2[TempEntity2["HEATBEAM"] = 38] = "HEATBEAM";
2263
- TempEntity2[TempEntity2["MONSTER_HEATBEAM"] = 39] = "MONSTER_HEATBEAM";
2264
- TempEntity2[TempEntity2["STEAM"] = 40] = "STEAM";
2265
- TempEntity2[TempEntity2["BUBBLETRAIL2"] = 41] = "BUBBLETRAIL2";
2266
- TempEntity2[TempEntity2["MOREBLOOD"] = 42] = "MOREBLOOD";
2267
- TempEntity2[TempEntity2["HEATBEAM_SPARKS"] = 43] = "HEATBEAM_SPARKS";
2268
- TempEntity2[TempEntity2["HEATBEAM_STEAM"] = 44] = "HEATBEAM_STEAM";
2269
- TempEntity2[TempEntity2["CHAINFIST_SMOKE"] = 45] = "CHAINFIST_SMOKE";
2270
- TempEntity2[TempEntity2["ELECTRIC_SPARKS"] = 46] = "ELECTRIC_SPARKS";
2271
- TempEntity2[TempEntity2["TRACKER_EXPLOSION"] = 47] = "TRACKER_EXPLOSION";
2272
- TempEntity2[TempEntity2["TELEPORT_EFFECT"] = 48] = "TELEPORT_EFFECT";
2273
- TempEntity2[TempEntity2["DBALL_GOAL"] = 49] = "DBALL_GOAL";
2274
- TempEntity2[TempEntity2["WIDOWBEAMOUT"] = 50] = "WIDOWBEAMOUT";
2275
- TempEntity2[TempEntity2["NUKEBLAST"] = 51] = "NUKEBLAST";
2276
- TempEntity2[TempEntity2["WIDOWSPLASH"] = 52] = "WIDOWSPLASH";
2277
- TempEntity2[TempEntity2["EXPLOSION1_BIG"] = 53] = "EXPLOSION1_BIG";
2278
- TempEntity2[TempEntity2["EXPLOSION1_NP"] = 54] = "EXPLOSION1_NP";
2279
- TempEntity2[TempEntity2["FLECHETTE"] = 55] = "FLECHETTE";
2280
- TempEntity2[TempEntity2["BLUEHYPERBLASTER_KEX"] = 56] = "BLUEHYPERBLASTER_KEX";
2281
- TempEntity2[TempEntity2["BFG_ZAP"] = 57] = "BFG_ZAP";
2282
- TempEntity2[TempEntity2["BERSERK_SLAM"] = 58] = "BERSERK_SLAM";
2283
- TempEntity2[TempEntity2["GRAPPLE_CABLE_2"] = 59] = "GRAPPLE_CABLE_2";
2284
- TempEntity2[TempEntity2["POWER_SPLASH"] = 60] = "POWER_SPLASH";
2285
- TempEntity2[TempEntity2["LIGHTNING_BEAM"] = 61] = "LIGHTNING_BEAM";
2286
- TempEntity2[TempEntity2["EXPLOSION1_NL"] = 62] = "EXPLOSION1_NL";
2287
- TempEntity2[TempEntity2["EXPLOSION2_NL"] = 63] = "EXPLOSION2_NL";
2288
- return TempEntity2;
2224
+ var TempEntity = /* @__PURE__ */ ((TempEntity22) => {
2225
+ TempEntity22[TempEntity22["GUNSHOT"] = 0] = "GUNSHOT";
2226
+ TempEntity22[TempEntity22["BLOOD"] = 1] = "BLOOD";
2227
+ TempEntity22[TempEntity22["BLASTER"] = 2] = "BLASTER";
2228
+ TempEntity22[TempEntity22["RAILTRAIL"] = 3] = "RAILTRAIL";
2229
+ TempEntity22[TempEntity22["SHOTGUN"] = 4] = "SHOTGUN";
2230
+ TempEntity22[TempEntity22["EXPLOSION1"] = 5] = "EXPLOSION1";
2231
+ TempEntity22[TempEntity22["EXPLOSION2"] = 6] = "EXPLOSION2";
2232
+ TempEntity22[TempEntity22["ROCKET_EXPLOSION"] = 7] = "ROCKET_EXPLOSION";
2233
+ TempEntity22[TempEntity22["GRENADE_EXPLOSION"] = 8] = "GRENADE_EXPLOSION";
2234
+ TempEntity22[TempEntity22["SPARKS"] = 9] = "SPARKS";
2235
+ TempEntity22[TempEntity22["SPLASH"] = 10] = "SPLASH";
2236
+ TempEntity22[TempEntity22["BUBBLETRAIL"] = 11] = "BUBBLETRAIL";
2237
+ TempEntity22[TempEntity22["SCREEN_SPARKS"] = 12] = "SCREEN_SPARKS";
2238
+ TempEntity22[TempEntity22["SHIELD_SPARKS"] = 13] = "SHIELD_SPARKS";
2239
+ TempEntity22[TempEntity22["BULLET_SPARKS"] = 14] = "BULLET_SPARKS";
2240
+ TempEntity22[TempEntity22["LASER_SPARKS"] = 15] = "LASER_SPARKS";
2241
+ TempEntity22[TempEntity22["PARASITE_ATTACK"] = 16] = "PARASITE_ATTACK";
2242
+ TempEntity22[TempEntity22["ROCKET_EXPLOSION_WATER"] = 17] = "ROCKET_EXPLOSION_WATER";
2243
+ TempEntity22[TempEntity22["GRENADE_EXPLOSION_WATER"] = 18] = "GRENADE_EXPLOSION_WATER";
2244
+ TempEntity22[TempEntity22["MEDIC_CABLE_ATTACK"] = 19] = "MEDIC_CABLE_ATTACK";
2245
+ TempEntity22[TempEntity22["BFG_EXPLOSION"] = 20] = "BFG_EXPLOSION";
2246
+ TempEntity22[TempEntity22["BFG_BIGEXPLOSION"] = 21] = "BFG_BIGEXPLOSION";
2247
+ TempEntity22[TempEntity22["BOSSTPORT"] = 22] = "BOSSTPORT";
2248
+ TempEntity22[TempEntity22["BFG_LASER"] = 23] = "BFG_LASER";
2249
+ TempEntity22[TempEntity22["GRAPPLE_CABLE"] = 24] = "GRAPPLE_CABLE";
2250
+ TempEntity22[TempEntity22["WELDING_SPARKS"] = 25] = "WELDING_SPARKS";
2251
+ TempEntity22[TempEntity22["GREENBLOOD"] = 26] = "GREENBLOOD";
2252
+ TempEntity22[TempEntity22["BLUEHYPERBLASTER"] = 27] = "BLUEHYPERBLASTER";
2253
+ TempEntity22[TempEntity22["PLASMA_EXPLOSION"] = 28] = "PLASMA_EXPLOSION";
2254
+ TempEntity22[TempEntity22["TUNNEL_SPARKS"] = 29] = "TUNNEL_SPARKS";
2255
+ TempEntity22[TempEntity22["BLASTER2"] = 30] = "BLASTER2";
2256
+ TempEntity22[TempEntity22["RAILTRAIL2"] = 31] = "RAILTRAIL2";
2257
+ TempEntity22[TempEntity22["FLAME"] = 32] = "FLAME";
2258
+ TempEntity22[TempEntity22["LIGHTNING"] = 33] = "LIGHTNING";
2259
+ TempEntity22[TempEntity22["DEBUGTRAIL"] = 34] = "DEBUGTRAIL";
2260
+ TempEntity22[TempEntity22["PLAIN_EXPLOSION"] = 35] = "PLAIN_EXPLOSION";
2261
+ TempEntity22[TempEntity22["FLASHLIGHT"] = 36] = "FLASHLIGHT";
2262
+ TempEntity22[TempEntity22["FORCEWALL"] = 37] = "FORCEWALL";
2263
+ TempEntity22[TempEntity22["HEATBEAM"] = 38] = "HEATBEAM";
2264
+ TempEntity22[TempEntity22["MONSTER_HEATBEAM"] = 39] = "MONSTER_HEATBEAM";
2265
+ TempEntity22[TempEntity22["STEAM"] = 40] = "STEAM";
2266
+ TempEntity22[TempEntity22["BUBBLETRAIL2"] = 41] = "BUBBLETRAIL2";
2267
+ TempEntity22[TempEntity22["MOREBLOOD"] = 42] = "MOREBLOOD";
2268
+ TempEntity22[TempEntity22["HEATBEAM_SPARKS"] = 43] = "HEATBEAM_SPARKS";
2269
+ TempEntity22[TempEntity22["HEATBEAM_STEAM"] = 44] = "HEATBEAM_STEAM";
2270
+ TempEntity22[TempEntity22["CHAINFIST_SMOKE"] = 45] = "CHAINFIST_SMOKE";
2271
+ TempEntity22[TempEntity22["ELECTRIC_SPARKS"] = 46] = "ELECTRIC_SPARKS";
2272
+ TempEntity22[TempEntity22["TRACKER_EXPLOSION"] = 47] = "TRACKER_EXPLOSION";
2273
+ TempEntity22[TempEntity22["TELEPORT_EFFECT"] = 48] = "TELEPORT_EFFECT";
2274
+ TempEntity22[TempEntity22["DBALL_GOAL"] = 49] = "DBALL_GOAL";
2275
+ TempEntity22[TempEntity22["WIDOWBEAMOUT"] = 50] = "WIDOWBEAMOUT";
2276
+ TempEntity22[TempEntity22["NUKEBLAST"] = 51] = "NUKEBLAST";
2277
+ TempEntity22[TempEntity22["WIDOWSPLASH"] = 52] = "WIDOWSPLASH";
2278
+ TempEntity22[TempEntity22["EXPLOSION1_BIG"] = 53] = "EXPLOSION1_BIG";
2279
+ TempEntity22[TempEntity22["EXPLOSION1_NP"] = 54] = "EXPLOSION1_NP";
2280
+ TempEntity22[TempEntity22["FLECHETTE"] = 55] = "FLECHETTE";
2281
+ TempEntity22[TempEntity22["BLUEHYPERBLASTER_KEX"] = 56] = "BLUEHYPERBLASTER_KEX";
2282
+ TempEntity22[TempEntity22["BFG_ZAP"] = 57] = "BFG_ZAP";
2283
+ TempEntity22[TempEntity22["BERSERK_SLAM"] = 58] = "BERSERK_SLAM";
2284
+ TempEntity22[TempEntity22["GRAPPLE_CABLE_2"] = 59] = "GRAPPLE_CABLE_2";
2285
+ TempEntity22[TempEntity22["POWER_SPLASH"] = 60] = "POWER_SPLASH";
2286
+ TempEntity22[TempEntity22["LIGHTNING_BEAM"] = 61] = "LIGHTNING_BEAM";
2287
+ TempEntity22[TempEntity22["EXPLOSION1_NL"] = 62] = "EXPLOSION1_NL";
2288
+ TempEntity22[TempEntity22["EXPLOSION2_NL"] = 63] = "EXPLOSION2_NL";
2289
+ return TempEntity22;
2289
2290
  })(TempEntity || {});
2290
2291
  var AMMO_MAX = 12;
2291
2292
  var NUM_BITS_FOR_AMMO = 9;
@@ -3096,6 +3097,43 @@ var BSP_VERTEX_LAYOUT = [
3096
3097
  { index: 2, size: 2, type: 5126, stride: STRIDE, offset: 5 * FLOAT_BYTES }
3097
3098
  ];
3098
3099
  var MAX_DLIGHTS = 32;
3100
+ var DynamicLightManager = class {
3101
+ constructor() {
3102
+ this.lights = [];
3103
+ }
3104
+ /**
3105
+ * Adds a dynamic light or updates an existing one with the same key.
3106
+ */
3107
+ addLight(dlight, time) {
3108
+ if (dlight.key !== void 0) {
3109
+ const index = this.lights.findIndex((l) => l.key === dlight.key);
3110
+ if (index !== -1) {
3111
+ this.lights[index] = dlight;
3112
+ return;
3113
+ }
3114
+ }
3115
+ this.lights.push(dlight);
3116
+ }
3117
+ /**
3118
+ * Clears all lights (e.g., map change).
3119
+ */
3120
+ clear() {
3121
+ this.lights = [];
3122
+ }
3123
+ /**
3124
+ * Updates the list of active lights, removing expired ones.
3125
+ * @param time Current game time in seconds.
3126
+ */
3127
+ update(time) {
3128
+ this.lights = this.lights.filter((l) => l.die > time);
3129
+ }
3130
+ /**
3131
+ * Returns the current list of active lights.
3132
+ */
3133
+ getActiveLights() {
3134
+ return this.lights;
3135
+ }
3136
+ };
3099
3137
  var BSP_SURFACE_FRAGMENT_SOURCE = `#version 300 es
3100
3138
  precision highp float;
3101
3139
 
@@ -3403,15 +3441,21 @@ var Camera = class {
3403
3441
  return this._position;
3404
3442
  }
3405
3443
  set position(value) {
3406
- vec3_exports.copy(this._position, value);
3407
- this._dirty = true;
3444
+ if (!vec3_exports.equals(this._position, value)) {
3445
+ vec3_exports.copy(this._position, value);
3446
+ this._dirty = true;
3447
+ this.triggerMoveEvent();
3448
+ }
3408
3449
  }
3409
3450
  get angles() {
3410
3451
  return this._angles;
3411
3452
  }
3412
3453
  set angles(value) {
3413
- vec3_exports.copy(this._angles, value);
3414
- this._dirty = true;
3454
+ if (!vec3_exports.equals(this._angles, value)) {
3455
+ vec3_exports.copy(this._angles, value);
3456
+ this._dirty = true;
3457
+ this.triggerMoveEvent();
3458
+ }
3415
3459
  }
3416
3460
  get bobAngles() {
3417
3461
  return this._bobAngles;
@@ -3455,6 +3499,47 @@ var Camera = class {
3455
3499
  this._aspect = value;
3456
3500
  this._dirty = true;
3457
3501
  }
3502
+ // API Methods
3503
+ setPosition(x, y, z) {
3504
+ const newPos = vec3_exports.fromValues(x, y, z);
3505
+ if (!vec3_exports.equals(this._position, newPos)) {
3506
+ vec3_exports.copy(this._position, newPos);
3507
+ this._dirty = true;
3508
+ this.triggerMoveEvent();
3509
+ }
3510
+ }
3511
+ setRotation(pitch, yaw, roll) {
3512
+ const newAngles = vec3_exports.fromValues(pitch, yaw, roll);
3513
+ if (!vec3_exports.equals(this._angles, newAngles)) {
3514
+ vec3_exports.copy(this._angles, newAngles);
3515
+ this._dirty = true;
3516
+ this.triggerMoveEvent();
3517
+ }
3518
+ }
3519
+ setFov(fov) {
3520
+ this.fov = fov;
3521
+ }
3522
+ setAspectRatio(aspect) {
3523
+ this.aspect = aspect;
3524
+ }
3525
+ lookAt(target) {
3526
+ const direction = vec3_exports.create();
3527
+ vec3_exports.subtract(direction, target, this._position);
3528
+ const len2 = vec3_exports.length(direction);
3529
+ if (len2 < 1e-3) return;
3530
+ const yaw = Math.atan2(direction[1], direction[0]) * RAD2DEG;
3531
+ const hyp = Math.hypot(direction[0], direction[1]);
3532
+ const pitch = -Math.atan2(direction[2], hyp) * RAD2DEG;
3533
+ this.setRotation(pitch, yaw, 0);
3534
+ }
3535
+ triggerMoveEvent() {
3536
+ if (this.onCameraMove) {
3537
+ this.onCameraMove({
3538
+ position: vec3_exports.clone(this._position),
3539
+ angles: vec3_exports.clone(this._angles)
3540
+ });
3541
+ }
3542
+ }
3458
3543
  get viewMatrix() {
3459
3544
  this.updateMatrices();
3460
3545
  return this._viewMatrix;
@@ -3530,11 +3615,8 @@ var Camera = class {
3530
3615
  vec3_exports.transformMat4(rotatedPosQuake, negativePosition, rotationQuake);
3531
3616
  const translationGl = vec3_exports.fromValues(
3532
3617
  rotatedPosQuake[1] || 0,
3533
- // Y in Quake -> X in WebGL (negation already applied above)
3534
3618
  rotatedPosQuake[2] || 0,
3535
- // Z in Quake -> Y in WebGL
3536
3619
  rotatedPosQuake[0] || 0
3537
- // X in Quake -> Z in WebGL (negation already applied above)
3538
3620
  );
3539
3621
  mat4_exports.copy(this._viewMatrix, rotationGl);
3540
3622
  this._viewMatrix[12] = translationGl[0];
@@ -9895,6 +9977,73 @@ var ClientCommand = /* @__PURE__ */ ((ClientCommand2) => {
9895
9977
  ClientCommand2[ClientCommand2["stringcmd"] = 4] = "stringcmd";
9896
9978
  return ClientCommand2;
9897
9979
  })(ClientCommand || {});
9980
+ var TempEntity2 = /* @__PURE__ */ ((TempEntity22) => {
9981
+ TempEntity22[TempEntity22["GUNSHOT"] = 0] = "GUNSHOT";
9982
+ TempEntity22[TempEntity22["BLOOD"] = 1] = "BLOOD";
9983
+ TempEntity22[TempEntity22["BLASTER"] = 2] = "BLASTER";
9984
+ TempEntity22[TempEntity22["RAILTRAIL"] = 3] = "RAILTRAIL";
9985
+ TempEntity22[TempEntity22["SHOTGUN"] = 4] = "SHOTGUN";
9986
+ TempEntity22[TempEntity22["EXPLOSION1"] = 5] = "EXPLOSION1";
9987
+ TempEntity22[TempEntity22["EXPLOSION2"] = 6] = "EXPLOSION2";
9988
+ TempEntity22[TempEntity22["ROCKET_EXPLOSION"] = 7] = "ROCKET_EXPLOSION";
9989
+ TempEntity22[TempEntity22["GRENADE_EXPLOSION"] = 8] = "GRENADE_EXPLOSION";
9990
+ TempEntity22[TempEntity22["SPARKS"] = 9] = "SPARKS";
9991
+ TempEntity22[TempEntity22["SPLASH"] = 10] = "SPLASH";
9992
+ TempEntity22[TempEntity22["BUBBLETRAIL"] = 11] = "BUBBLETRAIL";
9993
+ TempEntity22[TempEntity22["SCREEN_SPARKS"] = 12] = "SCREEN_SPARKS";
9994
+ TempEntity22[TempEntity22["SHIELD_SPARKS"] = 13] = "SHIELD_SPARKS";
9995
+ TempEntity22[TempEntity22["BULLET_SPARKS"] = 14] = "BULLET_SPARKS";
9996
+ TempEntity22[TempEntity22["LASER_SPARKS"] = 15] = "LASER_SPARKS";
9997
+ TempEntity22[TempEntity22["PARASITE_ATTACK"] = 16] = "PARASITE_ATTACK";
9998
+ TempEntity22[TempEntity22["ROCKET_EXPLOSION_WATER"] = 17] = "ROCKET_EXPLOSION_WATER";
9999
+ TempEntity22[TempEntity22["GRENADE_EXPLOSION_WATER"] = 18] = "GRENADE_EXPLOSION_WATER";
10000
+ TempEntity22[TempEntity22["MEDIC_CABLE_ATTACK"] = 19] = "MEDIC_CABLE_ATTACK";
10001
+ TempEntity22[TempEntity22["BFG_EXPLOSION"] = 20] = "BFG_EXPLOSION";
10002
+ TempEntity22[TempEntity22["BFG_BIGEXPLOSION"] = 21] = "BFG_BIGEXPLOSION";
10003
+ TempEntity22[TempEntity22["BOSSTPORT"] = 22] = "BOSSTPORT";
10004
+ TempEntity22[TempEntity22["BFG_LASER"] = 23] = "BFG_LASER";
10005
+ TempEntity22[TempEntity22["GRAPPLE_CABLE"] = 24] = "GRAPPLE_CABLE";
10006
+ TempEntity22[TempEntity22["WELDING_SPARKS"] = 25] = "WELDING_SPARKS";
10007
+ TempEntity22[TempEntity22["GREENBLOOD"] = 26] = "GREENBLOOD";
10008
+ TempEntity22[TempEntity22["BLUEHYPERBLASTER"] = 27] = "BLUEHYPERBLASTER";
10009
+ TempEntity22[TempEntity22["PLASMA_EXPLOSION"] = 28] = "PLASMA_EXPLOSION";
10010
+ TempEntity22[TempEntity22["TUNNEL_SPARKS"] = 29] = "TUNNEL_SPARKS";
10011
+ TempEntity22[TempEntity22["BLASTER2"] = 30] = "BLASTER2";
10012
+ TempEntity22[TempEntity22["RAILTRAIL2"] = 31] = "RAILTRAIL2";
10013
+ TempEntity22[TempEntity22["FLAME"] = 32] = "FLAME";
10014
+ TempEntity22[TempEntity22["LIGHTNING"] = 33] = "LIGHTNING";
10015
+ TempEntity22[TempEntity22["DEBUGTRAIL"] = 34] = "DEBUGTRAIL";
10016
+ TempEntity22[TempEntity22["PLAIN_EXPLOSION"] = 35] = "PLAIN_EXPLOSION";
10017
+ TempEntity22[TempEntity22["FLASHLIGHT"] = 36] = "FLASHLIGHT";
10018
+ TempEntity22[TempEntity22["FORCEWALL"] = 37] = "FORCEWALL";
10019
+ TempEntity22[TempEntity22["HEATBEAM"] = 38] = "HEATBEAM";
10020
+ TempEntity22[TempEntity22["MONSTER_HEATBEAM"] = 39] = "MONSTER_HEATBEAM";
10021
+ TempEntity22[TempEntity22["STEAM"] = 40] = "STEAM";
10022
+ TempEntity22[TempEntity22["BUBBLETRAIL2"] = 41] = "BUBBLETRAIL2";
10023
+ TempEntity22[TempEntity22["MOREBLOOD"] = 42] = "MOREBLOOD";
10024
+ TempEntity22[TempEntity22["HEATBEAM_SPARKS"] = 43] = "HEATBEAM_SPARKS";
10025
+ TempEntity22[TempEntity22["HEATBEAM_STEAM"] = 44] = "HEATBEAM_STEAM";
10026
+ TempEntity22[TempEntity22["CHAINFIST_SMOKE"] = 45] = "CHAINFIST_SMOKE";
10027
+ TempEntity22[TempEntity22["ELECTRIC_SPARKS"] = 46] = "ELECTRIC_SPARKS";
10028
+ TempEntity22[TempEntity22["TRACKER_EXPLOSION"] = 47] = "TRACKER_EXPLOSION";
10029
+ TempEntity22[TempEntity22["TELEPORT_EFFECT"] = 48] = "TELEPORT_EFFECT";
10030
+ TempEntity22[TempEntity22["DBALL_GOAL"] = 49] = "DBALL_GOAL";
10031
+ TempEntity22[TempEntity22["WIDOWBEAMOUT"] = 50] = "WIDOWBEAMOUT";
10032
+ TempEntity22[TempEntity22["NUKEBLAST"] = 51] = "NUKEBLAST";
10033
+ TempEntity22[TempEntity22["WIDOWSPLASH"] = 52] = "WIDOWSPLASH";
10034
+ TempEntity22[TempEntity22["EXPLOSION1_BIG"] = 53] = "EXPLOSION1_BIG";
10035
+ TempEntity22[TempEntity22["EXPLOSION1_NP"] = 54] = "EXPLOSION1_NP";
10036
+ TempEntity22[TempEntity22["FLECHETTE"] = 55] = "FLECHETTE";
10037
+ TempEntity22[TempEntity22["BLUEHYPERBLASTER_KEX"] = 56] = "BLUEHYPERBLASTER_KEX";
10038
+ TempEntity22[TempEntity22["BFG_ZAP"] = 57] = "BFG_ZAP";
10039
+ TempEntity22[TempEntity22["BERSERK_SLAM"] = 58] = "BERSERK_SLAM";
10040
+ TempEntity22[TempEntity22["GRAPPLE_CABLE_2"] = 59] = "GRAPPLE_CABLE_2";
10041
+ TempEntity22[TempEntity22["POWER_SPLASH"] = 60] = "POWER_SPLASH";
10042
+ TempEntity22[TempEntity22["LIGHTNING_BEAM"] = 61] = "LIGHTNING_BEAM";
10043
+ TempEntity22[TempEntity22["EXPLOSION1_NL"] = 62] = "EXPLOSION1_NL";
10044
+ TempEntity22[TempEntity22["EXPLOSION2_NL"] = 63] = "EXPLOSION2_NL";
10045
+ return TempEntity22;
10046
+ })(TempEntity2 || {});
9898
10047
  var CMD_BACKUP = 64;
9899
10048
  var MZ_BLASTER = 0;
9900
10049
  var MZ_MACHINEGUN = 1;
@@ -9908,6 +10057,7 @@ var MZ_GRENADE = 8;
9908
10057
  var MZ_SSHOTGUN = 11;
9909
10058
  var MZ_BFG = 12;
9910
10059
  var MZ_HYPERBLASTER = 13;
10060
+ var MZ_BLUEHYPERBLASTER = 17;
9911
10061
  function readUint16LE(stats, startIndex, byteOffset) {
9912
10062
  const elementIndex = Math.floor(byteOffset / 2);
9913
10063
  const isOdd = byteOffset % 2 !== 0;
@@ -11654,6 +11804,9 @@ var ClientNetworkHandler = class {
11654
11804
  }
11655
11805
  }
11656
11806
  onTempEntity(type, pos, pos2, dir, cnt, color, ent, srcEnt, destEnt) {
11807
+ if (this.callbacks?.onTempEntity) {
11808
+ this.callbacks.onTempEntity(type, pos, pos2, dir, cnt, color, ent, srcEnt, destEnt);
11809
+ }
11657
11810
  }
11658
11811
  onLayout(layout) {
11659
11812
  }
@@ -11661,8 +11814,14 @@ var ClientNetworkHandler = class {
11661
11814
  this.inventory = [...inventory];
11662
11815
  }
11663
11816
  onMuzzleFlash(ent, weapon) {
11817
+ if (this.callbacks?.onMuzzleFlash) {
11818
+ this.callbacks.onMuzzleFlash(ent, weapon);
11819
+ }
11664
11820
  }
11665
11821
  onMuzzleFlash2(ent, weapon) {
11822
+ if (this.callbacks?.onMuzzleFlash2) {
11823
+ this.callbacks.onMuzzleFlash2(ent, weapon);
11824
+ }
11666
11825
  }
11667
11826
  onMuzzleFlash3(ent, weapon) {
11668
11827
  const isLocalPlayer = ent === this.playerNum + 1;
@@ -13170,6 +13329,7 @@ var MultiplayerConnection = class {
13170
13329
  this.levelName = "";
13171
13330
  this.configStrings = /* @__PURE__ */ new Map();
13172
13331
  this.baselines = /* @__PURE__ */ new Map();
13332
+ this.entities = /* @__PURE__ */ new Map();
13173
13333
  this.challenge = 0;
13174
13334
  this.connectPacketCount = 0;
13175
13335
  this.connectPacketTime = 0;
@@ -13200,6 +13360,9 @@ var MultiplayerConnection = class {
13200
13360
  setDemoRecorder(recorder) {
13201
13361
  this.demoRecorder = recorder;
13202
13362
  }
13363
+ setEffectSystem(system) {
13364
+ this.effectSystem = system;
13365
+ }
13203
13366
  async connectToServer(address, port) {
13204
13367
  const url = `ws://${address}:${port}`;
13205
13368
  return this.connect(url);
@@ -13235,6 +13398,7 @@ var MultiplayerConnection = class {
13235
13398
  cleanup() {
13236
13399
  this.configStrings.clear();
13237
13400
  this.baselines.clear();
13401
+ this.entities.clear();
13238
13402
  this.commandHistory = [];
13239
13403
  this.latestServerFrame = 0;
13240
13404
  this.parser = null;
@@ -13369,6 +13533,13 @@ var MultiplayerConnection = class {
13369
13533
  if (frame.serverFrame > this.latestServerFrame) {
13370
13534
  this.latestServerFrame = frame.serverFrame;
13371
13535
  }
13536
+ const packetEntities = frame.packetEntities;
13537
+ if (!packetEntities.delta) {
13538
+ this.entities.clear();
13539
+ }
13540
+ for (const ent of packetEntities.entities) {
13541
+ this.entities.set(ent.number, ent);
13542
+ }
13372
13543
  if (this.prediction && frame.playerState) {
13373
13544
  const ps = frame.playerState;
13374
13545
  const predState = {
@@ -13397,15 +13568,29 @@ var MultiplayerConnection = class {
13397
13568
  onSound(flags, soundNum, volume, attenuation, offset, ent, pos) {
13398
13569
  }
13399
13570
  onTempEntity(type, pos, pos2, dir, cnt, color, ent, srcEnt, destEnt) {
13571
+ if (this.effectSystem) {
13572
+ const time = Date.now() / 1e3;
13573
+ this.effectSystem.onTempEntity(type, pos, time);
13574
+ }
13400
13575
  }
13401
13576
  onLayout(layout) {
13402
13577
  }
13403
13578
  onInventory(inventory) {
13404
13579
  }
13405
13580
  onMuzzleFlash(ent, weapon) {
13581
+ if (this.effectSystem) {
13582
+ const time = Date.now() / 1e3;
13583
+ this.effectSystem.onMuzzleFlash(ent, weapon, time);
13584
+ }
13406
13585
  }
13407
13586
  onMuzzleFlash2(ent, weapon) {
13408
13587
  }
13588
+ onMuzzleFlash3(ent, weapon) {
13589
+ if (this.effectSystem) {
13590
+ const time = Date.now() / 1e3;
13591
+ this.effectSystem.onMuzzleFlash(ent, weapon, time);
13592
+ }
13593
+ }
13409
13594
  onDisconnect() {
13410
13595
  this.disconnect();
13411
13596
  }
@@ -13413,6 +13598,31 @@ var MultiplayerConnection = class {
13413
13598
  }
13414
13599
  onDownload(size, percent, data) {
13415
13600
  }
13601
+ // New handlers stubs
13602
+ onSplitClient(clientNum) {
13603
+ }
13604
+ onConfigBlast(index, data) {
13605
+ }
13606
+ onSpawnBaselineBlast(entity) {
13607
+ }
13608
+ onLevelRestart() {
13609
+ }
13610
+ onDamage(indicators) {
13611
+ }
13612
+ onLocPrint(flags, base, args) {
13613
+ }
13614
+ onFog(data) {
13615
+ }
13616
+ onWaitingForPlayers(count) {
13617
+ }
13618
+ onBotChat(msg) {
13619
+ }
13620
+ onPoi(flags, pos) {
13621
+ }
13622
+ onHelpPath(pos) {
13623
+ }
13624
+ onAchievement(id) {
13625
+ }
13416
13626
  };
13417
13627
 
13418
13628
  // src/ui/demo-controls.ts
@@ -13560,6 +13770,152 @@ function processEntityEffects(entity, dlights, time) {
13560
13770
  }
13561
13771
  }
13562
13772
 
13773
+ // src/effects-system.ts
13774
+ var copyVec3 = (v) => ({ x: v.x, y: v.y, z: v.z });
13775
+ var vectorMA = (start, scale3, dir) => ({
13776
+ x: start.x + dir.x * scale3,
13777
+ y: start.y + dir.y * scale3,
13778
+ z: start.z + dir.z * scale3
13779
+ });
13780
+ var ClientEffectSystem = class {
13781
+ constructor(dlightManager, engine, entityProvider) {
13782
+ this.dlightManager = dlightManager;
13783
+ this.engine = engine;
13784
+ this.entityProvider = entityProvider;
13785
+ }
13786
+ // Helper to add dlight
13787
+ addLight(key, origin, color, radius, minLight, time) {
13788
+ this.dlightManager.addLight({
13789
+ key,
13790
+ origin: copyVec3(origin),
13791
+ color,
13792
+ intensity: radius,
13793
+ minLight,
13794
+ die: time
13795
+ }, 0);
13796
+ }
13797
+ playSound(pos, ent, soundName, vol = 1, attn = 1) {
13798
+ if (!this.engine.audio) return;
13799
+ const index = this.engine.audio.soundindex(soundName);
13800
+ if (index === 0) return;
13801
+ if (pos) {
13802
+ this.engine.audio.positioned_sound(pos, index, vol, attn);
13803
+ } else {
13804
+ this.engine.audio.sound(ent, 0, index, vol, attn, 0);
13805
+ }
13806
+ }
13807
+ onMuzzleFlash(entNum, weapon, time) {
13808
+ const ent = this.entityProvider.getEntity(entNum);
13809
+ if (!ent) return;
13810
+ const origin = { x: ent.origin.x, y: ent.origin.y, z: ent.origin.z };
13811
+ const angles = { x: ent.angles.x, y: ent.angles.y, z: ent.angles.z };
13812
+ const vectors = angleVectors(angles);
13813
+ let flashOrigin = vectorMA(origin, 18, vectors.forward);
13814
+ flashOrigin = vectorMA(flashOrigin, 16, vectors.right);
13815
+ const silenced = (weapon & 128) !== 0;
13816
+ weapon &= ~128;
13817
+ let radius = silenced ? 100 + Math.random() * 31 : 200 + Math.random() * 31;
13818
+ const minLight = 32;
13819
+ const duration = 0.1;
13820
+ const die = time + duration;
13821
+ const volume = silenced ? 0.2 : 1;
13822
+ let color = { x: 1, y: 1, z: 0 };
13823
+ switch (weapon) {
13824
+ case MZ_BLASTER:
13825
+ case MZ_HYPERBLASTER:
13826
+ case MZ_MACHINEGUN:
13827
+ case MZ_SHOTGUN:
13828
+ case MZ_SSHOTGUN:
13829
+ case MZ_CHAINGUN1:
13830
+ case MZ_CHAINGUN2:
13831
+ case MZ_CHAINGUN3:
13832
+ color = { x: 1, y: 1, z: 0 };
13833
+ break;
13834
+ case MZ_BLUEHYPERBLASTER:
13835
+ color = { x: 0, y: 0, z: 1 };
13836
+ break;
13837
+ case MZ_RAILGUN:
13838
+ color = { x: 0.5, y: 0.5, z: 1 };
13839
+ break;
13840
+ case MZ_ROCKET:
13841
+ case MZ_GRENADE:
13842
+ color = { x: 1, y: 0.5, z: 0.2 };
13843
+ break;
13844
+ case MZ_BFG:
13845
+ color = { x: 0, y: 1, z: 0 };
13846
+ break;
13847
+ }
13848
+ this.addLight(entNum, flashOrigin, color, radius, minLight, die);
13849
+ let soundName = "";
13850
+ switch (weapon) {
13851
+ case MZ_BLASTER:
13852
+ soundName = "weapons/blastf1a.wav";
13853
+ break;
13854
+ case MZ_SHOTGUN:
13855
+ soundName = "weapons/shotgf1b.wav";
13856
+ break;
13857
+ case MZ_SSHOTGUN:
13858
+ soundName = "weapons/sshotf1b.wav";
13859
+ break;
13860
+ case MZ_MACHINEGUN:
13861
+ soundName = `weapons/machgf${Math.floor(Math.random() * 5) + 1}b.wav`;
13862
+ break;
13863
+ case MZ_RAILGUN:
13864
+ soundName = "weapons/railgf1a.wav";
13865
+ break;
13866
+ case MZ_ROCKET:
13867
+ soundName = "weapons/rocklf1a.wav";
13868
+ break;
13869
+ case MZ_GRENADE:
13870
+ soundName = "weapons/grenlf1a.wav";
13871
+ break;
13872
+ case MZ_BFG:
13873
+ soundName = "weapons/bfg__f1y.wav";
13874
+ break;
13875
+ case MZ_HYPERBLASTER:
13876
+ soundName = "weapons/hyprbf1a.wav";
13877
+ break;
13878
+ case MZ_BLUEHYPERBLASTER:
13879
+ soundName = "weapons/hyprbf1a.wav";
13880
+ break;
13881
+ case MZ_CHAINGUN1:
13882
+ case MZ_CHAINGUN2:
13883
+ case MZ_CHAINGUN3:
13884
+ soundName = `weapons/machgf${Math.floor(Math.random() * 5) + 1}b.wav`;
13885
+ break;
13886
+ }
13887
+ if (soundName) {
13888
+ this.playSound(null, entNum, soundName, volume, 1);
13889
+ }
13890
+ }
13891
+ onTempEntity(type, pos, time) {
13892
+ switch (type) {
13893
+ case TempEntity2.EXPLOSION1:
13894
+ case TempEntity2.EXPLOSION1_BIG:
13895
+ case TempEntity2.EXPLOSION1_NP:
13896
+ case TempEntity2.ROCKET_EXPLOSION:
13897
+ case TempEntity2.GRENADE_EXPLOSION:
13898
+ case TempEntity2.ROCKET_EXPLOSION_WATER:
13899
+ case TempEntity2.GRENADE_EXPLOSION_WATER:
13900
+ {
13901
+ const color = { x: 1, y: 0.5, z: 0.2 };
13902
+ const duration = 0.5;
13903
+ this.addLight(void 0, pos, color, 300, 0, time + duration);
13904
+ this.playSound(pos, 0, "weapons/rocklx1a.wav", 1, 0.5);
13905
+ }
13906
+ break;
13907
+ case TempEntity2.BFG_EXPLOSION:
13908
+ case TempEntity2.BFG_BIGEXPLOSION:
13909
+ {
13910
+ const color = { x: 0, y: 1, z: 0 };
13911
+ this.addLight(void 0, pos, color, 300, 0, time + 0.5);
13912
+ this.playSound(pos, 0, "weapons/bfg__x1b.wav", 1, 0.5);
13913
+ }
13914
+ break;
13915
+ }
13916
+ }
13917
+ };
13918
+
13563
13919
  // src/input/bindings.ts
13564
13920
  var DEFAULT_BINDINGS = [
13565
13921
  { code: "KeyW", command: "+forward" },
@@ -14221,6 +14577,23 @@ function createClient(imports) {
14221
14577
  const demoHandler = new ClientNetworkHandler(imports);
14222
14578
  const demoRecorder = new DemoRecorder();
14223
14579
  demoHandler.setView(view);
14580
+ const dlightManager = new DynamicLightManager();
14581
+ const entityProvider = {
14582
+ getEntity(entNum) {
14583
+ if (isDemoPlaying) {
14584
+ return demoHandler.entities.get(entNum);
14585
+ } else {
14586
+ if (multiplayer.isConnected()) {
14587
+ return multiplayer.entities.get(entNum);
14588
+ }
14589
+ }
14590
+ return void 0;
14591
+ },
14592
+ getPlayerNum() {
14593
+ return multiplayer.playerNum;
14594
+ }
14595
+ };
14596
+ const effectSystem = new ClientEffectSystem(dlightManager, imports.engine, entityProvider);
14224
14597
  let isDemoPlaying = false;
14225
14598
  let currentDemoName = null;
14226
14599
  let clientMode = 0 /* Normal */;
@@ -14283,6 +14656,7 @@ function createClient(imports) {
14283
14656
  }
14284
14657
  });
14285
14658
  multiplayer.setDemoRecorder(demoRecorder);
14659
+ multiplayer.setEffectSystem(effectSystem);
14286
14660
  const multiplayerFactory = new MultiplayerMenuFactory(menuSystem, multiplayer);
14287
14661
  demoHandler.setCallbacks({
14288
14662
  onCenterPrint: (msg) => cg.ParseCenterPrint(msg, 0, false),
@@ -14297,6 +14671,19 @@ function createClient(imports) {
14297
14671
  } else {
14298
14672
  demoPlayback.setFrameDuration(100);
14299
14673
  }
14674
+ },
14675
+ // New hooks for effects
14676
+ onMuzzleFlash: (ent, weapon) => {
14677
+ const time = demoPlayback.getCurrentTime() / 1e3;
14678
+ effectSystem.onMuzzleFlash(ent, weapon, time);
14679
+ },
14680
+ onMuzzleFlash2: (ent, weapon) => {
14681
+ },
14682
+ onTempEntity: (type, pos, pos2, dir, cnt, color, ent, srcEnt, destEnt) => {
14683
+ const time = demoPlayback.getCurrentTime() / 1e3;
14684
+ if (pos) {
14685
+ effectSystem.onTempEntity(type, pos, time);
14686
+ }
14300
14687
  }
14301
14688
  });
14302
14689
  demoPlayback.setHandler(demoHandler);
@@ -14410,6 +14797,7 @@ function createClient(imports) {
14410
14797
  const clientExports = {
14411
14798
  loadingScreen,
14412
14799
  errorDialog,
14800
+ dlightManager,
14413
14801
  init(initial) {
14414
14802
  this.Init(initial);
14415
14803
  },
@@ -14608,8 +14996,9 @@ function createClient(imports) {
14608
14996
  const frameTimeMs = sample.latest && sample.previous ? Math.max(0, sample.latest.timeMs - sample.previous.timeMs) : 0;
14609
14997
  lastView = view.sample(lastRendered, frameTimeMs);
14610
14998
  const command = {};
14611
- const dlights = [];
14612
14999
  const timeSeconds = sample.nowMs / 1e3;
15000
+ dlightManager.update(timeSeconds);
15001
+ const dlights = [...dlightManager.getActiveLights()];
14613
15002
  for (const ent of currentPacketEntities) {
14614
15003
  processEntityEffects(ent, dlights, timeSeconds);
14615
15004
  }