quake2ts 0.0.427 → 0.0.430

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 (31) hide show
  1. package/package.json +1 -1
  2. package/packages/cgame/dist/index.cjs +1 -1
  3. package/packages/cgame/dist/index.cjs.map +1 -1
  4. package/packages/cgame/dist/index.js +1 -1
  5. package/packages/cgame/dist/index.js.map +1 -1
  6. package/packages/client/dist/browser/index.global.js +12 -12
  7. package/packages/client/dist/browser/index.global.js.map +1 -1
  8. package/packages/client/dist/cjs/index.cjs +133 -2
  9. package/packages/client/dist/cjs/index.cjs.map +1 -1
  10. package/packages/client/dist/esm/index.js +133 -2
  11. package/packages/client/dist/esm/index.js.map +1 -1
  12. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  13. package/packages/engine/dist/browser/index.global.js +9 -9
  14. package/packages/engine/dist/browser/index.global.js.map +1 -1
  15. package/packages/engine/dist/cjs/index.cjs +162 -2
  16. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  17. package/packages/engine/dist/esm/index.js +159 -2
  18. package/packages/engine/dist/esm/index.js.map +1 -1
  19. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  20. package/packages/engine/dist/types/commands.d.ts +7 -0
  21. package/packages/engine/dist/types/commands.d.ts.map +1 -1
  22. package/packages/engine/dist/types/demo/analyzer.d.ts +6 -1
  23. package/packages/engine/dist/types/demo/analyzer.d.ts.map +1 -1
  24. package/packages/engine/dist/types/demo/camera.d.ts +17 -0
  25. package/packages/engine/dist/types/demo/camera.d.ts.map +1 -0
  26. package/packages/engine/dist/types/demo/playback.d.ts +13 -1
  27. package/packages/engine/dist/types/demo/playback.d.ts.map +1 -1
  28. package/packages/engine/dist/types/host.d.ts.map +1 -1
  29. package/packages/engine/dist/types/index.d.ts +5 -0
  30. package/packages/engine/dist/types/index.d.ts.map +1 -1
  31. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
