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
@@ -2462,6 +2462,7 @@ var init_switching = __esm({
2462
2462
  var index_exports = {};
2463
2463
  __export(index_exports, {
2464
2464
  AIFlags: () => AIFlags,
2465
+ AI_GetSightClient: () => AI_GetSightClient,
2465
2466
  AMMO_TYPE_COUNT: () => AMMO_TYPE_COUNT,
2466
2467
  ARMOR_INFO: () => ARMOR_INFO,
2467
2468
  ARMOR_ITEMS: () => ARMOR_ITEMS,
@@ -2966,6 +2967,7 @@ var Entity = class {
2966
2967
  this.svflags = 0;
2967
2968
  this.monsterinfo = { ...DEFAULT_MONSTER_INFO, last_sighting: copyVec32() };
2968
2969
  this.hackflags = 0;
2970
+ this.fov = 0;
2969
2971
  this.show_hostile = 0;
2970
2972
  this.light_level = 0;
2971
2973
  this.owner = null;
@@ -3219,7 +3221,8 @@ var ENTITY_FIELD_METADATA = [
3219
3221
  { name: "beam2", type: "entity", save: true },
3220
3222
  { name: "chain", type: "entity", save: true },
3221
3223
  { name: "alpha", type: "float", save: true },
3222
- { name: "hackflags", type: "int", save: true }
3224
+ { name: "hackflags", type: "int", save: true },
3225
+ { name: "fov", type: "float", save: true }
3223
3226
  ];
3224
3227
 
3225
3228
  // src/entities/system.ts
@@ -3508,6 +3511,24 @@ function classifyClientVisibility(self, other, level, trace) {
3508
3511
  }
3509
3512
  return true;
3510
3513
  }
3514
+ function AI_GetSightClient(self, context, trace) {
3515
+ if ((self.monsterinfo.aiflags & 1024 /* NoStep */) !== 0) {
3516
+ return null;
3517
+ }
3518
+ for (let i = 1; i <= context.maxClients; i++) {
3519
+ const ent = context.entities[i];
3520
+ if (!ent || !ent.inUse || ent.health <= 0) {
3521
+ continue;
3522
+ }
3523
+ if ((ent.flags & FL_NOTARGET) !== 0) {
3524
+ continue;
3525
+ }
3526
+ if (visible(self, ent, trace, { throughGlass: false })) {
3527
+ return ent;
3528
+ }
3529
+ }
3530
+ return null;
3531
+ }
3511
3532
  function updateSoundChase(self, client, level, hearability, trace) {
3512
3533
  if ((self.spawnflags & SPAWNFLAG_MONSTER_AMBUSH) !== 0) {
3513
3534
  if (!visible(self, client, trace)) return false;
@@ -4960,6 +4981,18 @@ var EntitySystem = class {
4960
4981
  get game() {
4961
4982
  return this._game;
4962
4983
  }
4984
+ get maxClients() {
4985
+ return 32;
4986
+ }
4987
+ get entities() {
4988
+ const arr = new Array(this.pool.capacity + 1).fill(null);
4989
+ for (const ent of this.pool) {
4990
+ if (ent.index >= 0 && ent.index < arr.length) {
4991
+ arr[ent.index] = ent;
4992
+ }
4993
+ }
4994
+ return arr;
4995
+ }
4963
4996
  get world() {
4964
4997
  return this.pool.world;
4965
4998
  }
@@ -10040,11 +10073,35 @@ var FLAG_ITEMS = {
10040
10073
  }
10041
10074
  };
10042
10075
 
10043
- // src/entities/items/weapons.ts
10044
- function createWeaponPickupEntity(game, weaponItem) {
10045
- const respawn = (self) => {
10076
+ // src/entities/items/common.ts
10077
+ init_esm();
10078
+ function handleItemPickup(game, self, other, respawnTime = 30) {
10079
+ if (!game.deathmatch) {
10080
+ game.entities.free(self);
10081
+ return;
10082
+ }
10083
+ self.solid = 0 /* Not */;
10084
+ self.modelindex = 0;
10085
+ self.svflags |= 1 /* NoClient */;
10086
+ self.nextthink = game.time + respawnTime;
10087
+ game.entities.scheduleThink(self, self.nextthink);
10088
+ }
10089
+ function createItemRespawnFunction(game, originalModel) {
10090
+ let cachedIndex = 0;
10091
+ return (self) => {
10092
+ if (!cachedIndex) {
10093
+ cachedIndex = game.entities.modelIndex(originalModel);
10094
+ }
10046
10095
  self.solid = 1 /* Trigger */;
10096
+ self.modelindex = cachedIndex;
10097
+ self.svflags &= ~1 /* NoClient */;
10098
+ game.multicast(self.origin, 1 /* Pvs */, ServerCommand.sound, 0, "items/respawn.wav", 1, 0, 0);
10047
10099
  };
10100
+ }
10101
+
10102
+ // src/entities/items/weapons.ts
10103
+ function createWeaponPickupEntity(game, weaponItem) {
10104
+ const modelName = `models/items/${weaponItem.id.replace("weapon_", "")}/tris.md2`;
10048
10105
  return {
10049
10106
  classname: weaponItem.id,
10050
10107
  solid: 1 /* Trigger */,
@@ -10055,22 +10112,16 @@ function createWeaponPickupEntity(game, weaponItem) {
10055
10112
  if (pickupWeapon(other.client.inventory, weaponItem, game.time * 1e3)) {
10056
10113
  game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
10057
10114
  game.centerprintf?.(other, `You got the ${weaponItem.name}`);
10058
- self.solid = 0 /* Not */;
10059
- if (game.deathmatch) {
10060
- self.nextthink = game.time + 30;
10061
- game.entities.scheduleThink(self, self.nextthink);
10062
- }
10115
+ handleItemPickup(game, self, other);
10063
10116
  }
10064
10117
  },
10065
- think: respawn
10118
+ think: createItemRespawnFunction(game, modelName)
10066
10119
  };
10067
10120
  }
10068
10121
 
10069
10122
  // src/entities/items/health.ts
10070
10123
  function createHealthPickupEntity(game, healthItem) {
10071
- const respawn = (self) => {
10072
- self.solid = 1 /* Trigger */;
10073
- };
10124
+ const modelName = `models/items/healing/${healthItem.id.replace("item_health_", "")}/tris.md2`;
10074
10125
  return {
10075
10126
  classname: healthItem.id,
10076
10127
  solid: 1 /* Trigger */,
@@ -10085,22 +10136,16 @@ function createHealthPickupEntity(game, healthItem) {
10085
10136
  }
10086
10137
  game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
10087
10138
  game.centerprintf?.(other, `You got the ${healthItem.name}`);
10088
- self.solid = 0 /* Not */;
10089
- if (game.deathmatch) {
10090
- self.nextthink = game.time + 30;
10091
- game.entities.scheduleThink(self, self.nextthink);
10092
- }
10139
+ handleItemPickup(game, self, other);
10093
10140
  }
10094
10141
  },
10095
- think: respawn
10142
+ think: createItemRespawnFunction(game, modelName)
10096
10143
  };
10097
10144
  }
10098
10145
 
10099
10146
  // src/entities/items/armor.ts
10100
10147
  function createArmorPickupEntity(game, armorItem) {
10101
- const respawn = (self) => {
10102
- self.solid = 1 /* Trigger */;
10103
- };
10148
+ const modelName = `models/items/armor/${armorItem.id.replace("item_armor_", "")}/tris.md2`;
10104
10149
  return {
10105
10150
  classname: armorItem.id,
10106
10151
  solid: 1 /* Trigger */,
@@ -10111,22 +10156,17 @@ function createArmorPickupEntity(game, armorItem) {
10111
10156
  if (pickupArmor(other.client.inventory, armorItem, game.time * 1e3)) {
10112
10157
  game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
10113
10158
  game.centerprintf?.(other, `You got the ${armorItem.name}`);
10114
- self.solid = 0 /* Not */;
10115
- if (game.deathmatch) {
10116
- self.nextthink = game.time + 30;
10117
- game.entities.scheduleThink(self, self.nextthink);
10118
- }
10159
+ handleItemPickup(game, self, other);
10119
10160
  }
10120
10161
  },
10121
- think: respawn
10162
+ think: createItemRespawnFunction(game, modelName)
10122
10163
  };
10123
10164
  }
10124
10165
 
10125
10166
  // src/entities/items/powerups.ts
10126
10167
  function createPowerupPickupEntity(game, powerupItem) {
10127
- const respawn = (self) => {
10128
- self.solid = 1 /* Trigger */;
10129
- };
10168
+ const respawnTime = powerupItem.id === "item_quad" || powerupItem.id === "item_invulnerability" ? 60 : 30;
10169
+ const modelName = `models/items/powerups/${powerupItem.id.replace("item_", "")}/tris.md2`;
10130
10170
  return {
10131
10171
  classname: powerupItem.id,
10132
10172
  solid: 1 /* Trigger */,
@@ -10137,14 +10177,10 @@ function createPowerupPickupEntity(game, powerupItem) {
10137
10177
  if (pickupPowerup(other.client, powerupItem, game.time * 1e3)) {
10138
10178
  game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
10139
10179
  game.centerprintf?.(other, `You got the ${powerupItem.name}`);
10140
- self.solid = 0 /* Not */;
10141
- if (game.deathmatch) {
10142
- self.nextthink = game.time + 30;
10143
- game.entities.scheduleThink(self, self.nextthink);
10144
- }
10180
+ handleItemPickup(game, self, other, respawnTime);
10145
10181
  }
10146
10182
  },
10147
- think: respawn
10183
+ think: createItemRespawnFunction(game, modelName)
10148
10184
  };
10149
10185
  }
10150
10186
 
@@ -10190,9 +10226,7 @@ var AMMO_DISPLAY_NAMES = {
10190
10226
  };
10191
10227
  function createAmmoPickupEntity(game, itemId) {
10192
10228
  const def = getAmmoItemDefinition(itemId);
10193
- const respawn = (self) => {
10194
- self.solid = 1 /* Trigger */;
10195
- };
10229
+ const modelName = `models/items/ammo/${itemId.replace("ammo_", "")}/tris.md2`;
10196
10230
  return {
10197
10231
  classname: itemId,
10198
10232
  solid: 1 /* Trigger */,
@@ -10205,14 +10239,10 @@ function createAmmoPickupEntity(game, itemId) {
10205
10239
  game.sound?.(other, 0, "items/pkup.wav", 1, 1, 0);
10206
10240
  const name = AMMO_DISPLAY_NAMES[itemId] || itemId.replace("ammo_", "");
10207
10241
  game.centerprintf?.(other, `You got ${def.quantity} ${name}`);
10208
- self.solid = 0 /* Not */;
10209
- if (game.deathmatch) {
10210
- self.nextthink = game.time + 30;
10211
- game.entities.scheduleThink(self, self.nextthink);
10212
- }
10242
+ handleItemPickup(game, self, other);
10213
10243
  }
10214
10244
  },
10215
- think: respawn
10245
+ think: createItemRespawnFunction(game, modelName)
10216
10246
  };
10217
10247
  }
10218
10248
 
@@ -11049,6 +11079,53 @@ var func_plat = (entity, context) => {
11049
11079
  }
11050
11080
  };
11051
11081
  };
11082
+ var func_plat2 = (entity, context) => {
11083
+ func_plat(entity, context);
11084
+ };
11085
+ function pendulum_swing(ent, context) {
11086
+ let nextThink = ent.nextthink + 0.1;
11087
+ const freq = ent.speed || 0.1;
11088
+ const time = context.timeSeconds;
11089
+ const speed = ent.speed || 1;
11090
+ const dist = ent.distance || 90;
11091
+ const baseAngle = ent.move_angles?.z || 0;
11092
+ const angleDelta = Math.sin(time * speed) * dist;
11093
+ ent.angles = {
11094
+ x: ent.angles.x,
11095
+ y: ent.angles.y,
11096
+ z: baseAngle + angleDelta
11097
+ };
11098
+ context.linkentity(ent);
11099
+ context.scheduleThink(ent, time + 0.1);
11100
+ }
11101
+ var func_pendulum = (entity, context) => {
11102
+ entity.solid = 3 /* Bsp */;
11103
+ entity.movetype = 2 /* Push */;
11104
+ if (!entity.speed) entity.speed = 30;
11105
+ entity.move_angles = { ...entity.angles };
11106
+ entity.distance = entity.dmg || 90;
11107
+ const distKey = context.keyValues.distance;
11108
+ if (distKey) {
11109
+ entity.distance = parseFloat(distKey);
11110
+ }
11111
+ if (entity.targetname) {
11112
+ entity.use = (self) => {
11113
+ self.use = void 0;
11114
+ self.think = (e) => pendulum_swing(e, context.entities);
11115
+ context.entities.scheduleThink(self, context.entities.timeSeconds + 0.1);
11116
+ };
11117
+ } else {
11118
+ entity.think = (e) => pendulum_swing(e, context.entities);
11119
+ context.entities.scheduleThink(entity, context.entities.timeSeconds + 0.1);
11120
+ }
11121
+ if (entity.dmg) {
11122
+ entity.blocked = (self, other) => {
11123
+ if (other && other.takedamage) {
11124
+ other.health -= self.dmg;
11125
+ }
11126
+ };
11127
+ }
11128
+ };
11052
11129
  var func_rotating = (entity, context) => {
11053
11130
  entity.solid = 3 /* Bsp */;
11054
11131
  entity.movetype = 2 /* Push */;
@@ -11419,7 +11496,9 @@ function registerFuncSpawns(registry) {
11419
11496
  registry.register("func_button", func_button);
11420
11497
  registry.register("func_train", func_train);
11421
11498
  registry.register("func_plat", func_plat);
11499
+ registry.register("func_plat2", func_plat2);
11422
11500
  registry.register("func_rotating", func_rotating);
11501
+ registry.register("func_pendulum", func_pendulum);
11423
11502
  registry.register("func_conveyor", func_conveyor);
11424
11503
  registry.register("func_water", func_water);
11425
11504
  registry.register("func_explosive", func_explosive);
@@ -23982,6 +24061,21 @@ function spawnEntitiesFromText(text, options) {
23982
24061
  }
23983
24062
  return spawned;
23984
24063
  }
24064
+ function SelectDeathmatchSpawnPoint(entities) {
24065
+ const spots = entities.findByClassname("info_player_deathmatch");
24066
+ if (spots.length === 0) {
24067
+ return void 0;
24068
+ }
24069
+ const index = Math.floor(entities.rng.frandom() * spots.length);
24070
+ return spots[index];
24071
+ }
24072
+ function SelectSpawnPoint(entities) {
24073
+ if (entities.deathmatch) {
24074
+ const spot = SelectDeathmatchSpawnPoint(entities);
24075
+ if (spot) return spot;
24076
+ }
24077
+ return findPlayerStart(entities);
24078
+ }
23985
24079
  function findPlayerStart(entities) {
23986
24080
  return entities.find(
23987
24081
  (entity) => entity.classname === "info_player_start"
@@ -25149,26 +25243,37 @@ function ClientObituary(self, inflictor, attacker, mod, sys) {
25149
25243
  }
25150
25244
  if (mod === 24 /* SUICIDE */) {
25151
25245
  message = `${friendlyName} suicides.`;
25246
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
25152
25247
  } else if (mod === 23 /* FALLING */) {
25153
25248
  message = `${friendlyName} cratered.`;
25249
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
25154
25250
  } else if (mod === 20 /* CRUSH */) {
25155
25251
  message = `${friendlyName} was squished.`;
25252
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
25156
25253
  } else if (mod === 17 /* WATER */) {
25157
25254
  message = `${friendlyName} sank like a rock.`;
25255
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
25158
25256
  } else if (mod === 18 /* SLIME */) {
25159
25257
  message = `${friendlyName} melted.`;
25258
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
25160
25259
  } else if (mod === 19 /* LAVA */) {
25161
25260
  message = `${friendlyName} does a back flip into the lava.`;
25261
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
25162
25262
  } else if (mod === 26 /* EXPLOSIVE */) {
25163
25263
  message = `${friendlyName} blew up.`;
25264
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
25164
25265
  } else if (mod === 31 /* TARGET_LASER */) {
25165
25266
  message = `${friendlyName} saw the light.`;
25267
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
25166
25268
  } else if (mod === 34 /* TARGET_BLASTER */) {
25167
25269
  message = `${friendlyName} got blasted.`;
25270
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
25168
25271
  } else if (mod === 28 /* BOMB */) {
25169
25272
  message = `${friendlyName} was bombed.`;
25273
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
25170
25274
  } else if (attacker && attacker.classname === "player") {
25171
25275
  if (self === attacker) {
25276
+ if (self.client) self.client.score = (self.client.score || 0) - 1;
25172
25277
  switch (mod) {
25173
25278
  case 6 /* GRENADE */:
25174
25279
  case 7 /* G_SPLASH */:
@@ -25197,6 +25302,9 @@ function ClientObituary(self, inflictor, attacker, mod, sys) {
25197
25302
  break;
25198
25303
  }
25199
25304
  } else {
25305
+ if (attacker.client) {
25306
+ attacker.client.score = (attacker.client.score || 0) + 1;
25307
+ }
25200
25308
  const attackerName = "Enemy";
25201
25309
  switch (mod) {
25202
25310
  case 1 /* BLASTER */:
@@ -25429,6 +25537,18 @@ function player_die(self, inflictor, attacker, damage, point, mod, sys) {
25429
25537
  }
25430
25538
  function player_think(self, sys) {
25431
25539
  if (!self.client) return;
25540
+ if (self.deadflag) {
25541
+ if (self.client.buttons) {
25542
+ if (sys.game && sys.game.respawn) {
25543
+ sys.game.respawn(self);
25544
+ return;
25545
+ }
25546
+ }
25547
+ P_PlayerThink(self, sys);
25548
+ self.nextthink = sys.timeSeconds + 0.1;
25549
+ sys.scheduleThink(self, self.nextthink);
25550
+ return;
25551
+ }
25432
25552
  const nowMs = sys.timeSeconds * 1e3;
25433
25553
  const quadTime = self.client.quad_time || 0;
25434
25554
  const doubleTime = self.client.double_time || 0;
@@ -26099,17 +26219,9 @@ function createGame(imports, engine, options) {
26099
26219
  return true;
26100
26220
  },
26101
26221
  clientBegin(client) {
26102
- const playerStart = findPlayerStart(entities);
26103
26222
  const player = entities.spawn();
26104
- player.classname = "player";
26105
- player.origin = playerStart ? { ...playerStart.origin } : { x: 0, y: 0, z: 0 };
26106
- player.angles = playerStart ? { ...playerStart.angles } : { x: 0, y: 0, z: 0 };
26107
- player.health = 100;
26108
- player.takedamage = true;
26109
- player.movetype = 7 /* Toss */;
26110
- player.mins = { x: -16, y: -16, z: -24 };
26111
- player.maxs = { x: 16, y: 16, z: 32 };
26112
26223
  player.client = client;
26224
+ this.respawn(player);
26113
26225
  player.die = (self, inflictor, attacker, damage, point, mod) => {
26114
26226
  player_die(self, inflictor, attacker, damage, point, mod, entities);
26115
26227
  };
@@ -26121,10 +26233,37 @@ function createGame(imports, engine, options) {
26121
26233
  };
26122
26234
  player.nextthink = entities.timeSeconds + 0.1;
26123
26235
  entities.scheduleThink(player, player.nextthink);
26124
- entities.finalizeSpawn(player);
26125
- origin = { ...player.origin };
26126
26236
  return player;
26127
26237
  },
26238
+ respawn(ent) {
26239
+ if (!ent.client) return;
26240
+ const spawnPoint = SelectSpawnPoint(entities);
26241
+ ent.classname = "player";
26242
+ ent.origin = spawnPoint ? { ...spawnPoint.origin } : { x: 0, y: 0, z: 0 };
26243
+ ent.angles = spawnPoint ? { ...spawnPoint.angles } : { x: 0, y: 0, z: 0 };
26244
+ ent.health = 100;
26245
+ ent.takedamage = true;
26246
+ ent.movetype = 7 /* Toss */;
26247
+ ent.mins = { x: -16, y: -16, z: -24 };
26248
+ ent.maxs = { x: 16, y: 16, z: 32 };
26249
+ ent.solid = 2 /* BoundingBox */;
26250
+ ent.deadflag = 0;
26251
+ ent.modelindex = engine.modelIndex?.("players/male/tris.md2") || 0;
26252
+ ent.client.damage_alpha = 0;
26253
+ ent.client.damage_blend = [0, 0, 0];
26254
+ ent.client.anim_priority = 0;
26255
+ ent.client.anim_end = 0;
26256
+ ent.frame = 0;
26257
+ if (deathmatch) {
26258
+ ent.client.inventory = createPlayerInventory({
26259
+ weapons: [WeaponId.Blaster],
26260
+ currentWeapon: WeaponId.Blaster
26261
+ });
26262
+ } else {
26263
+ }
26264
+ entities.finalizeSpawn(ent);
26265
+ origin = { ...ent.origin };
26266
+ },
26128
26267
  clientDisconnect(ent) {
26129
26268
  if (ent && ent.inUse) {
26130
26269
  entities.free(ent);
@@ -26223,6 +26362,7 @@ function createGame(imports, engine, options) {
26223
26362
  // Annotate the CommonJS export names for ESM import in node:
26224
26363
  0 && (module.exports = {
26225
26364
  AIFlags,
26365
+ AI_GetSightClient,
26226
26366
  AMMO_TYPE_COUNT,
26227
26367
  ARMOR_INFO,
26228
26368
  ARMOR_ITEMS,