quake2ts 0.0.288 → 0.0.290

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 (52) 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 +554 -2
  5. package/packages/client/dist/cjs/index.cjs.map +1 -1
  6. package/packages/client/dist/esm/index.js +554 -2
  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 +16 -16
  10. package/packages/engine/dist/browser/index.global.js.map +1 -1
  11. package/packages/engine/dist/cjs/index.cjs +360 -35
  12. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  13. package/packages/engine/dist/esm/index.js +360 -35
  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/audio/constants.d.ts +1 -23
  17. package/packages/engine/dist/types/audio/constants.d.ts.map +1 -1
  18. package/packages/game/dist/browser/index.global.js +3 -3
  19. package/packages/game/dist/browser/index.global.js.map +1 -1
  20. package/packages/game/dist/cjs/index.cjs +556 -19
  21. package/packages/game/dist/cjs/index.cjs.map +1 -1
  22. package/packages/game/dist/esm/index.js +556 -19
  23. package/packages/game/dist/esm/index.js.map +1 -1
  24. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  25. package/packages/game/dist/types/entities/monsters/actor.d.ts.map +1 -1
  26. package/packages/game/dist/types/entities/monsters/arachnid.d.ts.map +1 -1
  27. package/packages/game/dist/types/entities/system.d.ts +1 -0
  28. package/packages/game/dist/types/entities/system.d.ts.map +1 -1
  29. package/packages/game/dist/types/index.d.ts +2 -0
  30. package/packages/game/dist/types/index.d.ts.map +1 -1
  31. package/packages/server/dist/index.cjs +54 -11
  32. package/packages/server/dist/index.d.cts +6 -1
  33. package/packages/server/dist/index.d.ts +6 -1
  34. package/packages/server/dist/index.js +56 -13
  35. package/packages/shared/dist/browser/index.global.js +1 -1
  36. package/packages/shared/dist/browser/index.global.js.map +1 -1
  37. package/packages/shared/dist/cjs/index.cjs +562 -0
  38. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  39. package/packages/shared/dist/esm/index.js +549 -0
  40. package/packages/shared/dist/esm/index.js.map +1 -1
  41. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  42. package/packages/shared/dist/types/audio/constants.d.ts +24 -0
  43. package/packages/shared/dist/types/audio/constants.d.ts.map +1 -0
  44. package/packages/shared/dist/types/index.d.ts +1 -0
  45. package/packages/shared/dist/types/index.d.ts.map +1 -1
  46. package/packages/shared/dist/types/net/index.d.ts +1 -0
  47. package/packages/shared/dist/types/net/index.d.ts.map +1 -1
  48. package/packages/shared/dist/types/protocol/crc.d.ts +5 -0
  49. package/packages/shared/dist/types/protocol/crc.d.ts.map +1 -0
  50. package/packages/shared/dist/types/protocol/index.d.ts +1 -0
  51. package/packages/shared/dist/types/protocol/index.d.ts.map +1 -1
  52. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
