quake2ts 0.0.445 → 0.0.448

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 (41) hide show
  1. package/package.json +1 -1
  2. package/packages/client/dist/browser/index.global.js +16 -16
  3. package/packages/client/dist/browser/index.global.js.map +1 -1
  4. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  5. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  6. package/packages/engine/dist/types/editor/bsp-inspector.d.ts +11 -1
  7. package/packages/engine/dist/types/editor/bsp-inspector.d.ts.map +1 -1
  8. package/packages/engine/dist/types/render/renderer.d.ts +2 -0
  9. package/packages/engine/dist/types/render/renderer.d.ts.map +1 -1
  10. package/packages/game/dist/browser/index.global.js +4 -4
  11. package/packages/game/dist/browser/index.global.js.map +1 -1
  12. package/packages/game/dist/cjs/index.cjs +197 -57
  13. package/packages/game/dist/cjs/index.cjs.map +1 -1
  14. package/packages/game/dist/esm/index.js +196 -57
  15. package/packages/game/dist/esm/index.js.map +1 -1
  16. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  17. package/packages/game/dist/types/ai/targeting.d.ts +1 -0
  18. package/packages/game/dist/types/ai/targeting.d.ts.map +1 -1
  19. package/packages/game/dist/types/combat/obituary.d.ts.map +1 -1
  20. package/packages/game/dist/types/entities/entity.d.ts +1 -0
  21. package/packages/game/dist/types/entities/entity.d.ts.map +1 -1
  22. package/packages/game/dist/types/entities/funcs.d.ts.map +1 -1
  23. package/packages/game/dist/types/entities/items/ammo.d.ts.map +1 -1
  24. package/packages/game/dist/types/entities/items/armor.d.ts.map +1 -1
  25. package/packages/game/dist/types/entities/items/common.d.ts +5 -0
  26. package/packages/game/dist/types/entities/items/common.d.ts.map +1 -0
  27. package/packages/game/dist/types/entities/items/health.d.ts.map +1 -1
  28. package/packages/game/dist/types/entities/items/powerups.d.ts.map +1 -1
  29. package/packages/game/dist/types/entities/items/weapons.d.ts.map +1 -1
  30. package/packages/game/dist/types/entities/player.d.ts.map +1 -1
  31. package/packages/game/dist/types/entities/projectiles/prox.d.ts.map +1 -1
  32. package/packages/game/dist/types/entities/spawn.d.ts +2 -0
  33. package/packages/game/dist/types/entities/spawn.d.ts.map +1 -1
  34. package/packages/game/dist/types/entities/system.d.ts +2 -0
  35. package/packages/game/dist/types/entities/system.d.ts.map +1 -1
  36. package/packages/game/dist/types/entities/triggers/look.d.ts +3 -0
  37. package/packages/game/dist/types/entities/triggers/look.d.ts.map +1 -0
  38. package/packages/game/dist/types/entities/triggers/secret.d.ts +3 -0
  39. package/packages/game/dist/types/entities/triggers/secret.d.ts.map +1 -0
  40. package/packages/game/dist/types/index.d.ts +1 -0
  41. package/packages/game/dist/types/index.d.ts.map +1 -1
@@ -2779,6 +2779,7 @@ var Entity = class {
2779
2779
  this.svflags = 0;
2780
2780
  this.monsterinfo = { ...DEFAULT_MONSTER_INFO, last_sighting: copyVec32() };
2781
2781
  this.hackflags = 0;
2782
+ this.fov = 0;
2782
2783
  this.show_hostile = 0;
2783
2784
  this.light_level = 0;
2784
2785
  this.owner = null;
@@ -3032,7 +3033,8 @@ var ENTITY_FIELD_METADATA = [
3032
3033
  { name: "beam2", type: "entity", save: true },
3033
3034
  { name: "chain", type: "entity", save: true },
3034
3035
  { name: "alpha", type: "float", save: true },
3035
- { name: "hackflags", type: "int", save: true }
3036
+ { name: "hackflags", type: "int", save: true },
3037
+ { name: "fov", type: "float", save: true }
3036
3038
  ];
3037
3039
 
3038
3040
  // src/entities/system.ts
@@ -3321,6 +3323,24 @@ function classifyClientVisibility(self, other, level, trace) {
3321
3323
  }
3322
3324
  return true;
3323
3325
  }
