quake2ts 0.0.301 → 0.0.303

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 (38) hide show
  1. package/package.json +1 -1
  2. package/packages/client/dist/browser/index.global.js +13 -13
  3. package/packages/client/dist/browser/index.global.js.map +1 -1
  4. package/packages/client/dist/cjs/index.cjs +221 -38
  5. package/packages/client/dist/cjs/index.cjs.map +1 -1
  6. package/packages/client/dist/esm/index.js +221 -38
  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/entities.d.ts +1 -0
  10. package/packages/client/dist/types/entities.d.ts.map +1 -1
  11. package/packages/engine/dist/browser/index.global.js +9 -9
  12. package/packages/engine/dist/browser/index.global.js.map +1 -1
  13. package/packages/engine/dist/cjs/index.cjs +90 -18
  14. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  15. package/packages/engine/dist/esm/index.js +90 -18
  16. package/packages/engine/dist/esm/index.js.map +1 -1
  17. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  18. package/packages/engine/dist/types/render/renderer.d.ts.map +1 -1
  19. package/packages/engine/dist/types/render/scene.d.ts +2 -0
  20. package/packages/engine/dist/types/render/scene.d.ts.map +1 -1
  21. package/packages/game/dist/browser/index.global.js +4 -4
  22. package/packages/game/dist/browser/index.global.js.map +1 -1
  23. package/packages/game/dist/cjs/index.cjs +104 -19
  24. package/packages/game/dist/cjs/index.cjs.map +1 -1
  25. package/packages/game/dist/esm/index.js +104 -19
  26. package/packages/game/dist/esm/index.js.map +1 -1
  27. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  28. package/packages/game/dist/types/ai/monster.d.ts.map +1 -1
  29. package/packages/shared/dist/browser/index.global.js +1 -1
  30. package/packages/shared/dist/browser/index.global.js.map +1 -1
  31. package/packages/shared/dist/cjs/index.cjs +97 -19
  32. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  33. package/packages/shared/dist/esm/index.js +97 -19
  34. package/packages/shared/dist/esm/index.js.map +1 -1
  35. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  36. package/packages/shared/dist/types/net/netchan.d.ts +5 -0
  37. package/packages/shared/dist/types/net/netchan.d.ts.map +1 -1
  38. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