@@ -46,6 +46,9 @@ __export(index_exports, {
46
46
  ConfigStringRegistry: () => ConfigStringRegistry,
47
47
  Cvar: () => Cvar,
48
48
  CvarRegistry: () => CvarRegistry,
49
+ DemoAnalyzer: () => DemoAnalyzer,
50
+ DemoCameraMode: () => DemoCameraMode,
51
+ DemoEventType: () => DemoEventType,
49
52
  DemoPlaybackController: () => DemoPlaybackController,
50
53
  DemoReader: () => DemoReader,
51
54
  DemoRecorder: () => DemoRecorder,
@@ -291,6 +294,9 @@ var Command = class {
291
294
  var CommandRegistry = class {
292
295
  constructor() {
293
296
  this.commands = /* @__PURE__ */ new Map();
297
+ this.history = [];
298
+ this.historyLimit = 64;
299
+ this.autocompleteProviders = [];
294
300
  }
295
301
  register(name, callback, description) {
296
302
  const command = new Command(name, callback, description);
@@ -300,10 +306,23 @@ var CommandRegistry = class {
300
306
  registerCommand(name, callback) {
301
307
  this.register(name, callback);
302
308
  }
309
+ registerAutocompleteProvider(provider) {
310
+ this.autocompleteProviders.push(provider);
311
+ }
303
312
  get(name) {
304
313
  return this.commands.get(name);
305
314
  }
306
315
  execute(commandString) {
316
+ const trimmed = commandString.trim();
317
+ if (trimmed.length === 0) {
318
+ return false;
319
+ }
320
+ if (this.history.length === 0 || this.history[this.history.length - 1] !== trimmed) {
321
+ this.history.push(trimmed);
322
+ if (this.history.length > this.historyLimit) {
323
+ this.history.shift();
324
+ }
325
+ }
307
326
  const parts = this.tokenize(commandString);
308
327
  if (parts.length === 0) {
309
328
  return false;
@@ -321,6 +340,26 @@ var CommandRegistry = class {
321
340
  executeCommand(cmd) {
322
341
  this.execute(cmd);
323
342
  }
343
+ getHistory() {
344
+ return [...this.history];
345
+ }
346
+ getSuggestions(prefix) {
347
+ const suggestions = /* @__PURE__ */ new Set();
348
+ for (const name of this.commands.keys()) {
349
+ if (name.startsWith(prefix)) {
350
+ suggestions.add(name);
351
+ }
352
+ }
353
+ for (const provider of this.autocompleteProviders) {
354
+ const providerSuggestions = provider();
355
+ for (const suggestion of providerSuggestions) {
356
+ if (suggestion.startsWith(prefix)) {
357
+ suggestions.add(suggestion);
358
+ }
359
+ }
360
+ }
361
+ return Array.from(suggestions).sort();
362
+ }
324
363
  tokenize(text) {
325
364
  const args = [];
326
365
  let currentArg = "";
@@ -1618,6 +1657,9 @@ var EngineHost = class {
1618
1657
  },
1619
1658
  { ...options.loop, startTimeMs: this.startTimeMs }
1620
1659
  );
1660
+ this.commands.registerAutocompleteProvider(() => {
1661
+ return this.cvars.list().map((cvar) => cvar.name);
1662
+ });
1621
1663
  }
1622
1664
  start() {
1623
1665
  if (this.started) return;
@@ -12825,6 +12867,18 @@ var NetworkMessageParser = class _NetworkMessageParser {
12825
12867
  }
12826
12868
  };
12827
12869
 
12870
+ // src/demo/analysis.ts
12871
+ var DemoEventType = /* @__PURE__ */ ((DemoEventType2) => {
12872
+ DemoEventType2[DemoEventType2["WeaponFire"] = 0] = "WeaponFire";
12873
+ DemoEventType2[DemoEventType2["DamageDealt"] = 1] = "DamageDealt";
12874
+ DemoEventType2[DemoEventType2["DamageReceived"] = 2] = "DamageReceived";
12875
+ DemoEventType2[DemoEventType2["Pickup"] = 3] = "Pickup";
12876
+ DemoEventType2[DemoEventType2["Death"] = 4] = "Death";
12877
+ DemoEventType2[DemoEventType2["Spawn"] = 5] = "Spawn";
12878
+ DemoEventType2[DemoEventType2["PlayerInfo"] = 6] = "PlayerInfo";
12879
+ return DemoEventType2;
12880
+ })(DemoEventType || {});
12881
+
12828
12882
  // src/demo/analyzer.ts
12829
12883
  var DemoAnalyzer = class {
12830
12884
  constructor(buffer) {
@@ -12843,6 +12897,8 @@ var DemoAnalyzer = class {
12843
12897
  this.playerStats = /* @__PURE__ */ new Map();
12844
12898
  // By playerNum
12845
12899
  this.weaponStats = /* @__PURE__ */ new Map();
12900
+ // By entity ID
12901
+ this.activeEntities = /* @__PURE__ */ new Set();
12846
12902
  this.buffer = buffer;
12847
12903
  }
12848
12904
  analyze() {
@@ -12878,9 +12934,28 @@ var DemoAnalyzer = class {
12878
12934
  onSpawnBaseline: (entity) => {
12879
12935
  },
12880
12936
  onFrame: (frame) => {
12937
+ const currentFrameEntities = /* @__PURE__ */ new Set();
12938
+ if (frame.packetEntities && frame.packetEntities.entities) {
12939
+ for (const ent of frame.packetEntities.entities) {
12940
+ currentFrameEntities.add(ent.number);
12941
+ if (!this.activeEntities.has(ent.number)) {
12942
+ this.recordEvent({
12943
+ type: 5 /* Spawn */,
12944
+ frame: currentFrameIndex,
12945
+ time: currentTime,
12946
+ entityId: ent.number,
12947
+ position: { x: ent.origin.x, y: ent.origin.y, z: ent.origin.z },
12948
+ description: `Entity ${ent.number} spawned`
12949
+ });
12950
+ }
12951
+ }
12952
+ }
12953
+ this.activeEntities = currentFrameEntities;
12954
+ if (frame.playerState && this.header) {
12955
+ }
12881
12956
  },
12882
12957
  onPrint: (level, msg) => {
12883
- if (msg.includes("died") || msg.includes("killed")) {
12958
+ if (msg.includes("died") || msg.includes("killed") || msg.includes("suicide")) {
12884
12959
  this.summary.totalDeaths++;
12885
12960
  this.recordEvent({
12886
12961
  type: 4 /* Death */,
@@ -12889,6 +12964,14 @@ var DemoAnalyzer = class {
12889
12964
  description: msg.trim()
12890
12965
  });
12891
12966
  }
12967
+ if (msg.startsWith("You got the ")) {
12968
+ this.recordEvent({
12969
+ type: 3 /* Pickup */,
12970
+ frame: currentFrameIndex,
12971
+ time: currentTime,
12972
+ description: msg.trim()
12973
+ });
12974
+ }
12892
12975
  },
12893
12976
  onCenterPrint: () => {
12894
12977
  },
@@ -12929,6 +13012,10 @@ var DemoAnalyzer = class {
12929
13012
  description: `Took ${ind.damage} damage`
12930
13013
  });
12931
13014
  this.summary.damageReceived += ind.damage;
13015
+ if (this.header) {
13016
+ const pStats = this.getOrCreatePlayerStats(this.header.playerNum);
13017
+ pStats.damageReceived += ind.damage;
13018
+ }
12932
13019
  }
12933
13020
  }
12934
13021
  };
@@ -12956,7 +13043,9 @@ var DemoAnalyzer = class {
12956
13043
  header: this.header,
12957
13044
  configStrings: this.configStrings,
12958
13045
  serverInfo: this.serverInfo,
12959
- statistics: this.statistics
13046
+ statistics: this.statistics,
13047
+ playerStats: this.playerStats,
13048
+ weaponStats: this.weaponStats
12960
13049
  };
12961
13050
  }
12962
13051
  handleWeaponFire(ent, weapon, frame, time) {
@@ -12970,6 +13059,8 @@ var DemoAnalyzer = class {
12970
13059
  });
12971
13060
  const count = this.summary.weaponUsage.get(weapon) || 0;
12972
13061
  this.summary.weaponUsage.set(weapon, count + 1);
13062
+ const wStats = this.getOrCreateWeaponStat(ent, weapon);
13063
+ wStats.shotsFired++;
12973
13064
  }
12974
13065
  recordEvent(event) {
12975
13066
  this.events.push(event);
@@ -12982,8 +13073,44 @@ var DemoAnalyzer = class {
12982
13073
  }
12983
13074
  }
12984
13075
  }
13076
+ getOrCreatePlayerStats(playerNum) {
13077
+ let stats = this.playerStats.get(playerNum);
13078
+ if (!stats) {
13079
+ stats = {
13080
+ kills: 0,
13081
+ deaths: 0,
13082
+ damageDealt: 0,
13083
+ damageReceived: 0,
13084
+ suicides: 0
13085
+ };
13086
+ this.playerStats.set(playerNum, stats);
13087
+ }
13088
+ return stats;
13089
+ }
13090
+ getOrCreateWeaponStat(entityId, weaponId) {
13091
+ let statsList = this.weaponStats.get(entityId);
13092
+ if (!statsList) {
13093
+ statsList = [];
13094
+ this.weaponStats.set(entityId, statsList);
13095
+ }
13096
+ let stat = statsList.find((s) => s.weaponId === weaponId);
13097
+ if (!stat) {
13098
+ stat = { weaponId, shotsFired: 0, hits: 0, kills: 0 };
13099
+ statsList.push(stat);
13100
+ }
13101
+ return stat;
13102
+ }
12985
13103
  };
12986
13104
 
13105
+ // src/demo/camera.ts
13106
+ var DemoCameraMode = /* @__PURE__ */ ((DemoCameraMode2) => {
13107
+ DemoCameraMode2[DemoCameraMode2["FirstPerson"] = 0] = "FirstPerson";
13108
+ DemoCameraMode2[DemoCameraMode2["ThirdPerson"] = 1] = "ThirdPerson";
13109
+ DemoCameraMode2[DemoCameraMode2["Free"] = 2] = "Free";
13110
+ DemoCameraMode2[DemoCameraMode2["Follow"] = 3] = "Follow";
13111
+ return DemoCameraMode2;
13112
+ })(DemoCameraMode || {});
13113
+
12987
13114
  // src/demo/playback.ts
12988
13115
  var PlaybackState = /* @__PURE__ */ ((PlaybackState2) => {
12989
13116
  PlaybackState2[PlaybackState2["Stopped"] = 0] = "Stopped";
@@ -13019,6 +13146,12 @@ var DemoPlaybackController = class {
13019
13146
  this.cachedConfigStrings = null;
13020
13147
  this.cachedServerInfo = null;
13021
13148
  this.cachedStatistics = null;
13149
+ this.cachedPlayerStats = null;
13150
+ this.cachedWeaponStats = null;
13151
+ // Camera State
13152
+ this.cameraMode = 0 /* FirstPerson */;
13153
+ this.thirdPersonDistance = 80;
13154
+ this.thirdPersonOffset = { x: 0, y: 0, z: 0 };
13022
13155
  }
13023
13156
  setHandler(handler) {
13024
13157
  this.handler = handler;
@@ -13041,6 +13174,8 @@ var DemoPlaybackController = class {
13041
13174
  this.cachedConfigStrings = null;
13042
13175
  this.cachedServerInfo = null;
13043
13176
  this.cachedStatistics = null;
13177
+ this.cachedPlayerStats = null;
13178
+ this.cachedWeaponStats = null;
13044
13179
  }
13045
13180
  play() {
13046
13181
  if (this.reader && this.state !== 1 /* Playing */) {
@@ -13392,6 +13527,14 @@ var DemoPlaybackController = class {
13392
13527
  this.ensureAnalysis();
13393
13528
  return this.cachedStatistics;
13394
13529
  }
13530
+ getPlayerStatistics(playerIndex) {
13531
+ this.ensureAnalysis();
13532
+ return this.cachedPlayerStats?.get(playerIndex) || null;
13533
+ }
13534
+ getWeaponStatistics(entityId) {
13535
+ this.ensureAnalysis();
13536
+ return this.cachedWeaponStats?.get(entityId) || null;
13537
+ }
13395
13538
  ensureAnalysis() {
13396
13539
  if (!this.cachedEvents && this.buffer) {
13397
13540
  const analyzer = new DemoAnalyzer(this.buffer);
@@ -13402,8 +13545,22 @@ var DemoPlaybackController = class {
13402
13545
  this.cachedConfigStrings = result.configStrings;
13403
13546
  this.cachedServerInfo = result.serverInfo;
13404
13547
  this.cachedStatistics = result.statistics;
13548
+ this.cachedPlayerStats = result.playerStats;
13549
+ this.cachedWeaponStats = result.weaponStats;
13405
13550
  }
13406
13551
  }
13552
+ setCameraMode(mode) {
13553
+ this.cameraMode = mode;
13554
+ }
13555
+ getCameraMode() {
13556
+ return this.cameraMode;
13557
+ }
13558
+ setThirdPersonDistance(distance) {
13559
+ this.thirdPersonDistance = distance;
13560
+ }
13561
+ setThirdPersonOffset(offset) {
13562
+ this.thirdPersonOffset = offset;
13563
+ }
13407
13564
  };
13408
13565
 
13409
13566
  // src/demo/recorder.ts
@@ -13854,6 +14011,9 @@ function createEngine(imports) {
13854
14011
  ConfigStringRegistry,
13855
14012
  Cvar,
13856
14013
  CvarRegistry,
14014
+ DemoAnalyzer,
14015
+ DemoCameraMode,
14016
+ DemoEventType,
13857
14017
  DemoPlaybackController,
13858
14018
  DemoReader,
13859
14019
  DemoRecorder,