3326
+ function AI_GetSightClient(self, context, trace) {
3327
+ if ((self.monsterinfo.aiflags & 1024 /* NoStep */) !== 0) {
3328
+ return null;
3329
+ }
3330
+ for (let i = 1; i <= context.maxClients; i++) {
3331
+ const ent = context.entities[i];
3332
+ if (!ent || !ent.inUse || ent.health <= 0) {
3333
+ continue;
3334
+ }
3335
+ if ((ent.flags & FL_NOTARGET) !== 0) {
3336
+ continue;
3337
+ }
3338
+ if (visible(self, ent, trace, { throughGlass: false })) {
3339
+ return ent;
3340
+ }
3341
+ }
3342
+ return null;
3343
+ }
3324
3344
  function updateSoundChase(self, client, level, hearability, trace) {
3325
3345
  if ((self.spawnflags & SPAWNFLAG_MONSTER_AMBUSH) !== 0) {
3326
3346
  if (!visible(self, client, trace)) return false;
@@ -4773,6 +4793,18 @@ var EntitySystem = class {
4773
4793
  get game() {
4774
4794
  return this._game;
4775
4795
  }
4796
+ get maxClients() {
4797
+ return 32;
4798
+ }
4799
+ get entities() {
4800
+ const arr = new Array(this.pool.capacity + 1).fill(null);
4801
+ for (const ent of this.pool) {
4802
+ if (ent.index >= 0 && ent.index < arr.length) {
4803
+ arr[ent.index] = ent;
4804
+ }
4805
+ }
4806
+ return arr;
4807
+ }
4776
4808
  get world() {
4777
4809
  return this.pool.world;
4778
4810
  }
@@ -9853,11 +9885,35 @@ var FLAG_ITEMS = {
9853
9885
  }
9854
9886
  };
9855
9887
 
9856
- // src/entities/items/weapons.ts
9857
- function createWeaponPickupEntity(game, weaponItem) {
9858
- const respawn = (self) => {
9888
+ // src/entities/items/common.ts
9889
+ init_esm();
9890
+ function handleItemPickup(game, self, other, respawnTime = 30) {
9891
+ if (!game.deathmatch) {
9892
+ game.entities.free(self);
9893
+ return;
9894
+ }
9895
+ self.solid = 0 /* Not */;
9896
+ self.modelindex = 0;
9897
+ self.svflags |= 1 /* NoClient */;
9898
+ self.nextthink = game.time + respawnTime;
9899
+ game.entities.scheduleThink(self, self.nextthink);
9900
+ }
9901
+ function createItemRespawnFunction(game, originalModel) {
9902
+ let cachedIndex = 0;
9903
+ return (self) => {
9904
+ if (!cachedIndex) {
9905
+ cachedIndex = game.entities.modelIndex(originalModel);
9906
+ }
9859
9907
  self.solid = 1 /* Trigger */;
9908
+ self.modelindex = cachedIndex;
9909
+ self.svflags &= ~1 /* NoClient */;
9910
+ game.multicast(self.origin, 1 /* Pvs */, ServerCommand.sound, 0, "items/respawn.wav", 1, 0, 0);
9860
9911
  };
9912
+ }
9913
+
9914
+ // src/entities/items/weapons.ts
9915
+ function createWeaponPickupEntity(game, weaponItem) {
9916
+ const modelName = `models/items/${weaponItem.id.replace("weapon_", "")}/tris.md2`;
9861
9917
  return {
9862
9918
  classname: weaponItem.id,
9863
9919
  solid: 1 /* Trigger */,
@@ -9868,22 +9924,16 @@ function createWeaponPickupEntity(game, weaponItem) {
9868
9924
  if (pickupWeapon(other.client.inventory, weaponItem, game.time * 1e3)) {
9869
9925
  game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
9870
9926
  game.centerprintf?.(other, `You got the ${weaponItem.name}`);
9871
- self.solid = 0 /* Not */;
9872
- if (game.deathmatch) {
9873
- self.nextthink = game.time + 30;
9874
- game.entities.scheduleThink(self, self.nextthink);
9875
- }
9927
+ handleItemPickup(game, self, other);
9876
9928
  }
9877
9929
  },
9878
- think: respawn
9930
+ think: createItemRespawnFunction(game, modelName)
9879
9931
  };
9880
9932
  }
9881
9933
 
9882
9934
  // src/entities/items/health.ts
9883
9935
  function createHealthPickupEntity(game, healthItem) {
9884
- const respawn = (self) => {
9885
- self.solid = 1 /* Trigger */;
9886
- };
9936
+ const modelName = `models/items/healing/${healthItem.id.replace("item_health_", "")}/tris.md2`;
9887
9937
  return {
9888
9938
  classname: healthItem.id,
9889
9939
  solid: 1 /* Trigger */,
@@ -9898,22 +9948,16 @@ function createHealthPickupEntity(game, healthItem) {
9898
9948
  }
9899
9949
  game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
9900
9950
  game.centerprintf?.(other, `You got the ${healthItem.name}`);
9901
- self.solid = 0 /* Not */;
9902
- if (game.deathmatch) {
9903
- self.nextthink = game.time + 30;
9904
- game.entities.scheduleThink(self, self.nextthink);
9905
- }
9951
+ handleItemPickup(game, self, other);
9906
9952
  }
9907
9953
  },
9908
- think: respawn
9954
+ think: createItemRespawnFunction(game, modelName)
9909
9955
  };
9910
9956
  }
9911
9957
 
9912
9958
  // src/entities/items/armor.ts
9913
9959
  function createArmorPickupEntity(game, armorItem) {
9914
- const respawn = (self) => {
9915
- self.solid = 1 /* Trigger */;
9916
- };
9960
+ const modelName = `models/items/armor/${armorItem.id.replace("item_armor_", "")}/tris.md2`;
9917
9961
  return {
9918
9962
  classname: armorItem.id,
9919
9963
  solid: 1 /* Trigger */,
@@ -9924,22 +9968,17 @@ function createArmorPickupEntity(game, armorItem) {
9924
9968
  if (pickupArmor(other.client.inventory, armorItem, game.time * 1e3)) {
9925
9969
  game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
9926
9970
  game.centerprintf?.(other, `You got the ${armorItem.name}`);
9927
- self.solid = 0 /* Not */;
9928
- if (game.deathmatch) {
9929
- self.nextthink = game.time + 30;
9930
- game.entities.scheduleThink(self, self.nextthink);
9931
- }
9971
+ handleItemPickup(game, self, other);
9932
9972
  }
9933
9973
  },
9934
- think: respawn
9974
+ think: createItemRespawnFunction(game, modelName)
9935
9975
  };
9936
9976
  }
9937
9977
 
9938
9978
  // src/entities/items/powerups.ts
9939
9979
  function createPowerupPickupEntity(game, powerupItem) {
9940
- const respawn = (self) => {
9941
- self.solid = 1 /* Trigger */;
9942
- };
9980
+ const respawnTime = powerupItem.id === "item_quad" || powerupItem.id === "item_invulnerability" ? 60 : 30;
9981
+ const modelName = `models/items/powerups/${powerupItem.id.replace("item_", "")}/tris.md2`;
9943
9982
  return {
9944
9983
  classname: powerupItem.id,
9945
9984
  solid: 1 /* Trigger */,
@@ -9950,14 +9989,10 @@ function createPowerupPickupEntity(game, powerupItem) {
9950
9989
  if (pickupPowerup(other.client, powerupItem, game.time * 1e3)) {
9951
9990
  game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
9952
9991
  game.centerprintf?.(other, `You got the ${powerupItem.name}`);
9953
- self.solid = 0 /* Not */;
9954
- if (game.deathmatch) {
9955
- self.nextthink = game.time + 30;
9956
- game.entities.scheduleThink(self, self.nextthink);
9957
- }
9992
+ handleItemPickup(game, self, other, respawnTime);
9958
9993
  }
9959
9994
  },
9960
- think: respawn
9995
+ think: createItemRespawnFunction(game, modelName)
9961
9996
  };
9962
9997
  }
9963
9998
 
@@ -10003,9 +10038,7 @@ var AMMO_DISPLAY_NAMES = {
10003
10038
  };
10004
10039
  function createAmmoPickupEntity(game, itemId) {
10005
10040
  const def = getAmmoItemDefinition(itemId);
10006
- const respawn = (self) => {
10007
- self.solid = 1 /* Trigger */;
10008
- };
10041
+ const modelName = `models/items/ammo/${itemId.replace("ammo_", "")}/tris.md2`;
10009
10042
  return {
10010
10043
  classname: itemId,
10011
10044
  solid: 1 /* Trigger */,
@@ -10018,14 +10051,10 @@ function createAmmoPickupEntity(game, itemId) {
10018
10051
  game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
10019
10052
  const name = AMMO_DISPLAY_NAMES[itemId] || itemId.replace("ammo_", "");
10020
10053
  game.centerprintf?.(other, `You got ${def.quantity} ${name}`);
10021
- self.solid = 0 /* Not */;
10022
- if (game.deathmatch) {
10023
- self.nextthink = game.time + 30;
10024
- game.entities.scheduleThink(self, self.nextthink);
10025
- }
10054
+ handleItemPickup(game, self, other);
10026
10055
  }
10027
10056
  },
10028
- think: respawn
10057
+ think: createItemRespawnFunction(game, modelName)
10029
10058
  };
10030
10059
  }
10031
10060
 
@@ -10862,6 +10891,53 @@ var func_plat = (entity, context) => {
10862
10891
  }
10863
10892
  };