@@ -2410,10 +2410,14 @@ var _NetChan = class _NetChan2 {
2410
2410
  this.incomingReliableSequence = 0;
2411
2411
  this.outgoingReliableSequence = 0;
2412
2412
  this.reliableLength = 0;
2413
+ this.fragmentSendOffset = 0;
2414
+ this.fragmentBuffer = null;
2415
+ this.fragmentLength = 0;
2416
+ this.fragmentReceived = 0;
2413
2417
  this.lastReceived = 0;
2414
2418
  this.lastSent = 0;
2415
2419
  this.remoteAddress = null;
2416
- this.reliableMessage = new BinaryWriter(_NetChan2.MAX_MSGLEN);
2420
+ this.reliableMessage = new BinaryWriter(_NetChan2.MAX_RELIABLE_BUFFER);
2417
2421
  const now = Date.now();
2418
2422
  this.lastReceived = now;
2419
2423
  this.lastSent = now;
@@ -2439,6 +2443,10 @@ var _NetChan = class _NetChan2 {
2439
2443
  this.outgoingReliableSequence = 0;
2440
2444
  this.reliableLength = 0;
2441
2445
  this.reliableMessage.reset();
2446
+ this.fragmentSendOffset = 0;
2447
+ this.fragmentBuffer = null;
2448
+ this.fragmentLength = 0;
2449
+ this.fragmentReceived = 0;
2442
2450
  this.lastReceived = Date.now();
2443
2451
  this.lastSent = Date.now();
2444
2452
  }
@@ -2448,18 +2456,38 @@ var _NetChan = class _NetChan2 {
2448
2456
  transmit(unreliableData) {
2449
2457
  this.outgoingSequence++;
2450
2458
  this.lastSent = Date.now();
2459
+ let sendReliableLength = 0;
2460
+ let isFragment = false;
2461
+ let fragmentStart = 0;
2462
+ if (this.reliableLength > 0) {
2463
+ if (this.reliableLength > _NetChan2.FRAGMENT_SIZE) {
2464
+ isFragment = true;
2465
+ if (this.fragmentSendOffset >= this.reliableLength) {
2466
+ this.fragmentSendOffset = 0;
2467
+ }
2468
+ const remaining = this.reliableLength - this.fragmentSendOffset;
2469
+ sendReliableLength = remaining;
2470
+ if (sendReliableLength > _NetChan2.FRAGMENT_SIZE) {
2471
+ sendReliableLength = _NetChan2.FRAGMENT_SIZE;
2472
+ }
2473
+ fragmentStart = this.fragmentSendOffset;
2474
+ this.fragmentSendOffset += sendReliableLength;
2475
+ } else {
2476
+ sendReliableLength = this.reliableLength;
2477
+ }
2478
+ }
2451
2479
  const headerSize = _NetChan2.PACKET_HEADER;
2452
- const reliableSize = this.reliableLength > 0 ? this.reliableLength + 2 : 0;
2480
+ const reliableHeaderSize = sendReliableLength > 0 ? 2 + (isFragment ? 8 : 0) : 0;
2453
2481
  let unreliableSize = unreliableData ? unreliableData.length : 0;
2454
- if (headerSize + reliableSize + unreliableSize > _NetChan2.MAX_MSGLEN) {
2455
- unreliableSize = _NetChan2.MAX_MSGLEN - headerSize - reliableSize;
2482
+ if (headerSize + reliableHeaderSize + sendReliableLength + unreliableSize > _NetChan2.MAX_MSGLEN) {
2483
+ unreliableSize = _NetChan2.MAX_MSGLEN - headerSize - reliableHeaderSize - sendReliableLength;
2456
2484
  if (unreliableSize < 0) unreliableSize = 0;
2457
2485
  }
2458
- const buffer = new ArrayBuffer(headerSize + reliableSize + unreliableSize);
2486
+ const buffer = new ArrayBuffer(headerSize + reliableHeaderSize + sendReliableLength + unreliableSize);
2459
2487
  const view = new DataView(buffer);
2460
2488
  const result = new Uint8Array(buffer);
2461
2489
  let sequence = this.outgoingSequence;
2462
- if (this.reliableLength > 0) {
2490
+ if (sendReliableLength > 0) {
2463
2491
  sequence |= 2147483648;
2464
2492
  if ((this.outgoingReliableSequence & 1) !== 0) {
2465
2493
  sequence |= 1073741824;
@@ -2473,13 +2501,23 @@ var _NetChan = class _NetChan2 {
2473
2501
  view.setUint32(4, ack, true);
2474
2502
  view.setUint16(8, this.qport, true);
2475
2503
  let offset = headerSize;
2476
- if (this.reliableLength > 0) {
2477
- view.setUint16(offset, this.reliableLength, true);
2504
+ if (sendReliableLength > 0) {
2505
+ let lengthField = sendReliableLength;
2506
+ if (isFragment) {
2507
+ lengthField |= 32768;
2508
+ }
2509
+ view.setUint16(offset, lengthField, true);
2478
2510
  offset += 2;
2511
+ if (isFragment) {
2512
+ view.setUint32(offset, fragmentStart, true);
2513
+ offset += 4;
2514
+ view.setUint32(offset, this.reliableLength, true);
2515
+ offset += 4;
2516
+ }
2479
2517
  const reliableBuffer = this.reliableMessage.getBuffer();
2480
- const reliableBytes = reliableBuffer.subarray(0, this.reliableLength);
2518
+ const reliableBytes = reliableBuffer.subarray(fragmentStart, fragmentStart + sendReliableLength);
2481
2519
  result.set(reliableBytes, offset);
2482
- offset += this.reliableLength;
2520
+ offset += sendReliableLength;
2483
2521
  }
2484
2522
  if (unreliableData && unreliableSize > 0) {
2485
2523
  const chunk = unreliableData.slice(0, unreliableSize);
@@ -2520,6 +2558,7 @@ var _NetChan = class _NetChan2 {
2520
2558
  this.reliableLength = 0;
2521
2559
  this.reliableMessage.reset();
2522
2560
  this.outgoingReliableSequence ^= 1;
2561
+ this.fragmentSendOffset = 0;
2523
2562
  }
2524
2563
  }
2525
2564
  const hasReliableData = (sequence & 2147483648) !== 0;
@@ -2528,13 +2567,45 @@ var _NetChan = class _NetChan2 {
2528
2567
  let reliableData = null;
2529
2568
  if (hasReliableData) {
2530
2569
  if (payloadOffset + 2 > packet.byteLength) return null;
2531
- const reliableLen = view.getUint16(payloadOffset, true);
2570
+ let reliableLen = view.getUint16(payloadOffset, true);
2532
2571
  payloadOffset += 2;
2572
+ const isFragment = (reliableLen & 32768) !== 0;
2573
+ reliableLen &= 32767;
2533
2574
  const expectedBit = this.incomingReliableSequence & 1;
2534
2575
  if (reliableSeqBit === expectedBit) {
2535
- this.incomingReliableSequence++;
2536
- if (payloadOffset + reliableLen > packet.byteLength) return null;
2537
- reliableData = packet.slice(payloadOffset, payloadOffset + reliableLen);
2576
+ if (isFragment) {
2577
+ if (payloadOffset + 8 > packet.byteLength) return null;
2578
+ const fragStart = view.getUint32(payloadOffset, true);
2579
+ payloadOffset += 4;
2580
+ const fragTotal = view.getUint32(payloadOffset, true);
2581
+ payloadOffset += 4;
2582
+ if (fragTotal > _NetChan2.MAX_RELIABLE_BUFFER) {
2583
+ console.warn(`NetChan: received invalid fragment total ${fragTotal} > ${_NetChan2.MAX_RELIABLE_BUFFER}`);
2584
+ return null;
2585
+ }
2586
+ if (!this.fragmentBuffer || this.fragmentBuffer.length !== fragTotal) {
2587
+ this.fragmentBuffer = new Uint8Array(fragTotal);
2588
+ this.fragmentLength = fragTotal;
2589
+ this.fragmentReceived = 0;
2590
+ }
2591
+ if (payloadOffset + reliableLen > packet.byteLength) return null;
2592
+ const data = packet.subarray(payloadOffset, payloadOffset + reliableLen);
2593
+ if (fragStart === this.fragmentReceived && fragStart + reliableLen <= fragTotal) {
2594
+ this.fragmentBuffer.set(data, fragStart);
2595
+ this.fragmentReceived += reliableLen;
2596
+ if (this.fragmentReceived >= fragTotal) {
2597
+ reliableData = this.fragmentBuffer;
2598
+ this.incomingReliableSequence++;
2599
+ this.fragmentBuffer = null;
2600
+ this.fragmentLength = 0;
2601
+ this.fragmentReceived = 0;
2602
+ }
2603
+ }
2604
+ } else {
2605
+ this.incomingReliableSequence++;
2606
+ if (payloadOffset + reliableLen > packet.byteLength) return null;
2607
+ reliableData = packet.slice(payloadOffset, payloadOffset + reliableLen);
2608
+ }
2538
2609
  }
2539
2610
  payloadOffset += reliableLen;
2540
2611
  }
@@ -2561,7 +2632,7 @@ var _NetChan = class _NetChan2 {
2561
2632
  * Writes a byte to the reliable message buffer
2562
2633
  */
2563
2634
  writeReliableByte(value) {
2564
- if (this.reliableLength + 1 > _NetChan2.MAX_MSGLEN - _NetChan2.HEADER_OVERHEAD) {
2635
+ if (this.reliableLength + 1 > _NetChan2.MAX_RELIABLE_BUFFER) {
2565
2636
  throw new Error("NetChan reliable buffer overflow");
2566
2637
  }
2567
2638
  this.reliableMessage.writeByte(value);
@@ -2571,7 +2642,7 @@ var _NetChan = class _NetChan2 {
2571
2642
  * Writes a short to the reliable message buffer
2572
2643
  */
2573
2644
  writeReliableShort(value) {
2574
- if (this.reliableLength + 2 > _NetChan2.MAX_MSGLEN - _NetChan2.HEADER_OVERHEAD) {
2645
+ if (this.reliableLength + 2 > _NetChan2.MAX_RELIABLE_BUFFER) {
2575
2646
  throw new Error("NetChan reliable buffer overflow");
2576
2647
  }
2577
2648
  this.reliableMessage.writeShort(value);
@@ -2581,7 +2652,7 @@ var _NetChan = class _NetChan2 {
2581
2652
  * Writes a long to the reliable message buffer
2582
2653
  */
2583
2654
  writeReliableLong(value) {
2584
- if (this.reliableLength + 4 > _NetChan2.MAX_MSGLEN - _NetChan2.HEADER_OVERHEAD) {
2655
+ if (this.reliableLength + 4 > _NetChan2.MAX_RELIABLE_BUFFER) {
2585
2656
  throw new Error("NetChan reliable buffer overflow");
2586
2657
  }
2587
2658
  this.reliableMessage.writeLong(value);
@@ -2592,7 +2663,7 @@ var _NetChan = class _NetChan2 {
2592
2663
  */
2593
2664
  writeReliableString(value) {
2594
2665
  const len2 = value.length + 1;
2595
- if (this.reliableLength + len2 > _NetChan2.MAX_MSGLEN - _NetChan2.HEADER_OVERHEAD) {
2666
+ if (this.reliableLength + len2 > _NetChan2.MAX_RELIABLE_BUFFER) {
2596
2667
  throw new Error("NetChan reliable buffer overflow");
2597
2668
  }
2598
2669
  this.reliableMessage.writeString(value);
@@ -2625,6 +2696,7 @@ _NetChan.MAX_MSGLEN = 1400;
2625
2696
  _NetChan.FRAGMENT_SIZE = 1024;
2626
2697
  _NetChan.PACKET_HEADER = 10;
2627
2698
  _NetChan.HEADER_OVERHEAD = _NetChan.PACKET_HEADER + 2;
2699
+ _NetChan.MAX_RELIABLE_BUFFER = 262144;
2628
2700
  var AmmoType = /* @__PURE__ */ ((AmmoType22) => {
2629
2701
  AmmoType22[AmmoType22["Bullets"] = 0] = "Bullets";
2630
2702
  AmmoType22[AmmoType22["Shells"] = 1] = "Shells";
@@ -9034,6 +9106,28 @@ function writeUserCommand(writer, cmd) {
9034
9106
  writer.writeByte(0);
9035
9107
  writer.writeByte(0);
9036
9108
  }
9109
+ var RenderFx = /* @__PURE__ */ ((RenderFx2) => {
9110
+ RenderFx2[RenderFx2["MinLight"] = 1] = "MinLight";
9111
+ RenderFx2[RenderFx2["ViewerModel"] = 2] = "ViewerModel";
9112
+ RenderFx2[RenderFx2["WeaponModel"] = 4] = "WeaponModel";
9113
+ RenderFx2[RenderFx2["FullBright"] = 8] = "FullBright";
9114
+ RenderFx2[RenderFx2["DepthHack"] = 16] = "DepthHack";
9115
+ RenderFx2[RenderFx2["Translucent"] = 32] = "Translucent";
9116
+ RenderFx2[RenderFx2["FrameLerp"] = 64] = "FrameLerp";
9117
+ RenderFx2[RenderFx2["Beam"] = 128] = "Beam";
9118
+ RenderFx2[RenderFx2["CustomLight"] = 256] = "CustomLight";
9119
+ RenderFx2[RenderFx2["Glow"] = 512] = "Glow";
9120
+ RenderFx2[RenderFx2["ShellRed"] = 1024] = "ShellRed";
9121
+ RenderFx2[RenderFx2["ShellGreen"] = 2048] = "ShellGreen";
9122
+ RenderFx2[RenderFx2["ShellBlue"] = 4096] = "ShellBlue";
9123
+ RenderFx2[RenderFx2["IrVisible"] = 32768] = "IrVisible";
9124
+ RenderFx2[RenderFx2["ShellDouble"] = 65536] = "ShellDouble";
9125
+ RenderFx2[RenderFx2["ShellHalfDam"] = 131072] = "ShellHalfDam";
9126
+ RenderFx2[RenderFx2["MinLightPlus"] = 262144] = "MinLightPlus";
9127
+ RenderFx2[RenderFx2["ExtraLight"] = 524288] = "ExtraLight";
9128
+ RenderFx2[RenderFx2["BeamLightning"] = 1048576] = "BeamLightning";
9129
+ return RenderFx2;
9130
+ })(RenderFx || {});
9037
9131
  var entityFlags_exports2 = {};
9038
9132
  __export3(entityFlags_exports2, {
9039
9133
  U_ANGLE1: () => U_ANGLE13,
@@ -9394,10 +9488,14 @@ var _NetChan3 = class _NetChan4 {
9394
9488
  this.incomingReliableSequence = 0;
9395
9489
  this.outgoingReliableSequence = 0;
9396
9490
  this.reliableLength = 0;
9491
+ this.fragmentSendOffset = 0;
9492
+ this.fragmentBuffer = null;
9493
+ this.fragmentLength = 0;
9494
+ this.fragmentReceived = 0;
9397
9495
  this.lastReceived = 0;
9398
9496
  this.lastSent = 0;
9399
9497
  this.remoteAddress = null;
9400
- this.reliableMessage = new BinaryWriter2(_NetChan4.MAX_MSGLEN);
9498
+ this.reliableMessage = new BinaryWriter2(_NetChan4.MAX_RELIABLE_BUFFER);
9401
9499
  const now = Date.now();
9402
9500
  this.lastReceived = now;
9403
9501
  this.lastSent = now;
@@ -9423,6 +9521,10 @@ var _NetChan3 = class _NetChan4 {
9423
9521
  this.outgoingReliableSequence = 0;
9424
9522
  this.reliableLength = 0;
9425
9523
  this.reliableMessage.reset();
9524
+ this.fragmentSendOffset = 0;
9525
+ this.fragmentBuffer = null;
9526
+ this.fragmentLength = 0;
9527
+ this.fragmentReceived = 0;
9426
9528
  this.lastReceived = Date.now();
9427
9529
  this.lastSent = Date.now();
9428
9530
  }
@@ -9432,18 +9534,38 @@ var _NetChan3 = class _NetChan4 {
9432
9534
  transmit(unreliableData) {
9433
9535
  this.outgoingSequence++;
9434
9536
  this.lastSent = Date.now();
9537
+ let sendReliableLength = 0;
9538
+ let isFragment = false;
9539
+ let fragmentStart = 0;
9540
+ if (this.reliableLength > 0) {
9541
+ if (this.reliableLength > _NetChan4.FRAGMENT_SIZE) {
9542
+ isFragment = true;
9543
+ if (this.fragmentSendOffset >= this.reliableLength) {
9544
+ this.fragmentSendOffset = 0;
9545
+ }
9546
+ const remaining = this.reliableLength - this.fragmentSendOffset;
9547
+ sendReliableLength = remaining;
9548
+ if (sendReliableLength > _NetChan4.FRAGMENT_SIZE) {
9549
+ sendReliableLength = _NetChan4.FRAGMENT_SIZE;
9550
+ }
9551
+ fragmentStart = this.fragmentSendOffset;
9552
+ this.fragmentSendOffset += sendReliableLength;
9553
+ } else {
9554
+ sendReliableLength = this.reliableLength;
9555
+ }
9556
+ }
9435
9557
  const headerSize = _NetChan4.PACKET_HEADER;
9436
- const reliableSize = this.reliableLength > 0 ? this.reliableLength + 2 : 0;
9558
+ const reliableHeaderSize = sendReliableLength > 0 ? 2 + (isFragment ? 8 : 0) : 0;
9437
9559
  let unreliableSize = unreliableData ? unreliableData.length : 0;
9438
- if (headerSize + reliableSize + unreliableSize > _NetChan4.MAX_MSGLEN) {
9439
- unreliableSize = _NetChan4.MAX_MSGLEN - headerSize - reliableSize;
9560
+ if (headerSize + reliableHeaderSize + sendReliableLength + unreliableSize > _NetChan4.MAX_MSGLEN) {
9561
+ unreliableSize = _NetChan4.MAX_MSGLEN - headerSize - reliableHeaderSize - sendReliableLength;
9440
9562
  if (unreliableSize < 0) unreliableSize = 0;
9441
9563
  }
9442
- const buffer = new ArrayBuffer(headerSize + reliableSize + unreliableSize);
9564
+ const buffer = new ArrayBuffer(headerSize + reliableHeaderSize + sendReliableLength + unreliableSize);
9443
9565
  const view = new DataView(buffer);
9444
9566
  const result = new Uint8Array(buffer);
9445
9567
  let sequence = this.outgoingSequence;
9446
- if (this.reliableLength > 0) {
9568
+ if (sendReliableLength > 0) {
9447
9569
  sequence |= 2147483648;
9448
9570
  if ((this.outgoingReliableSequence & 1) !== 0) {
9449
9571
  sequence |= 1073741824;
@@ -9457,13 +9579,23 @@ var _NetChan3 = class _NetChan4 {
9457
9579
  view.setUint32(4, ack, true);
9458
9580
  view.setUint16(8, this.qport, true);
9459
9581
  let offset = headerSize;
9460
- if (this.reliableLength > 0) {
9461
- view.setUint16(offset, this.reliableLength, true);
9582
+ if (sendReliableLength > 0) {
9583
+ let lengthField = sendReliableLength;
9584
+ if (isFragment) {
9585
+ lengthField |= 32768;
9586
+ }
9587
+ view.setUint16(offset, lengthField, true);
9462
9588
  offset += 2;
9589
+ if (isFragment) {
9590
+ view.setUint32(offset, fragmentStart, true);
9591
+ offset += 4;
9592
+ view.setUint32(offset, this.reliableLength, true);
9593
+ offset += 4;
9594
+ }
9463
9595
  const reliableBuffer = this.reliableMessage.getBuffer();
9464
- const reliableBytes = reliableBuffer.subarray(0, this.reliableLength);
9596
+ const reliableBytes = reliableBuffer.subarray(fragmentStart, fragmentStart + sendReliableLength);
9465
9597
  result.set(reliableBytes, offset);
9466
- offset += this.reliableLength;
9598
+ offset += sendReliableLength;
9467
9599
  }
9468
9600
  if (unreliableData && unreliableSize > 0) {
9469
9601
  const chunk = unreliableData.slice(0, unreliableSize);
@@ -9504,6 +9636,7 @@ var _NetChan3 = class _NetChan4 {
9504
9636
  this.reliableLength = 0;
9505
9637
  this.reliableMessage.reset();
9506
9638
  this.outgoingReliableSequence ^= 1;
9639
+ this.fragmentSendOffset = 0;
9507
9640
  }
9508
9641
  }
9509
9642
  const hasReliableData = (sequence & 2147483648) !== 0;
@@ -9512,13 +9645,45 @@ var _NetChan3 = class _NetChan4 {
9512
9645
  let reliableData = null;
9513
9646
  if (hasReliableData) {
9514
9647
  if (payloadOffset + 2 > packet.byteLength) return null;
9515
- const reliableLen = view.getUint16(payloadOffset, true);
9648
+ let reliableLen = view.getUint16(payloadOffset, true);
9516
9649
  payloadOffset += 2;
9650
+ const isFragment = (reliableLen & 32768) !== 0;
9651
+ reliableLen &= 32767;
9517
9652
  const expectedBit = this.incomingReliableSequence & 1;
9518
9653
  if (reliableSeqBit === expectedBit) {
9519
- this.incomingReliableSequence++;
9520
- if (payloadOffset + reliableLen > packet.byteLength) return null;
9521
- reliableData = packet.slice(payloadOffset, payloadOffset + reliableLen);
9654
+ if (isFragment) {
9655
+ if (payloadOffset + 8 > packet.byteLength) return null;
9656
+ const fragStart = view.getUint32(payloadOffset, true);
9657
+ payloadOffset += 4;
9658
+ const fragTotal = view.getUint32(payloadOffset, true);
9659
+ payloadOffset += 4;
9660
+ if (fragTotal > _NetChan4.MAX_RELIABLE_BUFFER) {
9661
+ console.warn(`NetChan: received invalid fragment total ${fragTotal} > ${_NetChan4.MAX_RELIABLE_BUFFER}`);
9662
+ return null;
9663
+ }
9664
+ if (!this.fragmentBuffer || this.fragmentBuffer.length !== fragTotal) {
9665
+ this.fragmentBuffer = new Uint8Array(fragTotal);
9666
+ this.fragmentLength = fragTotal;
9667
+ this.fragmentReceived = 0;
9668
+ }
9669
+ if (payloadOffset + reliableLen > packet.byteLength) return null;
9670
+ const data = packet.subarray(payloadOffset, payloadOffset + reliableLen);
9671
+ if (fragStart === this.fragmentReceived && fragStart + reliableLen <= fragTotal) {
9672
+ this.fragmentBuffer.set(data, fragStart);
9673
+ this.fragmentReceived += reliableLen;
9674
+ if (this.fragmentReceived >= fragTotal) {
9675
+ reliableData = this.fragmentBuffer;
9676
+ this.incomingReliableSequence++;
9677
+ this.fragmentBuffer = null;
9678
+ this.fragmentLength = 0;
9679
+ this.fragmentReceived = 0;
9680
+ }
9681
+ }
9682
+ } else {
9683
+ this.incomingReliableSequence++;
9684
+ if (payloadOffset + reliableLen > packet.byteLength) return null;
9685
+ reliableData = packet.slice(payloadOffset, payloadOffset + reliableLen);
9686
+ }
9522
9687
  }
9523
9688
  payloadOffset += reliableLen;
9524
9689
  }
@@ -9545,7 +9710,7 @@ var _NetChan3 = class _NetChan4 {
9545
9710
  * Writes a byte to the reliable message buffer
9546
9711
  */
9547
9712
  writeReliableByte(value) {
9548
- if (this.reliableLength + 1 > _NetChan4.MAX_MSGLEN - _NetChan4.HEADER_OVERHEAD) {
9713
+ if (this.reliableLength + 1 > _NetChan4.MAX_RELIABLE_BUFFER) {
9549
9714
  throw new Error("NetChan reliable buffer overflow");
9550
9715
  }
9551
9716
  this.reliableMessage.writeByte(value);
@@ -9555,7 +9720,7 @@ var _NetChan3 = class _NetChan4 {
9555
9720
  * Writes a short to the reliable message buffer
9556
9721
  */
9557
9722
  writeReliableShort(value) {
9558
- if (this.reliableLength + 2 > _NetChan4.MAX_MSGLEN - _NetChan4.HEADER_OVERHEAD) {
9723
+ if (this.reliableLength + 2 > _NetChan4.MAX_RELIABLE_BUFFER) {
9559
9724
  throw new Error("NetChan reliable buffer overflow");
9560
9725
  }
9561
9726
  this.reliableMessage.writeShort(value);
@@ -9565,7 +9730,7 @@ var _NetChan3 = class _NetChan4 {
9565
9730
  * Writes a long to the reliable message buffer
9566
9731
  */
9567
9732
  writeReliableLong(value) {
9568
- if (this.reliableLength + 4 > _NetChan4.MAX_MSGLEN - _NetChan4.HEADER_OVERHEAD) {
9733
+ if (this.reliableLength + 4 > _NetChan4.MAX_RELIABLE_BUFFER) {
9569
9734
  throw new Error("NetChan reliable buffer overflow");
9570
9735
  }
9571
9736
  this.reliableMessage.writeLong(value);
@@ -9576,7 +9741,7 @@ var _NetChan3 = class _NetChan4 {
9576
9741
  */
9577
9742
  writeReliableString(value) {
9578
9743
  const len2 = value.length + 1;
9579
- if (this.reliableLength + len2 > _NetChan4.MAX_MSGLEN - _NetChan4.HEADER_OVERHEAD) {
9744
+ if (this.reliableLength + len2 > _NetChan4.MAX_RELIABLE_BUFFER) {
9580
9745
  throw new Error("NetChan reliable buffer overflow");
9581
9746
  }
9582
9747
  this.reliableMessage.writeString(value);
@@ -9609,6 +9774,7 @@ _NetChan3.MAX_MSGLEN = 1400;
9609
9774
  _NetChan3.FRAGMENT_SIZE = 1024;
9610
9775
  _NetChan3.PACKET_HEADER = 10;
9611
9776
  _NetChan3.HEADER_OVERHEAD = _NetChan3.PACKET_HEADER + 2;
9777
+ _NetChan3.MAX_RELIABLE_BUFFER = 262144;
9612
9778
  var NetChan = _NetChan3;
9613
9779
  var AmmoType2 = /* @__PURE__ */ ((AmmoType22) => {
9614
9780
  AmmoType22[AmmoType22["Bullets"] = 0] = "Bullets";
@@ -10219,6 +10385,21 @@ function buildRenderableEntities(latestEntities, previousEntities, alpha, config
10219
10385
  mat4_exports.rotateX(mat, mat, angles.x * Math.PI / 180);
10220
10386
  mat4_exports.scale(mat, mat, [scale3, scale3, scale3]);
10221
10387
  const skinName = skinNum !== void 0 && skinNum > 0 ? configStrings.getImageName(skinNum) : void 0;
10388
+ let tint;
10389
+ const renderfx = ent.renderfx ?? 0;
10390
+ if ((renderfx & (RenderFx.ShellGreen | RenderFx.ShellBlue)) === (RenderFx.ShellGreen | RenderFx.ShellBlue)) {
10391
+ tint = [0, 1, 1, 1];
10392
+ } else if (renderfx & RenderFx.ShellRed) {
10393
+ tint = [1, 0, 0, 1];
10394
+ } else if (renderfx & RenderFx.ShellGreen) {
10395
+ tint = [0, 1, 0, 1];
10396
+ } else if (renderfx & RenderFx.ShellBlue) {
10397
+ tint = [0, 0, 1, 1];
10398
+ } else if (renderfx & RenderFx.ShellDouble) {
10399
+ tint = [1, 1, 0, 1];
10400
+ } else if (renderfx & RenderFx.ShellHalfDam) {
10401
+ tint = [0.5, 0.5, 0.5, 1];
10402
+ }
10222
10403
  if (model.header.magic === 844121161) {
10223
10404
  renderables.push({
10224
10405
  type: "md2",
@@ -10231,7 +10412,8 @@ function buildRenderableEntities(latestEntities, previousEntities, alpha, config
10231
10412
  },
10232
10413
  transform: mat,
10233
10414
  skin: skinName,
10234
- alpha: normalizedAlpha
10415
+ alpha: normalizedAlpha,
10416
+ tint
10235
10417
  });
10236
10418
  } else if (model.header.magic === 860898377) {
10237
10419
  renderables.push({
@@ -10243,7 +10425,8 @@ function buildRenderableEntities(latestEntities, previousEntities, alpha, config
10243
10425
  lerp: alpha
10244
10426
  },
10245
10427
  transform: mat,
10246
- alpha: normalizedAlpha
10428
+ alpha: normalizedAlpha,
10429
+ tint
10247
10430
  // Lighting? Skins?
10248
10431
  });
10249
10432
  }