quake2ts 0.0.577 → 0.0.580

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 (37) hide show
  1. package/package.json +3 -3
  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 +0 -1
  5. package/packages/client/dist/cjs/index.cjs.map +1 -1
  6. package/packages/client/dist/esm/index.js +0 -1
  7. package/packages/client/dist/esm/index.js.map +1 -1
  8. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  9. package/packages/engine/dist/browser/index.global.js +11 -11
  10. package/packages/engine/dist/browser/index.global.js.map +1 -1
  11. package/packages/engine/dist/cjs/index.cjs +4 -167
  12. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  13. package/packages/engine/dist/esm/index.js +4 -167
  14. package/packages/engine/dist/esm/index.js.map +1 -1
  15. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  16. package/packages/engine/dist/types/assets/md2.d.ts +5 -1
  17. package/packages/engine/dist/types/assets/md2.d.ts.map +1 -1
  18. package/packages/engine/dist/types/render/renderer.d.ts +1 -0
  19. package/packages/engine/dist/types/render/renderer.d.ts.map +1 -1
  20. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  21. package/packages/test-utils/dist/index.cjs +242 -147
  22. package/packages/test-utils/dist/index.cjs.map +1 -1
  23. package/packages/test-utils/dist/index.d.cts +146 -2
  24. package/packages/test-utils/dist/index.d.ts +146 -2
  25. package/packages/test-utils/dist/index.js +241 -147
  26. package/packages/test-utils/dist/index.js.map +1 -1
  27. package/packages/tools/dist/browser/index.global.js +212 -2
  28. package/packages/tools/dist/browser/index.global.js.map +1 -1
  29. package/packages/tools/dist/cjs/index.cjs +971 -2
  30. package/packages/tools/dist/cjs/index.cjs.map +1 -1
  31. package/packages/tools/dist/esm/index.js +969 -1
  32. package/packages/tools/dist/esm/index.js.map +1 -1
  33. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
  34. package/packages/tools/dist/types/bspTools.d.ts +9 -0
  35. package/packages/tools/dist/types/bspTools.d.ts.map +1 -0
  36. package/packages/tools/dist/types/index.d.ts +1 -0
  37. package/packages/tools/dist/types/index.d.ts.map +1 -1
@@ -165,6 +165,973 @@ function exportMd3ToGltf(model) {
165
165
  };
166
166
  }
167
167
 