10864
10893
  };
10894
+ var func_plat2 = (entity, context) => {
10895
+ func_plat(entity, context);
10896
+ };
10897
+ function pendulum_swing(ent, context) {
10898
+ let nextThink = ent.nextthink + 0.1;
10899
+ const freq = ent.speed || 0.1;
10900
+ const time = context.timeSeconds;
10901
+ const speed = ent.speed || 1;
10902
+ const dist = ent.distance || 90;
10903
+ const baseAngle = ent.move_angles?.z || 0;
10904
+ const angleDelta = Math.sin(time * speed) * dist;
10905
+ ent.angles = {
10906
+ x: ent.angles.x,
10907
+ y: ent.angles.y,
10908
+ z: baseAngle + angleDelta
10909
+ };
10910
+ context.linkentity(ent);
10911
+ context.scheduleThink(ent, time + 0.1);
10912
+ }
10913
+ var func_pendulum = (entity, context) => {
10914
+ entity.solid = 3 /* Bsp */;
10915
+ entity.movetype = 2 /* Push */;
10916
+ if (!entity.speed) entity.speed = 30;
10917
+ entity.move_angles = { ...entity.angles };
10918
+ entity.distance = entity.dmg || 90;
10919
+ const distKey = context.keyValues.distance;
10920
+ if (distKey) {
10921
+ entity.distance = parseFloat(distKey);
10922
+ }
10923
+ if (entity.targetname) {
10924
+ entity.use = (self) => {
10925
+ self.use = void 0;
10926
+ self.think = (e) => pendulum_swing(e, context.entities);
10927
+ context.entities.scheduleThink(self, context.entities.timeSeconds + 0.1);
10928
+ };
10929
+ } else {
10930
+ entity.think = (e) => pendulum_swing(e, context.entities);
10931
+ context.entities.scheduleThink(entity, context.entities.timeSeconds + 0.1);
10932
+ }
10933
+ if (entity.dmg) {
10934
+ entity.blocked = (self, other) => {
10935
+ if (other && other.takedamage) {
10936
+ other.health -= self.dmg;
10937
+ }
10938
+ };
10939
+ }
10940
+ };
10865
10941
  var func_rotating = (entity, context) => {
10866
10942
  entity.solid = 3 /* Bsp */;
10867
10943
  entity.movetype = 2 /* Push */;
@@ -11232,7 +11308,9 @@ function registerFuncSpawns(registry) {
11232
11308
  registry.register("func_button", func_button);
11233
11309
  registry.register("func_train", func_train);
11234
11310
  registry.register("func_plat", func_plat);
11311
+ registry.register("func_plat2", func_plat2);
11235
11312
  registry.register("func_rotating", func_rotating);
11313
+ registry.register("func_pendulum", func_pendulum);
11236
11314
  registry.register("func_conveyor", func_conveyor);
11237
11315
  registry.register("func_water", func_water);
11238
11316
  registry.register("func_explosive", func_explosive);
@@ -23795,6 +23873,21 @@ function spawnEntitiesFromText(text, options) {
23795
23873
  }
23796
23874
  return spawned;
23797
23875
  }
23876
+ function SelectDeathmatchSpawnPoint(entities) {
23877
+ const spots = entities.findByClassname("info_player_deathmatch");
23878
+ if (spots.length === 0) {
23879
+ return void 0;
23880
+ }
23881
+ const index = Math.floor(entities.rng.frandom() * spots.length);
23882
+ return spots[index];
23883
+ }
23884
+ function SelectSpawnPoint(entities) {
23885
+ if (entities.deathmatch) {
23886
+ const spot = SelectDeathmatchSpawnPoint(entities);
23887
+ if (spot) return spot;
23888
+ }
23889
+ return findPlayerStart(entities);
23890
+ }
23798
23891
  function findPlayerStart(entities) {
23799
23892
  return entities.find(
23800
23893
  (entity) => entity.classname === "info_player_start"
@@ -24962,26 +25055,37 @@ function ClientObituary(self, inflictor, attacker, mod, sys) {
24962
25055
  }
24963
25056
  if (mod === 24 /* SUICIDE */) {
24964
25057
  message = `${friendlyName} suicides.`;
25058
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
24965
25059
  } else if (mod === 23 /* FALLING */) {
24966
25060
  message = `${friendlyName} cratered.`;
25061
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
24967
25062
  } else if (mod === 20 /* CRUSH */) {
24968
25063
  message = `${friendlyName} was squished.`;
25064
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
24969
25065
  } else if (mod === 17 /* WATER */) {
24970
25066
  message = `${friendlyName} sank like a rock.`;
25067
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
24971
25068
  } else if (mod === 18 /* SLIME */) {
24972
25069
  message = `${friendlyName} melted.`;
25070
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
24973
25071
  } else if (mod === 19 /* LAVA */) {
24974
25072
  message = `${friendlyName} does a back flip into the lava.`;
25073
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
24975
25074
  } else if (mod === 26 /* EXPLOSIVE */) {
24976
25075
  message = `${friendlyName} blew up.`;
25076
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
24977
25077
  } else if (mod === 31 /* TARGET_LASER */) {
24978
25078
  message = `${friendlyName} saw the light.`;
25079
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
24979
25080
  } else if (mod === 34 /* TARGET_BLASTER */) {
24980
25081
  message = `${friendlyName} got blasted.`;
25082
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
24981
25083
  } else if (mod === 28 /* BOMB */) {
24982
25084
  message = `${friendlyName} was bombed.`;
25085
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
24983
25086
  } else if (attacker && attacker.classname === "player") {
24984
25087
  if (self === attacker) {
25088
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
24985
25089
  switch (mod) {
24986
25090
  case 6 /* GRENADE */:
24987
25091
  case 7 /* G_SPLASH */:
@@ -25010,6 +25114,9 @@ function ClientObituary(self, inflictor, attacker, mod, sys) {
25010
25114
  break;
25011
25115
  }
25012
25116
  } else {
25117
+ if (attacker.client) {
25118
+ attacker.client.score = (attacker.client.score || 0) + 1;
25119
+ }
25013
25120
  const attackerName = "Enemy";
25014
25121
  switch (mod) {
25015
25122
  case 1 /* BLASTER */:
@@ -25242,6 +25349,18 @@ function player_die(self, inflictor, attacker, damage, point, mod, sys) {
25242
25349
  }
25243
25350
  function player_think(self, sys) {
25244
25351
  if (!self.client) return;
25352
+ if (self.deadflag) {
25353
+ if (self.client.buttons) {
25354
+ if (sys.game && sys.game.respawn) {
25355
+ sys.game.respawn(self);
25356
+ return;
25357
+ }
25358
+ }
25359
+ P_PlayerThink(self, sys);
25360
+ self.nextthink = sys.timeSeconds + 0.1;
25361
+ sys.scheduleThink(self, self.nextthink);
25362
+ return;
25363
+ }
25245
25364
  const nowMs = sys.timeSeconds * 1e3;
25246
25365
  const quadTime = self.client.quad_time || 0;
25247
25366
  const doubleTime = self.client.double_time || 0;
@@ -25912,17 +26031,9 @@ function createGame(imports, engine, options) {
25912
26031
  return true;
25913
26032
  },
25914
26033
  clientBegin(client) {
25915
- const playerStart = findPlayerStart(entities);
25916
26034
  const player = entities.spawn();
25917
- player.classname = "player";
25918
- player.origin = playerStart ? { ...playerStart.origin } : { x: 0, y: 0, z: 0 };
25919
- player.angles = playerStart ? { ...playerStart.angles } : { x: 0, y: 0, z: 0 };
25920
- player.health = 100;
25921
- player.takedamage = true;
25922
- player.movetype = 7 /* Toss */;
25923
- player.mins = { x: -16, y: -16, z: -24 };
25924
- player.maxs = { x: 16, y: 16, z: 32 };
25925
26035
  player.client = client;
26036
+ this.respawn(player);
25926
26037
  player.die = (self, inflictor, attacker, damage, point, mod) => {
25927
26038
  player_die(self, inflictor, attacker, damage, point, mod, entities);
25928
26039
  };
@@ -25934,10 +26045,37 @@ function createGame(imports, engine, options) {
25934
26045
  };
25935
26046
  player.nextthink = entities.timeSeconds + 0.1;
25936
26047
  entities.scheduleThink(player, player.nextthink);
25937
- entities.finalizeSpawn(player);
25938
- origin = { ...player.origin };
25939
26048
  return player;
25940
26049
  },
26050
+ respawn(ent) {
26051
+ if (!ent.client) return;
26052
+ const spawnPoint = SelectSpawnPoint(entities);
26053
+ ent.classname = "player";
26054
+ ent.origin = spawnPoint ? { ...spawnPoint.origin } : { x: 0, y: 0, z: 0 };
26055
+ ent.angles = spawnPoint ? { ...spawnPoint.angles } : { x: 0, y: 0, z: 0 };
26056
+ ent.health = 100;
26057
+ ent.takedamage = true;
26058
+ ent.movetype = 7 /* Toss */;
26059
+ ent.mins = { x: -16, y: -16, z: -24 };
26060
+ ent.maxs = { x: 16, y: 16, z: 32 };
26061
+ ent.solid = 2 /* BoundingBox */;
26062
+ ent.deadflag = 0;
26063
+ ent.modelindex = engine.modelIndex?.("players/male/tris.md2") || 0;
26064
+ ent.client.damage_alpha = 0;
26065
+ ent.client.damage_blend = [0, 0, 0];
26066
+ ent.client.anim_priority = 0;
26067
+ ent.client.anim_end = 0;
26068
+ ent.frame = 0;
26069
+ if (deathmatch) {
26070
+ ent.client.inventory = createPlayerInventory({
26071
+ weapons: [WeaponId.Blaster],
26072
+ currentWeapon: WeaponId.Blaster
26073
+ });
26074
+ } else {
26075
+ }
26076
+ entities.finalizeSpawn(ent);
26077
+ origin = { ...ent.origin };
26078
+ },
25941
26079
  clientDisconnect(ent) {
25942
26080
  if (ent && ent.inUse) {
25943
26081
  entities.free(ent);
@@ -26035,6 +26173,7 @@ function createGame(imports, engine, options) {
26035
26173
  }
26036
26174
  export {
26037
26175
  AIFlags,
26176
+ AI_GetSightClient,
26038
26177
  AMMO_TYPE_COUNT,
26039
26178
  ARMOR_INFO,
26040
26179
  ARMOR_ITEMS,