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
@@ -2442,10 +2442,14 @@ var _NetChan = class _NetChan2 {
2442
2442
  this.incomingReliableSequence = 0;
2443
2443
  this.outgoingReliableSequence = 0;
2444
2444
  this.reliableLength = 0;
2445
+ this.fragmentSendOffset = 0;
2446
+ this.fragmentBuffer = null;
2447
+ this.fragmentLength = 0;
2448
+ this.fragmentReceived = 0;
2445
2449
  this.lastReceived = 0;
2446
2450
  this.lastSent = 0;
2447
2451
  this.remoteAddress = null;
2448
- this.reliableMessage = new BinaryWriter(_NetChan2.MAX_MSGLEN);
2452
+ this.reliableMessage = new BinaryWriter(_NetChan2.MAX_RELIABLE_BUFFER);
2449
2453
  const now = Date.now();
2450
2454
  this.lastReceived = now;
2451
2455
  this.lastSent = now;
@@ -2471,6 +2475,10 @@ var _NetChan = class _NetChan2 {
2471
2475
  this.outgoingReliableSequence = 0;
2472
2476
  this.reliableLength = 0;
2473
2477
  this.reliableMessage.reset();
2478
+ this.fragmentSendOffset = 0;
2479
+ this.fragmentBuffer = null;
2480
+ this.fragmentLength = 0;
2481
+ this.fragmentReceived = 0;
2474
2482
  this.lastReceived = Date.now();
2475
2483
  this.lastSent = Date.now();
2476
2484
  }
@@ -2480,18 +2488,38 @@ var _NetChan = class _NetChan2 {
2480
2488
  transmit(unreliableData) {
2481
2489
  this.outgoingSequence++;
2482
2490
  this.lastSent = Date.now();
2491
+ let sendReliableLength = 0;
2492
+ let isFragment = false;
2493
+ let fragmentStart = 0;
2494
+ if (this.reliableLength > 0) {
2495
+ if (this.reliableLength > _NetChan2.FRAGMENT_SIZE) {
2496
+ isFragment = true;
2497
+ if (this.fragmentSendOffset >= this.reliableLength) {
2498
+ this.fragmentSendOffset = 0;
2499
+ }
2500
+ const remaining = this.reliableLength - this.fragmentSendOffset;
2501
+ sendReliableLength = remaining;
2502
+ if (sendReliableLength > _NetChan2.FRAGMENT_SIZE) {
2503
+ sendReliableLength = _NetChan2.FRAGMENT_SIZE;
2504
+ }
2505
+ fragmentStart = this.fragmentSendOffset;
2506
+ this.fragmentSendOffset += sendReliableLength;
2507
+ } else {
2508
+ sendReliableLength = this.reliableLength;
2509
+ }
2510
+ }
2483
2511
  const headerSize = _NetChan2.PACKET_HEADER;
2484
- const reliableSize = this.reliableLength > 0 ? this.reliableLength + 2 : 0;
2512
+ const reliableHeaderSize = sendReliableLength > 0 ? 2 + (isFragment ? 8 : 0) : 0;
2485
2513
  let unreliableSize = unreliableData ? unreliableData.length : 0;
2486
- if (headerSize + reliableSize + unreliableSize > _NetChan2.MAX_MSGLEN) {
2487
- unreliableSize = _NetChan2.MAX_MSGLEN - headerSize - reliableSize;
2514
+ if (headerSize + reliableHeaderSize + sendReliableLength + unreliableSize > _NetChan2.MAX_MSGLEN) {
2515
+ unreliableSize = _NetChan2.MAX_MSGLEN - headerSize - reliableHeaderSize - sendReliableLength;
2488
2516
  if (unreliableSize < 0) unreliableSize = 0;
2489
2517
  }
2490
- const buffer = new ArrayBuffer(headerSize + reliableSize + unreliableSize);
2518
+ const buffer = new ArrayBuffer(headerSize + reliableHeaderSize + sendReliableLength + unreliableSize);
2491
2519
  const view = new DataView(buffer);
2492
2520
  const result = new Uint8Array(buffer);
2493
2521
  let sequence = this.outgoingSequence;
2494
- if (this.reliableLength > 0) {
2522
+ if (sendReliableLength > 0) {
2495
2523
  sequence |= 2147483648;
2496
2524
  if ((this.outgoingReliableSequence & 1) !== 0) {
2497
2525
  sequence |= 1073741824;
@@ -2505,13 +2533,23 @@ var _NetChan = class _NetChan2 {
2505
2533
  view.setUint32(4, ack, true);
2506
2534
  view.setUint16(8, this.qport, true);
2507
2535
  let offset = headerSize;
2508
- if (this.reliableLength > 0) {
2509
- view.setUint16(offset, this.reliableLength, true);
2536
+ if (sendReliableLength > 0) {
2537
+ let lengthField = sendReliableLength;
2538
+ if (isFragment) {
2539
+ lengthField |= 32768;
2540
+ }
2541
+ view.setUint16(offset, lengthField, true);
2510
2542
  offset += 2;
2543
+ if (isFragment) {
2544
+ view.setUint32(offset, fragmentStart, true);
2545
+ offset += 4;
2546
+ view.setUint32(offset, this.reliableLength, true);
2547
+ offset += 4;
2548
+ }
2511
2549
  const reliableBuffer = this.reliableMessage.getBuffer();
2512
- const reliableBytes = reliableBuffer.subarray(0, this.reliableLength);
2550
+ const reliableBytes = reliableBuffer.subarray(fragmentStart, fragmentStart + sendReliableLength);
2513
2551
  result.set(reliableBytes, offset);
2514
- offset += this.reliableLength;
2552
+ offset += sendReliableLength;
2515
2553
  }
2516
2554
  if (unreliableData && unreliableSize > 0) {
2517
2555
  const chunk = unreliableData.slice(0, unreliableSize);
@@ -2552,6 +2590,7 @@ var _NetChan = class _NetChan2 {
2552
2590
  this.reliableLength = 0;
2553
2591
  this.reliableMessage.reset();
2554
2592
  this.outgoingReliableSequence ^= 1;
2593
+ this.fragmentSendOffset = 0;
2555
2594
  }
2556
2595
  }
2557
2596
  const hasReliableData = (sequence & 2147483648) !== 0;
@@ -2560,13 +2599,45 @@ var _NetChan = class _NetChan2 {
2560
2599
  let reliableData = null;
2561
2600
  if (hasReliableData) {
2562
2601
  if (payloadOffset + 2 > packet.byteLength) return null;
2563
- const reliableLen = view.getUint16(payloadOffset, true);
2602
+ let reliableLen = view.getUint16(payloadOffset, true);
2564
2603
  payloadOffset += 2;
2604
+ const isFragment = (reliableLen & 32768) !== 0;
2605
+ reliableLen &= 32767;
2565
2606
  const expectedBit = this.incomingReliableSequence & 1;
2566
2607
  if (reliableSeqBit === expectedBit) {
2567
- this.incomingReliableSequence++;
2568
- if (payloadOffset + reliableLen > packet.byteLength) return null;
2569
- reliableData = packet.slice(payloadOffset, payloadOffset + reliableLen);
2608
+ if (isFragment) {
2609
+ if (payloadOffset + 8 > packet.byteLength) return null;
2610
+ const fragStart = view.getUint32(payloadOffset, true);
2611
+ payloadOffset += 4;
2612
+ const fragTotal = view.getUint32(payloadOffset, true);
2613
+ payloadOffset += 4;
2614
+ if (fragTotal > _NetChan2.MAX_RELIABLE_BUFFER) {
2615
+ console.warn(`NetChan: received invalid fragment total ${fragTotal} > ${_NetChan2.MAX_RELIABLE_BUFFER}`);
2616
+ return null;
2617
+ }
2618
+ if (!this.fragmentBuffer || this.fragmentBuffer.length !== fragTotal) {
2619
+ this.fragmentBuffer = new Uint8Array(fragTotal);
2620
+ this.fragmentLength = fragTotal;
2621
+ this.fragmentReceived = 0;
2622
+ }
2623
+ if (payloadOffset + reliableLen > packet.byteLength) return null;
2624
+ const data = packet.subarray(payloadOffset, payloadOffset + reliableLen);
2625
+ if (fragStart === this.fragmentReceived && fragStart + reliableLen <= fragTotal) {
2626
+ this.fragmentBuffer.set(data, fragStart);
2627
+ this.fragmentReceived += reliableLen;
2628
+ if (this.fragmentReceived >= fragTotal) {
2629
+ reliableData = this.fragmentBuffer;
2630
+ this.incomingReliableSequence++;
2631
+ this.fragmentBuffer = null;
2632
+ this.fragmentLength = 0;
2633
+ this.fragmentReceived = 0;
2634
+ }
2635
+ }
2636
+ } else {
2637
+ this.incomingReliableSequence++;
2638
+ if (payloadOffset + reliableLen > packet.byteLength) return null;
2639
+ reliableData = packet.slice(payloadOffset, payloadOffset + reliableLen);
2640
+ }
2570
2641
  }
2571
2642
  payloadOffset += reliableLen;
2572
2643
  }
@@ -2593,7 +2664,7 @@ var _NetChan = class _NetChan2 {
2593
2664
  * Writes a byte to the reliable message buffer
2594
2665
  */
2595
2666
  writeReliableByte(value) {
2596
- if (this.reliableLength + 1 > _NetChan2.MAX_MSGLEN - _NetChan2.HEADER_OVERHEAD) {
2667
+ if (this.reliableLength + 1 > _NetChan2.MAX_RELIABLE_BUFFER) {
2597
2668
  throw new Error("NetChan reliable buffer overflow");
2598
2669
  }
2599
2670
  this.reliableMessage.writeByte(value);
@@ -2603,7 +2674,7 @@ var _NetChan = class _NetChan2 {
2603
2674
  * Writes a short to the reliable message buffer
2604
2675
  */
2605
2676
  writeReliableShort(value) {
2606
- if (this.reliableLength + 2 > _NetChan2.MAX_MSGLEN - _NetChan2.HEADER_OVERHEAD) {
2677
+ if (this.reliableLength + 2 > _NetChan2.MAX_RELIABLE_BUFFER) {
2607
2678
  throw new Error("NetChan reliable buffer overflow");
2608
2679
  }
2609
2680
  this.reliableMessage.writeShort(value);
@@ -2613,7 +2684,7 @@ var _NetChan = class _NetChan2 {
2613
2684
  * Writes a long to the reliable message buffer
2614
2685
  */
2615
2686
  writeReliableLong(value) {
2616
- if (this.reliableLength + 4 > _NetChan2.MAX_MSGLEN - _NetChan2.HEADER_OVERHEAD) {
2687
+ if (this.reliableLength + 4 > _NetChan2.MAX_RELIABLE_BUFFER) {
2617
2688
  throw new Error("NetChan reliable buffer overflow");
2618
2689
  }
2619
2690
  this.reliableMessage.writeLong(value);
@@ -2624,7 +2695,7 @@ var _NetChan = class _NetChan2 {
2624
2695
  */
2625
2696
  writeReliableString(value) {
2626
2697
  const len2 = value.length + 1;
2627
- if (this.reliableLength + len2 > _NetChan2.MAX_MSGLEN - _NetChan2.HEADER_OVERHEAD) {
2698
+ if (this.reliableLength + len2 > _NetChan2.MAX_RELIABLE_BUFFER) {
2628
2699
  throw new Error("NetChan reliable buffer overflow");
2629
2700
  }
2630
2701
  this.reliableMessage.writeString(value);
@@ -2657,6 +2728,7 @@ _NetChan.MAX_MSGLEN = 1400;
2657
2728
  _NetChan.FRAGMENT_SIZE = 1024;
2658
2729
  _NetChan.PACKET_HEADER = 10;
2659
2730
  _NetChan.HEADER_OVERHEAD = _NetChan.PACKET_HEADER + 2;
2731
+ _NetChan.MAX_RELIABLE_BUFFER = 262144;
2660
2732
  var AmmoType = /* @__PURE__ */ ((AmmoType22) => {
2661
2733
  AmmoType22[AmmoType22["Bullets"] = 0] = "Bullets";
2662
2734
  AmmoType22[AmmoType22["Shells"] = 1] = "Shells";
@@ -9066,6 +9138,28 @@ function writeUserCommand(writer, cmd) {
9066
9138
  writer.writeByte(0);
9067
9139
  writer.writeByte(0);
9068
9140
  }
9141
+ var RenderFx = /* @__PURE__ */ ((RenderFx2) => {
9142
+ RenderFx2[RenderFx2["MinLight"] = 1] = "MinLight";
9143
+ RenderFx2[RenderFx2["ViewerModel"] = 2] = "ViewerModel";
9144
+ RenderFx2[RenderFx2["WeaponModel"] = 4] = "WeaponModel";
9145
+ RenderFx2[RenderFx2["FullBright"] = 8] = "FullBright";
9146
+ RenderFx2[RenderFx2["DepthHack"] = 16] = "DepthHack";
9147
+ RenderFx2[RenderFx2["Translucent"] = 32] = "Translucent";
9148
+ RenderFx2[RenderFx2["FrameLerp"] = 64] = "FrameLerp";
9149
+ RenderFx2[RenderFx2["Beam"] = 128] = "Beam";
9150
+ RenderFx2[RenderFx2["CustomLight"] = 256] = "CustomLight";
9151
+ RenderFx2[RenderFx2["Glow"] = 512] = "Glow";
9152
+ RenderFx2[RenderFx2["ShellRed"] = 1024] = "ShellRed";
9153
+ RenderFx2[RenderFx2["ShellGreen"] = 2048] = "ShellGreen";
9154
+ RenderFx2[RenderFx2["ShellBlue"] = 4096] = "ShellBlue";
9155
+ RenderFx2[RenderFx2["IrVisible"] = 32768] = "IrVisible";
9156
+ RenderFx2[RenderFx2["ShellDouble"] = 65536] = "ShellDouble";
9157
+ RenderFx2[RenderFx2["ShellHalfDam"] = 131072] = "ShellHalfDam";
9158
+ RenderFx2[RenderFx2["MinLightPlus"] = 262144] = "MinLightPlus";
9159
+ RenderFx2[RenderFx2["ExtraLight"] = 524288] = "ExtraLight";
9160
+ RenderFx2[RenderFx2["BeamLightning"] = 1048576] = "BeamLightning";
9161
+ return RenderFx2;
9162
+ })(RenderFx || {});
9069
9163
  var entityFlags_exports2 = {};
9070
9164
  __export3(entityFlags_exports2, {
9071
9165
  U_ANGLE1: () => U_ANGLE13,
@@ -9426,10 +9520,14 @@ var _NetChan3 = class _NetChan4 {
9426
9520
  this.incomingReliableSequence = 0;
9427
9521
  this.outgoingReliableSequence = 0;
9428
9522
  this.reliableLength = 0;
9523
+ this.fragmentSendOffset = 0;
9524
+ this.fragmentBuffer = null;
9525
+ this.fragmentLength = 0;
9526
+ this.fragmentReceived = 0;
9429
9527
  this.lastReceived = 0;
9430
9528
  this.lastSent = 0;
9431
9529
  this.remoteAddress = null;
9432
- this.reliableMessage = new BinaryWriter2(_NetChan4.MAX_MSGLEN);
9530
+ this.reliableMessage = new BinaryWriter2(_NetChan4.MAX_RELIABLE_BUFFER);
9433
9531
  const now = Date.now();
9434
9532
  this.lastReceived = now;
9435
9533
  this.lastSent = now;
@@ -9455,6 +9553,10 @@ var _NetChan3 = class _NetChan4 {
9455
9553
  this.outgoingReliableSequence = 0;
9456
9554
  this.reliableLength = 0;
9457
9555
  this.reliableMessage.reset();
9556
+ this.fragmentSendOffset = 0;
9557
+ this.fragmentBuffer = null;
9558
+ this.fragmentLength = 0;
9559
+ this.fragmentReceived = 0;
9458
9560
  this.lastReceived = Date.now();
9459
9561
  this.lastSent = Date.now();
9460
9562
  }
@@ -9464,18 +9566,38 @@ var _NetChan3 = class _NetChan4 {
9464
9566
  transmit(unreliableData) {
9465
9567
  this.outgoingSequence++;
9466
9568
  this.lastSent = Date.now();
9569
+ let sendReliableLength = 0;
9570
+ let isFragment = false;
9571
+ let fragmentStart = 0;
9572
+ if (this.reliableLength > 0) {
9573
+ if (this.reliableLength > _NetChan4.FRAGMENT_SIZE) {
9574
+ isFragment = true;
9575
+ if (this.fragmentSendOffset >= this.reliableLength) {
9576
+ this.fragmentSendOffset = 0;
9577
+ }
9578
+ const remaining = this.reliableLength - this.fragmentSendOffset;
9579
+ sendReliableLength = remaining;
9580
+ if (sendReliableLength > _NetChan4.FRAGMENT_SIZE) {
9581
+ sendReliableLength = _NetChan4.FRAGMENT_SIZE;
9582
+ }
9583
+ fragmentStart = this.fragmentSendOffset;
9584
+ this.fragmentSendOffset += sendReliableLength;
9585
+ } else {
9586
+ sendReliableLength = this.reliableLength;
9587
+ }
9588
+ }
9467
9589
  const headerSize = _NetChan4.PACKET_HEADER;
9468
- const reliableSize = this.reliableLength > 0 ? this.reliableLength + 2 : 0;
9590
+ const reliableHeaderSize = sendReliableLength > 0 ? 2 + (isFragment ? 8 : 0) : 0;
9469
9591
  let unreliableSize = unreliableData ? unreliableData.length : 0;
9470
- if (headerSize + reliableSize + unreliableSize > _NetChan4.MAX_MSGLEN) {
9471
- unreliableSize = _NetChan4.MAX_MSGLEN - headerSize - reliableSize;
9592
+ if (headerSize + reliableHeaderSize + sendReliableLength + unreliableSize > _NetChan4.MAX_MSGLEN) {
9593
+ unreliableSize = _NetChan4.MAX_MSGLEN - headerSize - reliableHeaderSize - sendReliableLength;
9472
9594
  if (unreliableSize < 0) unreliableSize = 0;
9473
9595
  }
9474
- const buffer = new ArrayBuffer(headerSize + reliableSize + unreliableSize);
9596
+ const buffer = new ArrayBuffer(headerSize + reliableHeaderSize + sendReliableLength + unreliableSize);
9475
9597
  const view = new DataView(buffer);
9476
9598
  const result = new Uint8Array(buffer);
9477
9599
  let sequence = this.outgoingSequence;
9478
- if (this.reliableLength > 0) {
9600
+ if (sendReliableLength > 0) {
9479
9601
  sequence |= 2147483648;
9480
9602
  if ((this.outgoingReliableSequence & 1) !== 0) {
9481
9603
  sequence |= 1073741824;
@@ -9489,13 +9611,23 @@ var _NetChan3 = class _NetChan4 {
9489
9611
  view.setUint32(4, ack, true);
9490
9612
  view.setUint16(8, this.qport, true);
9491
9613
  let offset = headerSize;
9492
- if (this.reliableLength > 0) {
9493
- view.setUint16(offset, this.reliableLength, true);
9614
+ if (sendReliableLength > 0) {
9615
+ let lengthField = sendReliableLength;
9616
+ if (isFragment) {
9617
+ lengthField |= 32768;
9618
+ }
9619
+ view.setUint16(offset, lengthField, true);
9494
9620
  offset += 2;
9621
+ if (isFragment) {
9622
+ view.setUint32(offset, fragmentStart, true);
9623
+ offset += 4;
9624
+ view.setUint32(offset, this.reliableLength, true);
9625
+ offset += 4;
9626
+ }
9495
9627
  const reliableBuffer = this.reliableMessage.getBuffer();
9496
- const reliableBytes = reliableBuffer.subarray(0, this.reliableLength);
9628
+ const reliableBytes = reliableBuffer.subarray(fragmentStart, fragmentStart + sendReliableLength);
9497
9629
  result.set(reliableBytes, offset);
9498
- offset += this.reliableLength;
9630
+ offset += sendReliableLength;
9499
9631
  }
9500
9632
  if (unreliableData && unreliableSize > 0) {
9501
9633
  const chunk = unreliableData.slice(0, unreliableSize);
@@ -9536,6 +9668,7 @@ var _NetChan3 = class _NetChan4 {
9536
9668
  this.reliableLength = 0;
9537
9669
  this.reliableMessage.reset();
9538
9670
  this.outgoingReliableSequence ^= 1;
9671
+ this.fragmentSendOffset = 0;
9539
9672
  }
9540
9673
  }
9541
9674
  const hasReliableData = (sequence & 2147483648) !== 0;
@@ -9544,13 +9677,45 @@ var _NetChan3 = class _NetChan4 {
9544
9677
  let reliableData = null;
9545
9678
  if (hasReliableData) {
9546
9679
  if (payloadOffset + 2 > packet.byteLength) return null;
9547
- const reliableLen = view.getUint16(payloadOffset, true);
9680
+ let reliableLen = view.getUint16(payloadOffset, true);
9548
9681
  payloadOffset += 2;
9682
+ const isFragment = (reliableLen & 32768) !== 0;
9683
+ reliableLen &= 32767;
9549
9684
  const expectedBit = this.incomingReliableSequence & 1;
9550
9685
  if (reliableSeqBit === expectedBit) {
9551
- this.incomingReliableSequence++;
9552
- if (payloadOffset + reliableLen > packet.byteLength) return null;
9553
- reliableData = packet.slice(payloadOffset, payloadOffset + reliableLen);
9686
+ if (isFragment) {
9687
+ if (payloadOffset + 8 > packet.byteLength) return null;
9688
+ const fragStart = view.getUint32(payloadOffset, true);
9689
+ payloadOffset += 4;
9690
+ const fragTotal = view.getUint32(payloadOffset, true);
9691
+ payloadOffset += 4;
9692
+ if (fragTotal > _NetChan4.MAX_RELIABLE_BUFFER) {
9693
+ console.warn(`NetChan: received invalid fragment total ${fragTotal} > ${_NetChan4.MAX_RELIABLE_BUFFER}`);
9694
+ return null;
9695
+ }
9696
+ if (!this.fragmentBuffer || this.fragmentBuffer.length !== fragTotal) {
9697
+ this.fragmentBuffer = new Uint8Array(fragTotal);
9698
+ this.fragmentLength = fragTotal;
9699
+ this.fragmentReceived = 0;
9700
+ }
9701
+ if (payloadOffset + reliableLen > packet.byteLength) return null;
9702
+ const data = packet.subarray(payloadOffset, payloadOffset + reliableLen);
9703
+ if (fragStart === this.fragmentReceived && fragStart + reliableLen <= fragTotal) {
9704
+ this.fragmentBuffer.set(data, fragStart);
9705
+ this.fragmentReceived += reliableLen;
9706
+ if (this.fragmentReceived >= fragTotal) {
9707
+ reliableData = this.fragmentBuffer;
9708
+ this.incomingReliableSequence++;
9709
+ this.fragmentBuffer = null;
9710
+ this.fragmentLength = 0;
9711
+ this.fragmentReceived = 0;
9712
+ }
9713
+ }
9714
+ } else {
9715
+ this.incomingReliableSequence++;
9716
+ if (payloadOffset + reliableLen > packet.byteLength) return null;
9717
+ reliableData = packet.slice(payloadOffset, payloadOffset + reliableLen);
9718
+ }
9554
9719
  }
9555
9720
  payloadOffset += reliableLen;
9556
9721
  }
@@ -9577,7 +9742,7 @@ var _NetChan3 = class _NetChan4 {
9577
9742
  * Writes a byte to the reliable message buffer
9578
9743
  */
9579
9744
  writeReliableByte(value) {
9580
- if (this.reliableLength + 1 > _NetChan4.MAX_MSGLEN - _NetChan4.HEADER_OVERHEAD) {
9745
+ if (this.reliableLength + 1 > _NetChan4.MAX_RELIABLE_BUFFER) {
9581
9746
  throw new Error("NetChan reliable buffer overflow");
9582
9747
  }
9583
9748
  this.reliableMessage.writeByte(value);
@@ -9587,7 +9752,7 @@ var _NetChan3 = class _NetChan4 {
9587
9752
  * Writes a short to the reliable message buffer
9588
9753
  */
9589
9754
  writeReliableShort(value) {
9590
- if (this.reliableLength + 2 > _NetChan4.MAX_MSGLEN - _NetChan4.HEADER_OVERHEAD) {
9755
+ if (this.reliableLength + 2 > _NetChan4.MAX_RELIABLE_BUFFER) {
9591
9756
  throw new Error("NetChan reliable buffer overflow");
9592
9757
  }
9593
9758
  this.reliableMessage.writeShort(value);
@@ -9597,7 +9762,7 @@ var _NetChan3 = class _NetChan4 {
9597
9762
  * Writes a long to the reliable message buffer
9598
9763
  */
9599
9764
  writeReliableLong(value) {
9600
- if (this.reliableLength + 4 > _NetChan4.MAX_MSGLEN - _NetChan4.HEADER_OVERHEAD) {
9765
+ if (this.reliableLength + 4 > _NetChan4.MAX_RELIABLE_BUFFER) {
9601
9766
  throw new Error("NetChan reliable buffer overflow");
9602
9767
  }
9603
9768
  this.reliableMessage.writeLong(value);
@@ -9608,7 +9773,7 @@ var _NetChan3 = class _NetChan4 {
9608
9773
  */
9609
9774
  writeReliableString(value) {
9610
9775
  const len2 = value.length + 1;
9611
- if (this.reliableLength + len2 > _NetChan4.MAX_MSGLEN - _NetChan4.HEADER_OVERHEAD) {
9776
+ if (this.reliableLength + len2 > _NetChan4.MAX_RELIABLE_BUFFER) {
9612
9777
  throw new Error("NetChan reliable buffer overflow");
9613
9778
  }
9614
9779
  this.reliableMessage.writeString(value);
@@ -9641,6 +9806,7 @@ _NetChan3.MAX_MSGLEN = 1400;
9641
9806
  _NetChan3.FRAGMENT_SIZE = 1024;
9642
9807
  _NetChan3.PACKET_HEADER = 10;
9643
9808
  _NetChan3.HEADER_OVERHEAD = _NetChan3.PACKET_HEADER + 2;
9809
+ _NetChan3.MAX_RELIABLE_BUFFER = 262144;
9644
9810
  var NetChan = _NetChan3;
9645
9811
  var AmmoType2 = /* @__PURE__ */ ((AmmoType22) => {
9646
9812
  AmmoType22[AmmoType22["Bullets"] = 0] = "Bullets";
@@ -10251,6 +10417,21 @@ function buildRenderableEntities(latestEntities, previousEntities, alpha, config
10251
10417
  mat4_exports.rotateX(mat, mat, angles.x * Math.PI / 180);
10252
10418
  mat4_exports.scale(mat, mat, [scale3, scale3, scale3]);
10253
10419
  const skinName = skinNum !== void 0 && skinNum > 0 ? configStrings.getImageName(skinNum) : void 0;
10420
+ let tint;
10421
+ const renderfx = ent.renderfx ?? 0;
10422
+ if ((renderfx & (RenderFx.ShellGreen | RenderFx.ShellBlue)) === (RenderFx.ShellGreen | RenderFx.ShellBlue)) {
10423
+ tint = [0, 1, 1, 1];
10424
+ } else if (renderfx & RenderFx.ShellRed) {
10425
+ tint = [1, 0, 0, 1];
10426
+ } else if (renderfx & RenderFx.ShellGreen) {
10427
+ tint = [0, 1, 0, 1];
10428
+ } else if (renderfx & RenderFx.ShellBlue) {
10429
+ tint = [0, 0, 1, 1];
10430
+ } else if (renderfx & RenderFx.ShellDouble) {
10431
+ tint = [1, 1, 0, 1];
10432
+ } else if (renderfx & RenderFx.ShellHalfDam) {
10433
+ tint = [0.5, 0.5, 0.5, 1];
10434
+ }
10254
10435
  if (model.header.magic === 844121161) {
10255
10436
  renderables.push({
10256
10437
  type: "md2",
@@ -10263,7 +10444,8 @@ function buildRenderableEntities(latestEntities, previousEntities, alpha, config
10263
10444
  },
10264
10445
  transform: mat,
10265
10446
  skin: skinName,
10266
- alpha: normalizedAlpha
10447
+ alpha: normalizedAlpha,
10448
+ tint
10267
10449
  });
10268
10450
  } else if (model.header.magic === 860898377) {
10269
10451
  renderables.push({
@@ -10275,7 +10457,8 @@ function buildRenderableEntities(latestEntities, previousEntities, alpha, config
10275
10457
  lerp: alpha
10276
10458
  },
10277
10459
  transform: mat,
10278
- alpha: normalizedAlpha
10460
+ alpha: normalizedAlpha,
10461
+ tint
10279
10462
  // Lighting? Skins?
10280
10463
  });
10281
10464
  }