168
+ // ../shared/dist/esm/index.js
169
+ var __defProp = Object.defineProperty;
170
+ var __export = (target, all) => {
171
+ for (var name in all)
172
+ __defProp(target, name, { get: all[name], enumerable: true });
173
+ };
174
+ var DEG_TO_RAD = Math.PI / 180;
175
+ var DEG2RAD_FACTOR = Math.PI / 180;
176
+ var RAD2DEG_FACTOR = 180 / Math.PI;
177
+ var ANORMS = [
178
+ [-0.525731, 0, 0.850651],
179
+ [-0.442863, 0.238856, 0.864188],
180
+ [-0.295242, 0, 0.955423],
181
+ [-0.309017, 0.5, 0.809017],
182
+ [-0.16246, 0.262866, 0.951056],
183
+ [0, 0, 1],
184
+ [0, 0.850651, 0.525731],
185
+ [-0.147621, 0.716567, 0.681718],
186
+ [0.147621, 0.716567, 0.681718],
187
+ [0, 0.525731, 0.850651],
188
+ [0.309017, 0.5, 0.809017],
189
+ [0.525731, 0, 0.850651],
190
+ [0.295242, 0, 0.955423],
191
+ [0.442863, 0.238856, 0.864188],
192
+ [0.16246, 0.262866, 0.951056],
193
+ [-0.681718, 0.147621, 0.716567],
194
+ [-0.809017, 0.309017, 0.5],
195
+ [-0.587785, 0.425325, 0.688191],
196
+ [-0.850651, 0.525731, 0],
197
+ [-0.864188, 0.442863, 0.238856],
198
+ [-0.716567, 0.681718, 0.147621],
199
+ [-0.688191, 0.587785, 0.425325],
200
+ [-0.5, 0.809017, 0.309017],
201
+ [-0.238856, 0.864188, 0.442863],
202
+ [-0.425325, 0.688191, 0.587785],
203
+ [-0.716567, 0.681718, -0.147621],
204
+ [-0.5, 0.809017, -0.309017],
205
+ [-0.525731, 0.850651, 0],
206
+ [0, 0.850651, -0.525731],
207
+ [-0.238856, 0.864188, -0.442863],
208
+ [0, 0.955423, -0.295242],
209
+ [-0.262866, 0.951056, -0.16246],
210
+ [0, 1, 0],
211
+ [0, 0.955423, 0.295242],
212
+ [-0.262866, 0.951056, 0.16246],
213
+ [0.238856, 0.864188, 0.442863],
214
+ [0.262866, 0.951056, 0.16246],
215
+ [0.5, 0.809017, 0.309017],
216
+ [0.238856, 0.864188, -0.442863],
217
+ [0.262866, 0.951056, -0.16246],
218
+ [0.5, 0.809017, -0.309017],
219
+ [0.850651, 0.525731, 0],
220
+ [0.716567, 0.681718, 0.147621],
221
+ [0.716567, 0.681718, -0.147621],
222
+ [0.525731, 0.850651, 0],
223
+ [0.425325, 0.688191, 0.587785],
224
+ [0.864188, 0.442863, 0.238856],
225
+ [0.688191, 0.587785, 0.425325],
226
+ [0.809017, 0.309017, 0.5],
227
+ [0.681718, 0.147621, 0.716567],
228
+ [0.587785, 0.425325, 0.688191],
229
+ [0.955423, 0.295242, 0],
230
+ [1, 0, 0],
231
+ [0.951056, 0.16246, 0.262866],
232
+ [0.850651, -0.525731, 0],
233
+ [0.955423, -0.295242, 0],
234
+ [0.864188, -0.442863, 0.238856],
235
+ [0.951056, -0.16246, 0.262866],
236
+ [0.809017, -0.309017, 0.5],
237
+ [0.681718, -0.147621, 0.716567],
238
+ [0.850651, 0, 0.525731],
239
+ [0.864188, 0.442863, -0.238856],
240
+ [0.809017, 0.309017, -0.5],
241
+ [0.951056, 0.16246, -0.262866],
242
+ [0.525731, 0, -0.850651],
243
+ [0.681718, 0.147621, -0.716567],
244
+ [0.681718, -0.147621, -0.716567],
245
+ [0.850651, 0, -0.525731],
246
+ [0.809017, -0.309017, -0.5],
247
+ [0.864188, -0.442863, -0.238856],
248
+ [0.951056, -0.16246, -0.262866],
249
+ [0.147621, 0.716567, -0.681718],
250
+ [0.309017, 0.5, -0.809017],
251
+ [0.425325, 0.688191, -0.587785],
252
+ [0.442863, 0.238856, -0.864188],
253
+ [0.587785, 0.425325, -0.688191],
254
+ [0.688191, 0.587785, -0.425325],
255
+ [-0.147621, 0.716567, -0.681718],
256
+ [-0.309017, 0.5, -0.809017],
257
+ [0, 0.525731, -0.850651],
258
+ [-0.525731, 0, -0.850651],
259
+ [-0.442863, 0.238856, -0.864188],
260
+ [-0.295242, 0, -0.955423],
261
+ [-0.16246, 0.262866, -0.951056],
262
+ [0, 0, -1],
263
+ [0.295242, 0, -0.955423],
264
+ [0.16246, 0.262866, -0.951056],
265
+ [-0.442863, -0.238856, -0.864188],
266
+ [-0.309017, -0.5, -0.809017],
267
+ [-0.16246, -0.262866, -0.951056],
268
+ [0, -0.850651, -0.525731],
269
+ [-0.147621, -0.716567, -0.681718],
270
+ [0.147621, -0.716567, -0.681718],
271
+ [0, -0.525731, -0.850651],
272
+ [0.309017, -0.5, -0.809017],
273
+ [0.442863, -0.238856, -0.864188],
274
+ [0.16246, -0.262866, -0.951056],
275
+ [0.238856, -0.864188, -0.442863],
276
+ [0.5, -0.809017, -0.309017],
277
+ [0.425325, -0.688191, -0.587785],
278
+ [0.716567, -0.681718, -0.147621],
279
+ [0.688191, -0.587785, -0.425325],
280
+ [0.587785, -0.425325, -0.688191],
281
+ [0, -0.955423, -0.295242],
282
+ [0, -1, 0],
283
+ [0.262866, -0.951056, -0.16246],
284
+ [0, -0.850651, 0.525731],
285
+ [0, -0.955423, 0.295242],
286
+ [0.238856, -0.864188, 0.442863],
287
+ [0.262866, -0.951056, 0.16246],
288
+ [0.5, -0.809017, 0.309017],
289
+ [0.716567, -0.681718, 0.147621],
290
+ [0.525731, -0.850651, 0],
291
+ [-0.238856, -0.864188, -0.442863],
292
+ [-0.5, -0.809017, -0.309017],
293
+ [-0.262866, -0.951056, -0.16246],
294
+ [-0.850651, -0.525731, 0],
295
+ [-0.716567, -0.681718, -0.147621],
296
+ [-0.716567, -0.681718, 0.147621],
297
+ [-0.525731, -0.850651, 0],
298
+ [-0.5, -0.809017, 0.309017],
299
+ [-0.238856, -0.864188, 0.442863],
300
+ [-0.262866, -0.951056, 0.16246],
301
+ [-0.864188, -0.442863, 0.238856],
302
+ [-0.809017, -0.309017, 0.5],
303
+ [-0.688191, -0.587785, 0.425325],
304
+ [-0.681718, -0.147621, 0.716567],
305
+ [-0.442863, -0.238856, 0.864188],
306
+ [-0.587785, -0.425325, 0.688191],
307
+ [-0.309017, -0.5, 0.809017],
308
+ [-0.147621, -0.716567, 0.681718],
309
+ [-0.425325, -0.688191, 0.587785],
310
+ [-0.16246, -0.262866, 0.951056],
311
+ [0.442863, -0.238856, 0.864188],
312
+ [0.16246, -0.262866, 0.951056],
313
+ [0.309017, -0.5, 0.809017],
314
+ [0.147621, -0.716567, 0.681718],
315
+ [0, -0.525731, 0.850651],
316
+ [0.425325, -0.688191, 0.587785],
317
+ [0.587785, -0.425325, 0.688191],
318
+ [0.688191, -0.587785, 0.425325],
319
+ [-0.955423, 0.295242, 0],
320
+ [-0.951056, 0.16246, 0.262866],
321
+ [-1, 0, 0],
322
+ [-0.850651, 0, 0.525731],
323
+ [-0.955423, -0.295242, 0],
324
+ [-0.951056, -0.16246, 0.262866],
325
+ [-0.864188, 0.442863, -0.238856],
326
+ [-0.951056, 0.16246, -0.262866],
327
+ [-0.809017, 0.309017, -0.5],
328
+ [-0.864188, -0.442863, -0.238856],
329
+ [-0.951056, -0.16246, -0.262866],
330
+ [-0.809017, -0.309017, -0.5],
331
+ [-0.681718, 0.147621, -0.716567],
332
+ [-0.681718, -0.147621, -0.716567],
333
+ [-0.850651, 0, -0.525731],
334
+ [-0.688191, 0.587785, -0.425325],
335
+ [-0.587785, 0.425325, -0.688191],
336
+ [-0.425325, 0.688191, -0.587785],
337
+ [-0.425325, -0.688191, -0.587785],
338
+ [-0.587785, -0.425325, -0.688191],
339
+ [-0.688191, -0.587785, -0.425325]
340
+ ];
341
+ var CONTENTS_SOLID = 1 << 0;
342
+ var CONTENTS_WINDOW = 1 << 1;
343
+ var CONTENTS_AUX = 1 << 2;
344
+ var CONTENTS_LAVA = 1 << 3;
345
+ var CONTENTS_SLIME = 1 << 4;
346
+ var CONTENTS_WATER = 1 << 5;
347
+ var CONTENTS_MIST = 1 << 6;
348
+ var CONTENTS_NO_WATERJUMP = 1 << 13;
349
+ var CONTENTS_PROJECTILECLIP = 1 << 14;
350
+ var CONTENTS_AREAPORTAL = 1 << 15;
351
+ var CONTENTS_PLAYERCLIP = 1 << 16;
352
+ var CONTENTS_MONSTERCLIP = 1 << 17;
353
+ var CONTENTS_CURRENT_0 = 1 << 18;
354
+ var CONTENTS_CURRENT_90 = 1 << 19;
355
+ var CONTENTS_CURRENT_180 = 1 << 20;
356
+ var CONTENTS_CURRENT_270 = 1 << 21;
357
+ var CONTENTS_CURRENT_UP = 1 << 22;
358
+ var CONTENTS_CURRENT_DOWN = 1 << 23;
359
+ var CONTENTS_ORIGIN = 1 << 24;
360
+ var CONTENTS_MONSTER = 1 << 25;
361
+ var CONTENTS_DEADMONSTER = 1 << 26;
362
+ var CONTENTS_DETAIL = 1 << 27;
363
+ var CONTENTS_TRANSLUCENT = 1 << 28;
364
+ var CONTENTS_LADDER = 1 << 29;
365
+ var CONTENTS_PLAYER = 1 << 30;
366
+ var CONTENTS_PROJECTILE = 1 << 31;
367
+ var SURF_LIGHT = 1 << 0;
368
+ var SURF_SLICK = 1 << 1;
369
+ var SURF_SKY = 1 << 2;
370
+ var SURF_WARP = 1 << 3;
371
+ var SURF_TRANS33 = 1 << 4;
372
+ var SURF_TRANS66 = 1 << 5;
373
+ var SURF_FLOWING = 1 << 6;
374
+ var SURF_NODRAW = 1 << 7;
375
+ var SURF_ALPHATEST = 1 << 25;
376
+ var SURF_N64_UV = 1 << 28;
377
+ var SURF_N64_SCROLL_X = 1 << 29;
378
+ var SURF_N64_SCROLL_Y = 1 << 30;
379
+ var SURF_N64_SCROLL_FLIP = 1 << 31;
380
+ var MASK_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
381
+ var MASK_PLAYERSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
382
+ var MASK_DEADSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
383
+ var MASK_MONSTERSOLID = CONTENTS_SOLID | CONTENTS_MONSTERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
384
+ var MASK_WATER = CONTENTS_WATER | CONTENTS_LAVA | CONTENTS_SLIME;
385
+ var MASK_OPAQUE = CONTENTS_SOLID | CONTENTS_SLIME | CONTENTS_LAVA;
386
+ var MASK_SHOT = CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_PLAYER | CONTENTS_WINDOW | CONTENTS_DEADMONSTER;
387
+ var MASK_CURRENT = CONTENTS_CURRENT_0 | CONTENTS_CURRENT_90 | CONTENTS_CURRENT_180 | CONTENTS_CURRENT_270 | CONTENTS_CURRENT_UP | CONTENTS_CURRENT_DOWN;
388
+ var MASK_BLOCK_SIGHT = CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_MONSTER | CONTENTS_PLAYER;
389
+ var MASK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
390
+ var MASK_LADDER_NAV_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
391
+ var MASK_WALK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTERCLIP;
392
+ var MASK_PROJECTILE = MASK_SHOT | CONTENTS_PROJECTILECLIP;
393
+ var MAX_CHECKCOUNT = Number.MAX_SAFE_INTEGER - 1;
394
+ var MAX_CLIENTS = 256;
395
+ var MAX_LIGHTSTYLES = 256;
396
+ var MAX_MODELS = 8192;
397
+ var MAX_SOUNDS = 2048;
398
+ var MAX_IMAGES = 512;
399
+ var MAX_ITEMS = 256;
400
+ var MAX_GENERAL = MAX_CLIENTS * 2;
401
+ var MAX_SHADOW_LIGHTS = 256;
402
+ var MAX_WHEEL_ITEMS = 32;
403
+ var ConfigStringIndex = ((ConfigStringIndex2) => {
404
+ ConfigStringIndex2[ConfigStringIndex2["Name"] = 0] = "Name";
405
+ ConfigStringIndex2[ConfigStringIndex2["CdTrack"] = 1] = "CdTrack";
406
+ ConfigStringIndex2[ConfigStringIndex2["Sky"] = 2] = "Sky";
407
+ ConfigStringIndex2[ConfigStringIndex2["SkyAxis"] = 3] = "SkyAxis";
408
+ ConfigStringIndex2[ConfigStringIndex2["SkyRotate"] = 4] = "SkyRotate";
409
+ ConfigStringIndex2[ConfigStringIndex2["StatusBar"] = 5] = "StatusBar";
410
+ ConfigStringIndex2[ConfigStringIndex2["HealthBarName"] = 55] = "HealthBarName";
411
+ ConfigStringIndex2[ConfigStringIndex2["CONFIG_N64_PHYSICS"] = 56] = "CONFIG_N64_PHYSICS";
412
+ ConfigStringIndex2[ConfigStringIndex2["CONFIG_CTF_TEAMS"] = 57] = "CONFIG_CTF_TEAMS";
413
+ ConfigStringIndex2[ConfigStringIndex2["CONFIG_COOP_RESPAWN_STRING"] = 58] = "CONFIG_COOP_RESPAWN_STRING";
414
+ ConfigStringIndex2[ConfigStringIndex2["Story"] = 54] = "Story";
415
+ ConfigStringIndex2[ConfigStringIndex2["AirAccel"] = 59] = "AirAccel";
416
+ ConfigStringIndex2[ConfigStringIndex2["MaxClients"] = 60] = "MaxClients";
417
+ ConfigStringIndex2[ConfigStringIndex2["MapChecksum"] = 61] = "MapChecksum";
418
+ ConfigStringIndex2[ConfigStringIndex2["Models"] = 62] = "Models";
419
+ ConfigStringIndex2[ConfigStringIndex2["Sounds"] = 62 + MAX_MODELS] = "Sounds";
420
+ ConfigStringIndex2[ConfigStringIndex2["Images"] = ConfigStringIndex2.Sounds + MAX_SOUNDS] = "Images";
421
+ ConfigStringIndex2[ConfigStringIndex2["Lights"] = ConfigStringIndex2.Images + MAX_IMAGES] = "Lights";
422
+ ConfigStringIndex2[ConfigStringIndex2["ShadowLights"] = ConfigStringIndex2.Lights + MAX_LIGHTSTYLES] = "ShadowLights";
423
+ ConfigStringIndex2[ConfigStringIndex2["Items"] = ConfigStringIndex2.ShadowLights + MAX_SHADOW_LIGHTS] = "Items";
424
+ ConfigStringIndex2[ConfigStringIndex2["Players"] = ConfigStringIndex2.Items + MAX_ITEMS] = "Players";
425
+ ConfigStringIndex2[ConfigStringIndex2["PlayerSkins"] = ConfigStringIndex2.Players] = "PlayerSkins";
426
+ ConfigStringIndex2[ConfigStringIndex2["General"] = ConfigStringIndex2.Players + MAX_CLIENTS] = "General";
427
+ ConfigStringIndex2[ConfigStringIndex2["WheelWeapons"] = ConfigStringIndex2.General + MAX_GENERAL] = "WheelWeapons";
428
+ ConfigStringIndex2[ConfigStringIndex2["WheelAmmo"] = ConfigStringIndex2.WheelWeapons + MAX_WHEEL_ITEMS] = "WheelAmmo";
429
+ ConfigStringIndex2[ConfigStringIndex2["WheelPowerups"] = ConfigStringIndex2.WheelAmmo + MAX_WHEEL_ITEMS] = "WheelPowerups";
430
+ ConfigStringIndex2[ConfigStringIndex2["CdLoopCount"] = ConfigStringIndex2.WheelPowerups + MAX_WHEEL_ITEMS] = "CdLoopCount";
431
+ ConfigStringIndex2[ConfigStringIndex2["GameStyle"] = ConfigStringIndex2.CdLoopCount + 1] = "GameStyle";
432
+ ConfigStringIndex2[ConfigStringIndex2["MaxConfigStrings"] = ConfigStringIndex2.GameStyle + 1] = "MaxConfigStrings";
433
+ return ConfigStringIndex2;
434
+ })(ConfigStringIndex || {});
435
+ var MAX_CONFIGSTRINGS = ConfigStringIndex.MaxConfigStrings;
436
+ var CS_SOUNDS = ConfigStringIndex.Sounds;
437
+ var CS_IMAGES = ConfigStringIndex.Images;
438
+ var CS_LIGHTS = ConfigStringIndex.Lights;
439
+ var CS_ITEMS = ConfigStringIndex.Items;
440
+ var CS_PLAYERS = ConfigStringIndex.Players;
441
+ var CS_GENERAL = ConfigStringIndex.General;
442
+ var replay_exports = {};
443
+ __export(replay_exports, {
444
+ addReplayFrame: () => addReplayFrame,
445
+ createReplaySession: () => createReplaySession,
446
+ deserializeReplay: () => deserializeReplay,
447
+ serializeReplay: () => serializeReplay
448
+ });
449
+ function serializeReplay(session) {
450
+ return JSON.stringify(session, null, 2);
451
+ }
452
+ function deserializeReplay(json) {
453
+ const session = JSON.parse(json);
454
+ if (!session.metadata || !Array.isArray(session.frames)) {
455
+ throw new Error("Invalid replay format: missing metadata or frames");
456
+ }
457
+ return session;
458
+ }
459
+ function createReplaySession(map, seed) {
460
+ return {
461
+ metadata: {
462
+ map,
463
+ date: (/* @__PURE__ */ new Date()).toISOString(),
464
+ version: "1.0",
465
+ seed
466
+ },
467
+ frames: []
468
+ };
469
+ }
470
+ function addReplayFrame(session, cmd, serverFrame, startTime) {
471
+ session.frames.push({
472
+ serverFrame,
473
+ cmd,
474
+ timestamp: Date.now() - startTime
475
+ });
476
+ }
477
+ var WATERJUMP_CLEAR = 8 | 16 | 32 | 1024;
478
+ var AMMO_MAX = 12;
479
+ var NUM_BITS_FOR_AMMO = 9;
480
+ var NUM_AMMO_STATS = Math.ceil(AMMO_MAX * NUM_BITS_FOR_AMMO / 16);
481
+ var POWERUP_MAX = 23;
482
+ var NUM_BITS_FOR_POWERUP = 2;
483
+ var NUM_POWERUP_STATS = Math.ceil(POWERUP_MAX * NUM_BITS_FOR_POWERUP / 16);
484
+ var U_ORIGIN1 = 1 << 0;
485
+ var U_ORIGIN2 = 1 << 1;
486
+ var U_ANGLE2 = 1 << 2;
487
+ var U_ANGLE3 = 1 << 3;
488
+ var U_FRAME8 = 1 << 4;
489
+ var U_EVENT = 1 << 5;
490
+ var U_REMOVE = 1 << 6;
491
+ var U_MOREBITS1 = 1 << 7;
492
+ var U_NUMBER16 = 1 << 8;
493
+ var U_ORIGIN3 = 1 << 9;
494
+ var U_ANGLE1 = 1 << 10;
495
+ var U_MODEL = 1 << 11;
496
+ var U_RENDERFX8 = 1 << 12;
497
+ var U_ALPHA = 1 << 13;
498
+ var U_EFFECTS8 = 1 << 14;
499
+ var U_MOREBITS2 = 1 << 15;
500
+ var U_SKIN8 = 1 << 16;
501
+ var U_FRAME16 = 1 << 17;
502
+ var U_RENDERFX16 = 1 << 18;
503
+ var U_EFFECTS16 = 1 << 19;
504
+ var U_MODEL2 = 1 << 20;
505
+ var U_MODEL3 = 1 << 21;
506
+ var U_MODEL4 = 1 << 22;
507
+ var U_MOREBITS3 = 1 << 23;
508
+ var U_OLDORIGIN = 1 << 24;
509
+ var U_SKIN16 = 1 << 25;
510
+ var U_SOUND = 1 << 26;
511
+ var U_SOLID = 1 << 27;
512
+ var U_SCALE = 1 << 28;
513
+ var U_INSTANCE_BITS = 1 << 29;
514
+ var U_LOOP_VOLUME = 1 << 30;
515
+ var U_MOREBITS4 = 2147483648 | 0;
516
+ var U_LOOP_ATTENUATION_HIGH = 1 << 0;
517
+ var U_OWNER_HIGH = 1 << 1;
518
+ var U_OLD_FRAME_HIGH = 1 << 2;
519
+ var PS_M_TYPE = 1 << 0;
520
+ var PS_M_ORIGIN = 1 << 1;
521
+ var PS_M_VELOCITY = 1 << 2;
522
+ var PS_M_TIME = 1 << 3;
523
+ var PS_M_FLAGS = 1 << 4;
524
+ var PS_M_GRAVITY = 1 << 5;
525
+ var PS_M_DELTA_ANGLES = 1 << 6;
526
+ var PS_VIEWOFFSET = 1 << 7;
527
+ var PS_VIEWANGLES = 1 << 8;
528
+ var PS_KICKANGLES = 1 << 9;
529
+ var PS_BLEND = 1 << 10;
530
+ var PS_FOV = 1 << 11;
531
+ var PS_WEAPONINDEX = 1 << 12;
532
+ var PS_WEAPONFRAME = 1 << 13;
533
+ var PS_RDFLAGS = 1 << 14;
534
+ var BinaryStream = class {
535
+ constructor(buffer) {
536
+ if (buffer instanceof Uint8Array) {
537
+ this.view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
538
+ } else {
539
+ this.view = new DataView(buffer);
540
+ }
541
+ this.offset = 0;
542
+ this.length = this.view.byteLength;
543
+ }
544
+ getPosition() {
545
+ return this.offset;
546
+ }
547
+ getReadPosition() {
548
+ return this.offset;
549
+ }
550
+ getLength() {
551
+ return this.length;
552
+ }
553
+ getRemaining() {
554
+ return this.length - this.offset;
555
+ }
556
+ seek(position) {
557
+ if (position < 0 || position > this.length) {
558
+ throw new Error(`Seek out of bounds: ${position} (length: ${this.length})`);
559
+ }
560
+ this.offset = position;
561
+ }
562
+ setReadPosition(position) {
563
+ this.seek(position);
564
+ }
565
+ hasMore() {
566
+ return this.offset < this.length;
567
+ }
568
+ hasBytes(count) {
569
+ return this.offset + count <= this.length;
570
+ }
571
+ readChar() {
572
+ const value = this.view.getInt8(this.offset);
573
+ this.offset += 1;
574
+ return value;
575
+ }
576
+ readByte() {
577
+ const value = this.view.getUint8(this.offset);
578
+ this.offset += 1;
579
+ return value;
580
+ }
581
+ readShort() {
582
+ const value = this.view.getInt16(this.offset, true);
583
+ this.offset += 2;
584
+ return value;
585
+ }
586
+ readUShort() {
587
+ const value = this.view.getUint16(this.offset, true);
588
+ this.offset += 2;
589
+ return value;
590
+ }
591
+ readLong() {
592
+ const value = this.view.getInt32(this.offset, true);
593
+ this.offset += 4;
594
+ return value;
595
+ }
596
+ readULong() {
597
+ const value = this.view.getUint32(this.offset, true);
598
+ this.offset += 4;
599
+ return value;
600
+ }
601
+ readFloat() {
602
+ const value = this.view.getFloat32(this.offset, true);
603
+ this.offset += 4;
604
+ return value;
605
+ }
606
+ readString() {
607
+ let str = "";
608
+ while (this.offset < this.length) {
609
+ const charCode = this.readChar();
610
+ if (charCode === -1 || charCode === 0) {
611
+ break;
612
+ }
613
+ str += String.fromCharCode(charCode);
614
+ }
615
+ return str;
616
+ }
617
+ readStringLine() {
618
+ let str = "";
619
+ while (this.offset < this.length) {
620
+ const charCode = this.readChar();
621
+ if (charCode === -1 || charCode === 0 || charCode === 10) {
622
+ break;
623
+ }
624
+ str += String.fromCharCode(charCode);
625
+ }
626
+ return str;
627
+ }
628
+ readCoord() {
629
+ return this.readShort() * (1 / 8);
630
+ }
631
+ readAngle() {
632
+ return this.readChar() * (360 / 256);
633
+ }
634
+ readAngle16() {
635
+ return this.readShort() * 360 / 65536;
636
+ }
637
+ readData(length) {
638
+ if (this.offset + length > this.length) {
639
+ throw new Error(`Read out of bounds: ${this.offset + length} (length: ${this.length})`);
640
+ }
641
+ const data = new Uint8Array(this.view.buffer, this.view.byteOffset + this.offset, length);
642
+ this.offset += length;
643
+ return new Uint8Array(data);
644
+ }
645
+ readPos(out) {
646
+ out.x = this.readCoord();
647
+ out.y = this.readCoord();
648
+ out.z = this.readCoord();
649
+ }
650
+ readDir(out) {
651
+ const b = this.readByte();
652
+ if (b >= 162) {
653
+ out.x = 0;
654
+ out.y = 0;
655
+ out.z = 0;
656
+ return;
657
+ }
658
+ const norm = ANORMS[b];
659
+ out.x = norm[0];
660
+ out.y = norm[1];
661
+ out.z = norm[2];
662
+ }
663
+ };
664
+ var BinaryWriter = class {
665
+ constructor(sizeOrBuffer = 1400) {
666
+ if (typeof sizeOrBuffer === "number") {
667
+ this.buffer = new Uint8Array(sizeOrBuffer);
668
+ this.fixed = false;
669
+ } else {
670
+ this.buffer = sizeOrBuffer;
671
+ this.fixed = true;
672
+ }
673
+ this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);
674
+ this.offset = 0;
675
+ }
676
+ ensureSpace(bytes) {
677
+ if (this.offset + bytes > this.buffer.byteLength) {
678
+ if (this.fixed) {
679
+ throw new Error(`Buffer overflow: capacity ${this.buffer.byteLength}, needed ${this.offset + bytes}`);
680
+ }
681
+ const newSize = Math.max(this.buffer.byteLength * 2, this.offset + bytes);
682
+ const newBuffer = new Uint8Array(newSize);
683
+ newBuffer.set(this.buffer);
684
+ this.buffer = newBuffer;
685
+ this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);
686
+ }
687
+ }
688
+ writeByte(value) {
689
+ this.ensureSpace(1);
690
+ this.view.setUint8(this.offset, value);
691
+ this.offset += 1;
692
+ }
693
+ writeBytes(data) {
694
+ this.ensureSpace(data.byteLength);
695
+ this.buffer.set(data, this.offset);
696
+ this.offset += data.byteLength;
697
+ }
698
+ writeChar(value) {
699
+ this.ensureSpace(1);
700
+ this.view.setInt8(this.offset, value);
701
+ this.offset += 1;
702
+ }
703
+ writeShort(value) {
704
+ this.ensureSpace(2);
705
+ this.view.setInt16(this.offset, value, true);
706
+ this.offset += 2;
707
+ }
708
+ writeLong(value) {
709
+ this.ensureSpace(4);
710
+ this.view.setInt32(this.offset, value, true);
711
+ this.offset += 4;
712
+ }
713
+ writeFloat(value) {
714
+ this.ensureSpace(4);
715
+ this.view.setFloat32(this.offset, value, true);
716
+ this.offset += 4;
717
+ }
718
+ writeString(value) {
719
+ const len = value.length;
720
+ this.ensureSpace(len + 1);
721
+ for (let i = 0; i < len; i++) {
722
+ this.view.setUint8(this.offset + i, value.charCodeAt(i));
723
+ }
724
+ this.view.setUint8(this.offset + len, 0);
725
+ this.offset += len + 1;
726
+ }
727
+ writeCoord(value) {
728
+ this.writeShort(Math.trunc(value * 8));
729
+ }
730
+ writeAngle(value) {
731
+ this.writeByte(Math.trunc(value * 256 / 360) & 255);
732
+ }
733
+ writeAngle16(value) {
734
+ this.writeShort(Math.trunc(value * 65536 / 360) & 65535);
735
+ }
736
+ writePos(pos) {
737
+ this.writeCoord(pos.x);
738
+ this.writeCoord(pos.y);
739
+ this.writeCoord(pos.z);
740
+ }
741
+ writeDir(dir) {
742
+ let maxDot = -1;
743
+ let bestIndex = 0;
744
+ if (dir.x === 0 && dir.y === 0 && dir.z === 0) {
745
+ this.writeByte(0);
746
+ return;
747
+ }
748
+ for (let i = 0; i < ANORMS.length; i++) {
749
+ const norm = ANORMS[i];
750
+ const dot = dir.x * norm[0] + dir.y * norm[1] + dir.z * norm[2];
751
+ if (dot > maxDot) {
752
+ maxDot = dot;
753
+ bestIndex = i;
754
+ }
755
+ }
756
+ this.writeByte(bestIndex);
757
+ }
758
+ getData() {
759
+ return this.buffer.slice(0, this.offset);
760
+ }
761
+ getBuffer() {
762
+ return this.buffer;
763
+ }
764
+ getOffset() {
765
+ return this.offset;
766
+ }
767
+ reset() {
768
+ this.offset = 0;
769
+ }
770
+ };
771
+ var _NetChan = class _NetChan2 {
772
+ constructor() {
773
+ this.qport = 0;
774
+ this.incomingSequence = 0;
775
+ this.outgoingSequence = 0;
776
+ this.incomingAcknowledged = 0;
777
+ this.incomingReliableAcknowledged = false;
778
+ this.incomingReliableSequence = 0;
779
+ this.outgoingReliableSequence = 0;
780
+ this.reliableLength = 0;
781
+ this.fragmentSendOffset = 0;
782
+ this.fragmentBuffer = null;
783
+ this.fragmentLength = 0;
784
+ this.fragmentReceived = 0;
785
+ this.lastReceived = 0;
786
+ this.lastSent = 0;
787
+ this.remoteAddress = null;
788
+ this.reliableMessage = new BinaryWriter(_NetChan2.MAX_RELIABLE_BUFFER);
789
+ const now = Date.now();
790
+ this.lastReceived = now;
791
+ this.lastSent = now;
792
+ this.qport = Math.floor(Math.random() * 65536);
793
+ }
794
+ /**
795
+ * Setup the netchan with specific settings
796
+ */
797
+ setup(qport, address = null) {
798
+ this.qport = qport;
799
+ this.remoteAddress = address;
800
+ this.reset();
801
+ }
802
+ /**
803
+ * Reset the netchan state
804
+ */
805
+ reset() {
806
+ this.incomingSequence = 0;
807
+ this.outgoingSequence = 0;
808
+ this.incomingAcknowledged = 0;
809
+ this.incomingReliableAcknowledged = false;
810
+ this.incomingReliableSequence = 0;
811
+ this.outgoingReliableSequence = 0;
812
+ this.reliableLength = 0;
813
+ this.reliableMessage.reset();
814
+ this.fragmentSendOffset = 0;
815
+ this.fragmentBuffer = null;
816
+ this.fragmentLength = 0;
817
+ this.fragmentReceived = 0;
818
+ this.lastReceived = Date.now();
819
+ this.lastSent = Date.now();
820
+ }
821
+ /**
822
+ * Transmits a packet containing reliable and unreliable data
823
+ */
824
+ transmit(unreliableData) {
825
+ this.outgoingSequence++;
826
+ this.lastSent = Date.now();
827
+ let sendReliableLength = 0;
828
+ let isFragment = false;
829
+ let fragmentStart = 0;
830
+ if (this.reliableLength > 0) {
831
+ if (this.reliableLength > _NetChan2.FRAGMENT_SIZE) {
832
+ isFragment = true;
833
+ if (this.fragmentSendOffset >= this.reliableLength) {
834
+ this.fragmentSendOffset = 0;
835
+ }
836
+ const remaining = this.reliableLength - this.fragmentSendOffset;
837
+ sendReliableLength = remaining;
838
+ if (sendReliableLength > _NetChan2.FRAGMENT_SIZE) {
839
+ sendReliableLength = _NetChan2.FRAGMENT_SIZE;
840
+ }
841
+ fragmentStart = this.fragmentSendOffset;
842
+ this.fragmentSendOffset += sendReliableLength;
843
+ } else {
844
+ sendReliableLength = this.reliableLength;
845
+ }
846
+ }
847
+ const headerSize = _NetChan2.PACKET_HEADER;
848
+ const reliableHeaderSize = sendReliableLength > 0 ? 2 + (isFragment ? 8 : 0) : 0;
849
+ let unreliableSize = unreliableData ? unreliableData.length : 0;
850
+ if (headerSize + reliableHeaderSize + sendReliableLength + unreliableSize > _NetChan2.MAX_MSGLEN) {
851
+ unreliableSize = _NetChan2.MAX_MSGLEN - headerSize - reliableHeaderSize - sendReliableLength;
852
+ if (unreliableSize < 0) unreliableSize = 0;
853
+ }
854
+ const buffer = new ArrayBuffer(headerSize + reliableHeaderSize + sendReliableLength + unreliableSize);
855
+ const view = new DataView(buffer);
856
+ const result = new Uint8Array(buffer);
857
+ let sequence = this.outgoingSequence;
858
+ if (sendReliableLength > 0) {
859
+ sequence |= 2147483648;
860
+ if ((this.outgoingReliableSequence & 1) !== 0) {
861
+ sequence |= 1073741824;
862
+ }
863
+ }
864
+ view.setUint32(0, sequence, true);
865
+ let ack = this.incomingSequence;
866
+ if ((this.incomingReliableSequence & 1) !== 0) {
867
+ ack |= 2147483648;
868
+ }
869
+ view.setUint32(4, ack, true);
870
+ view.setUint16(8, this.qport, true);
871
+ let offset = headerSize;
872
+ if (sendReliableLength > 0) {
873
+ let lengthField = sendReliableLength;
874
+ if (isFragment) {
875
+ lengthField |= 32768;
876
+ }
877
+ view.setUint16(offset, lengthField, true);
878
+ offset += 2;
879
+ if (isFragment) {
880
+ view.setUint32(offset, fragmentStart, true);
881
+ offset += 4;
882
+ view.setUint32(offset, this.reliableLength, true);
883
+ offset += 4;
884
+ }
885
+ const reliableBuffer = this.reliableMessage.getBuffer();
886
+ const reliableBytes = reliableBuffer.subarray(fragmentStart, fragmentStart + sendReliableLength);
887
+ result.set(reliableBytes, offset);
888
+ offset += sendReliableLength;
889
+ }
890
+ if (unreliableData && unreliableSize > 0) {
891
+ const chunk = unreliableData.slice(0, unreliableSize);
892
+ result.set(chunk, offset);
893
+ }
894
+ return result;
895
+ }
896
+ /**
897
+ * Processes a received packet
898
+ * Returns the payload data (reliable + unreliable) to be processed, or null if discarded
899
+ */
900
+ process(packet) {
901
+ if (packet.length < _NetChan2.PACKET_HEADER) {
902
+ return null;
903
+ }
904
+ this.lastReceived = Date.now();
905
+ const view = new DataView(packet.buffer, packet.byteOffset, packet.byteLength);
906
+ const sequence = view.getUint32(0, true);
907
+ const ack = view.getUint32(4, true);
908
+ const qport = view.getUint16(8, true);
909
+ if (this.qport !== qport) {
910
+ return null;
911
+ }
912
+ const seqNumberClean = sequence & ~(2147483648 | 1073741824);
913
+ if ((seqNumberClean - this.incomingSequence | 0) <= 0) {
914
+ return null;
915
+ }
916
+ this.incomingSequence = seqNumberClean;
917
+ const ackNumber = ack & ~2147483648;
918
+ const ackReliable = (ack & 2147483648) !== 0;
919
+ if (ackNumber > this.incomingAcknowledged) {
920
+ this.incomingAcknowledged = ackNumber;
921
+ }
922
+ if (this.reliableLength > 0) {
923
+ const receivedAckBit = ackReliable ? 1 : 0;
924
+ const currentReliableBit = this.outgoingReliableSequence & 1;
925
+ if (receivedAckBit !== currentReliableBit) {
926
+ this.reliableLength = 0;
927
+ this.reliableMessage.reset();
928
+ this.outgoingReliableSequence ^= 1;
929
+ this.fragmentSendOffset = 0;
930
+ }
931
+ }
932
+ const hasReliableData = (sequence & 2147483648) !== 0;
933
+ const reliableSeqBit = (sequence & 1073741824) !== 0 ? 1 : 0;
934
+ let payloadOffset = _NetChan2.PACKET_HEADER;
935
+ let reliableData = null;
936
+ if (hasReliableData) {
937
+ if (payloadOffset + 2 > packet.byteLength) return null;
938
+ let reliableLen = view.getUint16(payloadOffset, true);
939
+ payloadOffset += 2;
940
+ const isFragment = (reliableLen & 32768) !== 0;
941
+ reliableLen &= 32767;
942
+ const expectedBit = this.incomingReliableSequence & 1;
943
+ if (reliableSeqBit === expectedBit) {
944
+ if (isFragment) {
945
+ if (payloadOffset + 8 > packet.byteLength) return null;
946
+ const fragStart = view.getUint32(payloadOffset, true);
947
+ payloadOffset += 4;
948
+ const fragTotal = view.getUint32(payloadOffset, true);
949
+ payloadOffset += 4;
950
+ if (fragTotal > _NetChan2.MAX_RELIABLE_BUFFER) {
951
+ console.warn(`NetChan: received invalid fragment total ${fragTotal} > ${_NetChan2.MAX_RELIABLE_BUFFER}`);
952
+ return null;
953
+ }
954
+ if (!this.fragmentBuffer || this.fragmentBuffer.length !== fragTotal) {
955
+ this.fragmentBuffer = new Uint8Array(fragTotal);
956
+ this.fragmentLength = fragTotal;
957
+ this.fragmentReceived = 0;
958
+ }
959
+ if (payloadOffset + reliableLen > packet.byteLength) return null;
960
+ const data = packet.subarray(payloadOffset, payloadOffset + reliableLen);
961
+ if (fragStart === this.fragmentReceived && fragStart + reliableLen <= fragTotal) {
962
+ this.fragmentBuffer.set(data, fragStart);
963
+ this.fragmentReceived += reliableLen;
964
+ if (this.fragmentReceived >= fragTotal) {
965
+ reliableData = this.fragmentBuffer;
966
+ this.incomingReliableSequence++;
967
+ this.fragmentBuffer = null;
968
+ this.fragmentLength = 0;
969
+ this.fragmentReceived = 0;
970
+ }
971
+ }
972
+ } else {
973
+ this.incomingReliableSequence++;
974
+ if (payloadOffset + reliableLen > packet.byteLength) return null;
975
+ reliableData = packet.slice(payloadOffset, payloadOffset + reliableLen);
976
+ }
977
+ }
978
+ payloadOffset += reliableLen;
979
+ }
980
+ const unreliableData = packet.slice(payloadOffset);
981
+ if (reliableData && reliableData.length > 0) {
982
+ const totalLen = reliableData.length + unreliableData.length;
983
+ const result = new Uint8Array(totalLen);
984
+ result.set(reliableData, 0);
985
+ result.set(unreliableData, reliableData.length);
986
+ return result;
987
+ }
988
+ if (unreliableData) {
989
+ return unreliableData;
990
+ }
991
+ return new Uint8Array(0);
992
+ }
993
+ /**
994
+ * Checks if reliable message buffer is empty and ready for new data
995
+ */
996
+ canSendReliable() {
997
+ return this.reliableLength === 0;
998
+ }
999
+ /**
1000
+ * Writes a byte to the reliable message buffer
1001
+ */
1002
+ writeReliableByte(value) {
1003
+ if (this.reliableLength + 1 > _NetChan2.MAX_RELIABLE_BUFFER) {
1004
+ throw new Error("NetChan reliable buffer overflow");
1005
+ }
1006
+ this.reliableMessage.writeByte(value);
1007
+ this.reliableLength++;
1008
+ }
1009
+ /**
1010
+ * Writes a short to the reliable message buffer
1011
+ */
1012
+ writeReliableShort(value) {
1013
+ if (this.reliableLength + 2 > _NetChan2.MAX_RELIABLE_BUFFER) {
1014
+ throw new Error("NetChan reliable buffer overflow");
1015
+ }
1016
+ this.reliableMessage.writeShort(value);
1017
+ this.reliableLength += 2;
1018
+ }
1019
+ /**
1020
+ * Writes a long to the reliable message buffer
1021
+ */
1022
+ writeReliableLong(value) {
1023
+ if (this.reliableLength + 4 > _NetChan2.MAX_RELIABLE_BUFFER) {
1024
+ throw new Error("NetChan reliable buffer overflow");
1025
+ }
1026
+ this.reliableMessage.writeLong(value);
1027
+ this.reliableLength += 4;
1028
+ }
1029
+ /**
1030
+ * Writes a string to the reliable message buffer
1031
+ */
1032
+ writeReliableString(value) {
1033
+ const len = value.length + 1;
1034
+ if (this.reliableLength + len > _NetChan2.MAX_RELIABLE_BUFFER) {
1035
+ throw new Error("NetChan reliable buffer overflow");
1036
+ }
1037
+ this.reliableMessage.writeString(value);
1038
+ this.reliableLength += len;
1039
+ }
1040
+ /**
1041
+ * Returns the current reliable data buffer
1042
+ */
1043
+ getReliableData() {
1044
+ if (this.reliableLength === 0) {
1045
+ return new Uint8Array(0);
1046
+ }
1047
+ const buffer = this.reliableMessage.getBuffer();
1048
+ return buffer.subarray(0, this.reliableLength);
1049
+ }
1050
+ /**
1051
+ * Checks if we need to send a keepalive packet
1052
+ */
1053
+ needsKeepalive(currentTime) {
1054
+ return currentTime - this.lastSent > 1e3;
1055
+ }
1056
+ /**
1057
+ * Checks if the connection has timed out
1058
+ */
1059
+ isTimedOut(currentTime, timeoutMs = 3e4) {
1060
+ return currentTime - this.lastReceived > timeoutMs;
1061
+ }
1062
+ };
1063
+ _NetChan.MAX_MSGLEN = 1400;
1064
+ _NetChan.FRAGMENT_SIZE = 1024;
1065
+ _NetChan.PACKET_HEADER = 10;
1066
+ _NetChan.HEADER_OVERHEAD = _NetChan.PACKET_HEADER + 2;
1067
+ _NetChan.MAX_RELIABLE_BUFFER = 262144;
1068
+ var AmmoType = /* @__PURE__ */ ((AmmoType2) => {
1069
+ AmmoType2[AmmoType2["Bullets"] = 0] = "Bullets";
1070
+ AmmoType2[AmmoType2["Shells"] = 1] = "Shells";
1071
+ AmmoType2[AmmoType2["Rockets"] = 2] = "Rockets";
1072
+ AmmoType2[AmmoType2["Grenades"] = 3] = "Grenades";
1073
+ AmmoType2[AmmoType2["Cells"] = 4] = "Cells";
1074
+ AmmoType2[AmmoType2["Slugs"] = 5] = "Slugs";
1075
+ AmmoType2[AmmoType2["MagSlugs"] = 6] = "MagSlugs";
1076
+ AmmoType2[AmmoType2["Trap"] = 7] = "Trap";
1077
+ AmmoType2[AmmoType2["Flechettes"] = 8] = "Flechettes";
1078
+ AmmoType2[AmmoType2["Tesla"] = 9] = "Tesla";
1079
+ AmmoType2[AmmoType2["Disruptor"] = 10] = "Disruptor";
1080
+ AmmoType2[AmmoType2["Prox"] = 11] = "Prox";
1081
+ AmmoType2[AmmoType2["Nuke"] = 12] = "Nuke";
1082
+ AmmoType2[AmmoType2["Rounds"] = 13] = "Rounds";
1083
+ return AmmoType2;
1084
+ })(AmmoType || {});
1085
+ var AMMO_TYPE_COUNT = Object.keys(AmmoType).length / 2;
1086
+
1087
+ // src/bspTools.ts
1088
+ import { serializeEntLump } from "@quake2ts/engine";
1089
+ function replaceBspEntities(bspData, entities) {
1090
+ const reader = new BinaryStream(bspData);
1091
+ const magic = reader.readLong();
1092
+ const version = reader.readLong();
1093
+ if (magic !== 1347633737 || version !== 38) {
1094
+ throw new Error("Invalid BSP file");
1095
+ }
1096
+ const LUMP_ENTITIES = 0;
1097
+ const lumps = [];
1098
+ for (let i = 0; i < 19; i++) {
1099
+ lumps.push({
1100
+ offset: reader.readLong(),
1101
+ length: reader.readLong()
1102
+ });
1103
+ }
1104
+ const entitiesLump = lumps[LUMP_ENTITIES];
1105
+ const newEntitiesText = serializeEntLump(entities);
1106
+ const encoder = new TextEncoder();
1107
+ const newEntitiesData = encoder.encode(newEntitiesText);
1108
+ const newEntitiesBuffer = new Uint8Array(newEntitiesData.length + 1);
1109
+ newEntitiesBuffer.set(newEntitiesData);
1110
+ newEntitiesBuffer[newEntitiesData.length] = 0;
1111
+ const lengthDiff = newEntitiesBuffer.length - entitiesLump.length;
1112
+ const newBspLength = bspData.length + lengthDiff;
1113
+ const newBsp = new Uint8Array(newBspLength);
1114
+ const entOffset = entitiesLump.offset;
1115
+ const entEnd = entOffset + entitiesLump.length;
1116
+ newBsp.set(bspData.subarray(0, entOffset), 0);
1117
+ newBsp.set(newEntitiesBuffer, entOffset);
1118
+ if (entEnd < bspData.length) {
1119
+ newBsp.set(bspData.subarray(entEnd), entOffset + newEntitiesBuffer.length);
1120
+ }
1121
+ const view = new DataView(newBsp.buffer);
1122
+ view.setInt32(8, entOffset, true);
1123
+ view.setInt32(12, newEntitiesBuffer.length, true);
1124
+ for (let i = 0; i < 19; i++) {
1125
+ if (i === LUMP_ENTITIES) continue;
1126
+ const originalOffset = lumps[i].offset;
1127
+ if (originalOffset >= entEnd) {
1128
+ const newOffset = originalOffset + lengthDiff;
1129
+ view.setInt32(4 + 4 + i * 8, newOffset, true);
1130
+ }
1131
+ }
1132
+ return newBsp;
1133
+ }
1134
+
168
1135
  // src/index.ts
169
1136
  function describeAsset(name, origin) {
170
1137
  return { name, origin };
@@ -172,6 +1139,7 @@ function describeAsset(name, origin) {
172
1139
  export {
173
1140
  describeAsset,
174
1141
  exportMd2ToObj,
175
- exportMd3ToGltf
1142
+ exportMd3ToGltf,
1143
+ replaceBspEntities
176
1144
  };
177
1145
  //# sourceMappingURL=index.js.map