@@ -23,6 +23,11 @@ __export(index_exports, {
23
23
  AMMO_MAX: () => AMMO_MAX,
24
24
  AMMO_TYPE_COUNT: () => AMMO_TYPE_COUNT,
25
25
  ANORMS: () => ANORMS,
26
+ ATTN_IDLE: () => ATTN_IDLE,
27
+ ATTN_LOOP_NONE: () => ATTN_LOOP_NONE,
28
+ ATTN_NONE: () => ATTN_NONE,
29
+ ATTN_NORM: () => ATTN_NORM,
30
+ ATTN_STATIC: () => ATTN_STATIC,
26
31
  AmmoItemId: () => AmmoItemId,
27
32
  AmmoType: () => AmmoType,
28
33
  BinaryStream: () => BinaryStream,
@@ -111,6 +116,7 @@ __export(index_exports, {
111
116
  MAX_QPATH: () => MAX_QPATH,
112
117
  MAX_SHADOW_LIGHTS: () => MAX_SHADOW_LIGHTS,
113
118
  MAX_SOUNDS: () => MAX_SOUNDS,
119
+ MAX_SOUND_CHANNELS: () => MAX_SOUND_CHANNELS,
114
120
  MAX_STRING_CHARS: () => MAX_STRING_CHARS,
115
121
  MAX_STRING_TOKENS: () => MAX_STRING_TOKENS,
116
122
  MAX_TOKEN_CHARS: () => MAX_TOKEN_CHARS,
@@ -134,6 +140,7 @@ __export(index_exports, {
134
140
  NUM_BITS_FOR_AMMO: () => NUM_BITS_FOR_AMMO,
135
141
  NUM_BITS_FOR_POWERUP: () => NUM_BITS_FOR_POWERUP,
136
142
  NUM_POWERUP_STATS: () => NUM_POWERUP_STATS,
143
+ NetChan: () => NetChan,
137
144
  NetworkMessageBuilder: () => NetworkMessageBuilder,
138
145
  PITCH: () => PITCH,
139
146
  POWERUP_MAX: () => POWERUP_MAX,
@@ -150,6 +157,8 @@ __export(index_exports, {
150
157
  Replay: () => replay_exports,
151
158
  SLIDEMOVE_BLOCKED_FLOOR: () => SLIDEMOVE_BLOCKED_FLOOR,
152
159
  SLIDEMOVE_BLOCKED_WALL: () => SLIDEMOVE_BLOCKED_WALL,
160
+ SOUND_FULLVOLUME: () => SOUND_FULLVOLUME,
161
+ SOUND_LOOP_ATTENUATE: () => SOUND_LOOP_ATTENUATE,
153
162
  STOP_EPSILON: () => STOP_EPSILON,
154
163
  SURF_ALPHATEST: () => SURF_ALPHATEST,
155
164
  SURF_FLOWING: () => SURF_FLOWING,
@@ -166,6 +175,7 @@ __export(index_exports, {
166
175
  SURF_TRANS66: () => SURF_TRANS66,
167
176
  SURF_WARP: () => SURF_WARP,
168
177
  ServerCommand: () => ServerCommand,
178
+ SoundChannel: () => SoundChannel,
169
179
  TempEntity: () => TempEntity,
170
180
  UPDATE_BACKUP: () => UPDATE_BACKUP,
171
181
  WEAPON_AMMO_MAP: () => WEAPON_AMMO_MAP,
@@ -191,12 +201,14 @@ __export(index_exports, {
191
201
  applyPmoveFriction: () => applyPmoveFriction,
192
202
  applyPmoveWaterMove: () => applyPmoveWaterMove,
193
203
  assertContract: () => assertContract,
204
+ attenuationToDistanceMultiplier: () => attenuationToDistanceMultiplier,
194
205
  boxContents: () => boxContents,
195
206
  boxOnPlaneSide: () => boxOnPlaneSide,
196
207
  boxesIntersect: () => boxesIntersect,
197
208
  buildAirGroundWish: () => buildAirGroundWish,
198
209
  buildCollisionModel: () => buildCollisionModel,
199
210
  buildWaterWish: () => buildWaterWish,
211
+ calculateMaxAudibleDistance: () => calculateMaxAudibleDistance,
200
212
  categorizePosition: () => categorizePosition,
201
213
  checkDuckState: () => checkDuckState,
202
214
  checkJump: () => checkJump,
@@ -212,6 +224,7 @@ __export(index_exports, {
212
224
  concatRotationMatrices: () => concatRotationMatrices,
213
225
  configStringSize: () => configStringSize,
214
226
  copyVec3: () => copyVec3,
227
+ crc8: () => crc8,
215
228
  createDefaultTrace: () => createDefaultTrace,
216
229
  createEmptyBounds3: () => createEmptyBounds3,
217
230
  createMat4Identity: () => createMat4Identity,
@@ -4094,6 +4107,273 @@ var RenderFx = /* @__PURE__ */ ((RenderFx2) => {
4094
4107
  return RenderFx2;
4095
4108
  })(RenderFx || {});
4096
4109
 
4110
+ // src/protocol/crc.ts
4111
+ var crc_table = [
4112
+ 0,
4113
+ 145,
4114
+ 227,
4115
+ 114,
4116
+ 7,
4117
+ 150,
4118
+ 228,
4119
+ 117,
4120
+ 14,
4121
+ 159,
4122
+ 237,
4123
+ 124,
4124
+ 9,
4125
+ 152,
4126
+ 234,
4127
+ 123,
4128
+ 28,
4129
+ 141,
4130
+ 255,
4131
+ 110,
4132
+ 27,
4133
+ 138,
4134
+ 248,
4135
+ 105,
4136
+ 18,
4137
+ 131,
4138
+ 241,
4139
+ 96,
4140
+ 21,
4141
+ 132,
4142
+ 246,
4143
+ 103,
4144
+ 56,
4145
+ 169,
4146
+ 219,
4147
+ 74,
4148
+ 63,
4149
+ 174,
4150
+ 220,
4151
+ 77,
4152
+ 54,
4153
+ 167,
4154
+ 213,
4155
+ 68,
4156
+ 49,
4157
+ 160,
4158
+ 210,
4159
+ 67,
4160
+ 36,
4161
+ 181,
4162
+ 199,
4163
+ 86,
4164
+ 35,
4165
+ 178,
4166
+ 192,
4167
+ 81,
4168
+ 42,
4169
+ 187,
4170
+ 201,
4171
+ 88,
4172
+ 45,
4173
+ 188,
4174
+ 206,
4175
+ 95,
4176
+ 112,
4177
+ 225,
4178
+ 147,
4179
+ 2,
4180
+ 119,
4181
+ 230,
4182
+ 148,
4183
+ 5,
4184
+ 126,
4185
+ 239,
4186
+ 157,
4187
+ 12,
4188
+ 121,
4189
+ 232,
4190
+ 154,
4191
+ 11,
4192
+ 108,
4193
+ 253,
4194
+ 143,
4195
+ 30,
4196
+ 107,
4197
+ 250,
4198
+ 136,
4199
+ 25,
4200
+ 98,
4201
+ 243,
4202
+ 129,
4203
+ 16,
4204
+ 101,
4205
+ 244,
4206
+ 134,
4207
+ 23,
4208
+ 72,
4209
+ 217,
4210
+ 171,
4211
+ 58,
4212
+ 79,
4213
+ 222,
4214
+ 172,
4215
+ 61,
4216
+ 70,
4217
+ 215,
4218
+ 165,
4219
+ 52,
4220
+ 65,
4221
+ 208,
4222
+ 162,
4223
+ 51,
4224
+ 84,
4225
+ 197,
4226
+ 183,
4227
+ 38,
4228
+ 83,
4229
+ 194,
4230
+ 176,
4231
+ 33,
4232
+ 90,
4233
+ 203,
4234
+ 185,
4235
+ 40,
4236
+ 93,
4237
+ 204,
4238
+ 190,
4239
+ 47,
4240
+ 224,
4241
+ 113,
4242
+ 3,
4243
+ 146,
4244
+ 231,
4245
+ 118,
4246
+ 4,
4247
+ 149,
4248
+ 238,
4249
+ 127,
4250
+ 13,
4251
+ 156,
4252
+ 233,
4253
+ 120,
4254
+ 10,
4255
+ 155,
4256
+ 252,
4257
+ 109,
4258
+ 31,
4259
+ 142,
4260
+ 251,
4261
+ 106,
4262
+ 24,
4263
+ 137,
4264
+ 242,
4265
+ 99,
4266
+ 17,
4267
+ 128,
4268
+ 245,
4269
+ 100,
4270
+ 22,
4271
+ 135,
4272
+ 216,
4273
+ 73,
4274
+ 59,
4275
+ 170,
4276
+ 223,
4277
+ 78,
4278
+ 60,
4279
+ 173,
4280
+ 214,
4281
+ 71,
4282
+ 53,
4283
+ 164,
4284
+ 209,
4285
+ 64,
4286
+ 50,
4287
+ 163,
4288
+ 196,
4289
+ 85,
4290
+ 39,
4291
+ 182,
4292
+ 195,
4293
+ 82,
4294
+ 32,
4295
+ 177,
4296
+ 202,
4297
+ 91,
4298
+ 41,
4299
+ 184,
4300
+ 205,
4301
+ 92,
4302
+ 46,
4303
+ 191,
4304
+ 144,
4305
+ 1,
4306
+ 115,
4307
+ 226,
4308
+ 151,
4309
+ 6,
4310
+ 116,
4311
+ 229,
4312
+ 158,
4313
+ 15,
4314
+ 125,
4315
+ 236,
4316
+ 153,
4317
+ 8,
4318
+ 122,
4319
+ 235,
4320
+ 140,
4321
+ 29,
4322
+ 111,
4323
+ 254,
4324
+ 139,
4325
+ 26,
4326
+ 104,
4327
+ 249,
4328
+ 130,
4329
+ 19,
4330
+ 97,
4331
+ 240,
4332
+ 133,
4333
+ 20,
4334
+ 102,
4335
+ 247,
4336
+ 168,
4337
+ 57,
4338
+ 75,
4339
+ 218,
4340
+ 175,
4341
+ 62,
4342
+ 76,
4343
+ 221,
4344
+ 166,
4345
+ 55,
4346
+ 69,
4347
+ 212,
4348
+ 161,
4349
+ 48,
4350
+ 66,
4351
+ 211,
4352
+ 180,
4353
+ 37,
4354
+ 86,
4355
+ 199,
4356
+ 179,
4357
+ 34,
4358
+ 80,
4359
+ 193,
4360
+ 186,
4361
+ 43,
4362
+ 89,
4363
+ 200,
4364
+ 189,
4365
+ 44,
4366
+ 94,
4367
+ 207
4368
+ ];
4369
+ function crc8(data) {
4370
+ let crc = 0;
4371
+ for (let i = 0; i < data.length; i++) {
4372
+ crc = crc_table[(crc ^ data[i]) & 255];
4373
+ }
4374
+ return crc;
4375
+ }
4376
+
4097
4377
  // src/protocol/entityFlags.ts
4098
4378
  var entityFlags_exports = {};
4099
4379
  __export(entityFlags_exports, {
@@ -4547,6 +4827,244 @@ var NetworkMessageBuilder = class {
4547
4827
  }
4548
4828
  };
4549
4829
 
4830
+ // src/net/netchan.ts
4831
+ var _NetChan = class _NetChan {
4832
+ constructor() {
4833
+ // +2 for reliable length prefix
4834
+ // Public state
4835
+ this.qport = 0;
4836
+ // qport value to distinguish multiple clients from same IP
4837
+ // Sequencing
4838
+ this.incomingSequence = 0;
4839
+ this.outgoingSequence = 0;
4840
+ this.incomingAcknowledged = 0;
4841
+ // Reliable messaging
4842
+ this.incomingReliableAcknowledged = false;
4843
+ // single bit
4844
+ this.incomingReliableSequence = 0;
4845
+ // last reliable message sequence received
4846
+ this.outgoingReliableSequence = 0;
4847
+ this.reliableLength = 0;
4848
+ // Timing
4849
+ this.lastReceived = 0;
4850
+ this.lastSent = 0;
4851
+ this.remoteAddress = null;
4852
+ this.reliableMessage = new BinaryWriter(_NetChan.MAX_MSGLEN);
4853
+ const now = Date.now();
4854
+ this.lastReceived = now;
4855
+ this.lastSent = now;
4856
+ this.qport = Math.floor(Math.random() * 65536);
4857
+ }
4858
+ /**
4859
+ * Setup the netchan with specific settings
4860
+ */
4861
+ setup(qport, address = null) {
4862
+ this.qport = qport;
4863
+ this.remoteAddress = address;
4864
+ this.reset();
4865
+ }
4866
+ /**
4867
+ * Reset the netchan state
4868
+ */
4869
+ reset() {
4870
+ this.incomingSequence = 0;
4871
+ this.outgoingSequence = 0;
4872
+ this.incomingAcknowledged = 0;
4873
+ this.incomingReliableAcknowledged = false;
4874
+ this.incomingReliableSequence = 0;
4875
+ this.outgoingReliableSequence = 0;
4876
+ this.reliableLength = 0;
4877
+ this.reliableMessage.reset();
4878
+ this.lastReceived = Date.now();
4879
+ this.lastSent = Date.now();
4880
+ }
4881
+ /**
4882
+ * Transmits a packet containing reliable and unreliable data
4883
+ */
4884
+ transmit(unreliableData) {
4885
+ this.outgoingSequence++;
4886
+ this.lastSent = Date.now();
4887
+ const headerSize = _NetChan.PACKET_HEADER;
4888
+ const reliableSize = this.reliableLength > 0 ? this.reliableLength + 2 : 0;
4889
+ let unreliableSize = unreliableData ? unreliableData.length : 0;
4890
+ if (headerSize + reliableSize + unreliableSize > _NetChan.MAX_MSGLEN) {
4891
+ unreliableSize = _NetChan.MAX_MSGLEN - headerSize - reliableSize;
4892
+ if (unreliableSize < 0) unreliableSize = 0;
4893
+ }
4894
+ const buffer = new ArrayBuffer(headerSize + reliableSize + unreliableSize);
4895
+ const view = new DataView(buffer);
4896
+ const result = new Uint8Array(buffer);
4897
+ let sequence = this.outgoingSequence;
4898
+ if (this.reliableLength > 0) {
4899
+ sequence |= 2147483648;
4900
+ if ((this.outgoingReliableSequence & 1) !== 0) {
4901
+ sequence |= 1073741824;
4902
+ }
4903
+ }
4904
+ view.setUint32(0, sequence, true);
4905
+ let ack = this.incomingSequence;
4906
+ if ((this.incomingReliableSequence & 1) !== 0) {
4907
+ ack |= 2147483648;
4908
+ }
4909
+ view.setUint32(4, ack, true);
4910
+ view.setUint16(8, this.qport, true);
4911
+ let offset = headerSize;
4912
+ if (this.reliableLength > 0) {
4913
+ view.setUint16(offset, this.reliableLength, true);
4914
+ offset += 2;
4915
+ const reliableBuffer = this.reliableMessage.getBuffer();
4916
+ const reliableBytes = reliableBuffer.subarray(0, this.reliableLength);
4917
+ result.set(reliableBytes, offset);
4918
+ offset += this.reliableLength;
4919
+ }
4920
+ if (unreliableData && unreliableSize > 0) {
4921
+ const chunk = unreliableData.slice(0, unreliableSize);
4922
+ result.set(chunk, offset);
4923
+ }
4924
+ return result;
4925
+ }
4926
+ /**
4927
+ * Processes a received packet
4928
+ * Returns the payload data (reliable + unreliable) to be processed, or null if discarded
4929
+ */
4930
+ process(packet) {
4931
+ if (packet.length < _NetChan.PACKET_HEADER) {
4932
+ return null;
4933
+ }
4934
+ this.lastReceived = Date.now();
4935
+ const view = new DataView(packet.buffer, packet.byteOffset, packet.byteLength);
4936
+ const sequence = view.getUint32(0, true);
4937
+ const ack = view.getUint32(4, true);
4938
+ const qport = view.getUint16(8, true);
4939
+ if (this.qport !== qport) {
4940
+ return null;
4941
+ }
4942
+ const seqNumberClean = sequence & ~(2147483648 | 1073741824);
4943
+ if ((seqNumberClean - this.incomingSequence | 0) <= 0) {
4944
+ return null;
4945
+ }
4946
+ this.incomingSequence = seqNumberClean;
4947
+ const ackNumber = ack & ~2147483648;
4948
+ const ackReliable = (ack & 2147483648) !== 0;
4949
+ if (ackNumber > this.incomingAcknowledged) {
4950
+ this.incomingAcknowledged = ackNumber;
4951
+ }
4952
+ if (this.reliableLength > 0) {
4953
+ const receivedAckBit = ackReliable ? 1 : 0;
4954
+ const currentReliableBit = this.outgoingReliableSequence & 1;
4955
+ if (receivedAckBit !== currentReliableBit) {
4956
+ this.reliableLength = 0;
4957
+ this.reliableMessage.reset();
4958
+ this.outgoingReliableSequence ^= 1;
4959
+ }
4960
+ }
4961
+ const hasReliableData = (sequence & 2147483648) !== 0;
4962
+ const reliableSeqBit = (sequence & 1073741824) !== 0 ? 1 : 0;
4963
+ let payloadOffset = _NetChan.PACKET_HEADER;
4964
+ let reliableData = null;
4965
+ if (hasReliableData) {
4966
+ if (payloadOffset + 2 > packet.byteLength) return null;
4967
+ const reliableLen = view.getUint16(payloadOffset, true);
4968
+ payloadOffset += 2;
4969
+ const expectedBit = this.incomingReliableSequence & 1;
4970
+ if (reliableSeqBit === expectedBit) {
4971
+ this.incomingReliableSequence++;
4972
+ if (payloadOffset + reliableLen > packet.byteLength) return null;
4973
+ reliableData = packet.slice(payloadOffset, payloadOffset + reliableLen);
4974
+ }
4975
+ payloadOffset += reliableLen;
4976
+ }
4977
+ const unreliableData = packet.slice(payloadOffset);
4978
+ if (reliableData && reliableData.length > 0) {
4979
+ const totalLen = reliableData.length + unreliableData.length;
4980
+ const result = new Uint8Array(totalLen);
4981
+ result.set(reliableData, 0);
4982
+ result.set(unreliableData, reliableData.length);
4983
+ return result;
4984
+ }
4985
+ if (unreliableData) {
4986
+ return unreliableData;
4987
+ }
4988
+ return new Uint8Array(0);
4989
+ }
4990
+ /**
4991
+ * Checks if reliable message buffer is empty and ready for new data
4992
+ */
4993
+ canSendReliable() {
4994
+ return this.reliableLength === 0;
4995
+ }
4996
+ /**
4997
+ * Writes a byte to the reliable message buffer
4998
+ */
4999
+ writeReliableByte(value) {
5000
+ if (this.reliableLength + 1 > _NetChan.MAX_MSGLEN - _NetChan.HEADER_OVERHEAD) {
5001
+ throw new Error("NetChan reliable buffer overflow");
5002
+ }
5003
+ this.reliableMessage.writeByte(value);
5004
+ this.reliableLength++;
5005
+ }
5006
+ /**
5007
+ * Writes a short to the reliable message buffer
5008
+ */
5009
+ writeReliableShort(value) {
5010
+ if (this.reliableLength + 2 > _NetChan.MAX_MSGLEN - _NetChan.HEADER_OVERHEAD) {
5011
+ throw new Error("NetChan reliable buffer overflow");
5012
+ }
5013
+ this.reliableMessage.writeShort(value);
5014
+ this.reliableLength += 2;
5015
+ }
5016
+ /**
5017
+ * Writes a long to the reliable message buffer
5018
+ */
5019
+ writeReliableLong(value) {
5020
+ if (this.reliableLength + 4 > _NetChan.MAX_MSGLEN - _NetChan.HEADER_OVERHEAD) {
5021
+ throw new Error("NetChan reliable buffer overflow");
5022
+ }
5023
+ this.reliableMessage.writeLong(value);
5024
+ this.reliableLength += 4;
5025
+ }
5026
+ /**
5027
+ * Writes a string to the reliable message buffer
5028
+ */
5029
+ writeReliableString(value) {
5030
+ const len = value.length + 1;
5031
+ if (this.reliableLength + len > _NetChan.MAX_MSGLEN - _NetChan.HEADER_OVERHEAD) {
5032
+ throw new Error("NetChan reliable buffer overflow");
5033
+ }
5034
+ this.reliableMessage.writeString(value);
5035
+ this.reliableLength += len;
5036
+ }
5037
+ /**
5038
+ * Returns the current reliable data buffer
5039
+ */
5040
+ getReliableData() {
5041
+ if (this.reliableLength === 0) {
5042
+ return new Uint8Array(0);
5043
+ }
5044
+ const buffer = this.reliableMessage.getBuffer();
5045
+ return buffer.subarray(0, this.reliableLength);
5046
+ }
5047
+ /**
5048
+ * Checks if we need to send a keepalive packet
5049
+ */
5050
+ needsKeepalive(currentTime) {
5051
+ return currentTime - this.lastSent > 1e3;
5052
+ }
5053
+ /**
5054
+ * Checks if the connection has timed out
5055
+ */
5056
+ isTimedOut(currentTime, timeoutMs = 3e4) {
5057
+ return currentTime - this.lastReceived > timeoutMs;
5058
+ }
5059
+ };
5060
+ // Constants from net_chan.c
5061
+ _NetChan.MAX_MSGLEN = 1400;
5062
+ _NetChan.FRAGMENT_SIZE = 1024;
5063
+ _NetChan.PACKET_HEADER = 10;
5064
+ // sequence(4) + ack(4) + qport(2)
5065
+ _NetChan.HEADER_OVERHEAD = _NetChan.PACKET_HEADER + 2;
5066
+ var NetChan = _NetChan;
5067
+
4550
5068
  // src/items/weapons.ts
4551
5069
  var WeaponId = /* @__PURE__ */ ((WeaponId2) => {
4552
5070
  WeaponId2["Blaster"] = "blaster";
@@ -4644,11 +5162,47 @@ var WEAPON_AMMO_MAP = {
4644
5162
  ["disruptor" /* Disruptor */]: 10 /* Disruptor */,
4645
5163
  ["trap" /* Trap */]: 7 /* Trap */
4646
5164
  };
5165
+
5166
+ // src/audio/constants.ts
5167
+ var MAX_SOUND_CHANNELS = 32;
5168
+ var SoundChannel = /* @__PURE__ */ ((SoundChannel2) => {
5169
+ SoundChannel2[SoundChannel2["Auto"] = 0] = "Auto";
5170
+ SoundChannel2[SoundChannel2["Weapon"] = 1] = "Weapon";
5171
+ SoundChannel2[SoundChannel2["Voice"] = 2] = "Voice";
5172
+ SoundChannel2[SoundChannel2["Item"] = 3] = "Item";
5173
+ SoundChannel2[SoundChannel2["Body"] = 4] = "Body";
5174
+ SoundChannel2[SoundChannel2["Aux"] = 5] = "Aux";
5175
+ SoundChannel2[SoundChannel2["Footstep"] = 6] = "Footstep";
5176
+ SoundChannel2[SoundChannel2["Aux3"] = 7] = "Aux3";
5177
+ SoundChannel2[SoundChannel2["NoPhsAdd"] = 8] = "NoPhsAdd";
5178
+ SoundChannel2[SoundChannel2["Reliable"] = 16] = "Reliable";
5179
+ SoundChannel2[SoundChannel2["ForcePos"] = 32] = "ForcePos";
5180
+ return SoundChannel2;
5181
+ })(SoundChannel || {});
5182
+ var ATTN_LOOP_NONE = -1;
5183
+ var ATTN_NONE = 0;
5184
+ var ATTN_NORM = 1;
5185
+ var ATTN_IDLE = 2;
5186
+ var ATTN_STATIC = 3;
5187
+ var SOUND_FULLVOLUME = 80;
5188
+ var SOUND_LOOP_ATTENUATE = 3e-3;
5189
+ function attenuationToDistanceMultiplier(attenuation) {
5190
+ return attenuation === ATTN_STATIC ? attenuation * 1e-3 : attenuation * 5e-4;
5191
+ }
5192
+ function calculateMaxAudibleDistance(attenuation) {
5193
+ const distMult = attenuationToDistanceMultiplier(attenuation);
5194
+ return distMult <= 0 ? Number.POSITIVE_INFINITY : SOUND_FULLVOLUME + 1 / distMult;
5195
+ }
4647
5196
  // Annotate the CommonJS export names for ESM import in node:
4648
5197
  0 && (module.exports = {
4649
5198
  AMMO_MAX,
4650
5199
  AMMO_TYPE_COUNT,
4651
5200
  ANORMS,
5201
+ ATTN_IDLE,
5202
+ ATTN_LOOP_NONE,
5203
+ ATTN_NONE,
5204
+ ATTN_NORM,
5205
+ ATTN_STATIC,
4652
5206
  AmmoItemId,
4653
5207
  AmmoType,
4654
5208
  BinaryStream,
@@ -4737,6 +5291,7 @@ var WEAPON_AMMO_MAP = {
4737
5291
  MAX_QPATH,
4738
5292
  MAX_SHADOW_LIGHTS,
4739
5293
  MAX_SOUNDS,
5294
+ MAX_SOUND_CHANNELS,
4740
5295
  MAX_STRING_CHARS,
4741
5296
  MAX_STRING_TOKENS,
4742
5297
  MAX_TOKEN_CHARS,
@@ -4760,6 +5315,7 @@ var WEAPON_AMMO_MAP = {
4760
5315
  NUM_BITS_FOR_AMMO,
4761
5316
  NUM_BITS_FOR_POWERUP,
4762
5317
  NUM_POWERUP_STATS,
5318
+ NetChan,
4763
5319
  NetworkMessageBuilder,
4764
5320
  PITCH,
4765
5321
  POWERUP_MAX,
@@ -4776,6 +5332,8 @@ var WEAPON_AMMO_MAP = {
4776
5332
  Replay,
4777
5333
  SLIDEMOVE_BLOCKED_FLOOR,
4778
5334
  SLIDEMOVE_BLOCKED_WALL,
5335
+ SOUND_FULLVOLUME,
5336
+ SOUND_LOOP_ATTENUATE,
4779
5337
  STOP_EPSILON,
4780
5338
  SURF_ALPHATEST,
4781
5339
  SURF_FLOWING,
@@ -4792,6 +5350,7 @@ var WEAPON_AMMO_MAP = {
4792
5350
  SURF_TRANS66,
4793
5351
  SURF_WARP,
4794
5352
  ServerCommand,
5353
+ SoundChannel,
4795
5354
  TempEntity,
4796
5355
  UPDATE_BACKUP,
4797
5356
  WEAPON_AMMO_MAP,
@@ -4817,12 +5376,14 @@ var WEAPON_AMMO_MAP = {
4817
5376
  applyPmoveFriction,
4818
5377
  applyPmoveWaterMove,
4819
5378
  assertContract,
5379
+ attenuationToDistanceMultiplier,
4820
5380
  boxContents,
4821
5381
  boxOnPlaneSide,
4822
5382
  boxesIntersect,
4823
5383
  buildAirGroundWish,
4824
5384
  buildCollisionModel,
4825
5385
  buildWaterWish,
5386
+ calculateMaxAudibleDistance,
4826
5387
  categorizePosition,
4827
5388
  checkDuckState,
4828
5389
  checkJump,
@@ -4838,6 +5399,7 @@ var WEAPON_AMMO_MAP = {
4838
5399
  concatRotationMatrices,
4839
5400
  configStringSize,
4840
5401
  copyVec3,
5402
+ crc8,
4841
5403
  createDefaultTrace,
4842
5404
  createEmptyBounds3,
4843
5405
  createMat4Identity,