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
@@ -88,6 +88,9 @@ var Command = class {
88
88
  var CommandRegistry = class {
89
89
  constructor() {
90
90
  this.commands = /* @__PURE__ */ new Map();
91
+ this.history = [];
92
+ this.historyLimit = 64;
93
+ this.autocompleteProviders = [];
91
94
  }
92
95
  register(name, callback, description) {
93
96
  const command = new Command(name, callback, description);
@@ -97,10 +100,23 @@ var CommandRegistry = class {
97
100
  registerCommand(name, callback) {
98
101
  this.register(name, callback);
99
102
  }
103
+ registerAutocompleteProvider(provider) {
104
+ this.autocompleteProviders.push(provider);
105
+ }
100
106
  get(name) {
101
107
  return this.commands.get(name);
102
108
  }
103
109
  execute(commandString) {
110
+ const trimmed = commandString.trim();
111
+ if (trimmed.length === 0) {
112
+ return false;
113
+ }
114
+ if (this.history.length === 0 || this.history[this.history.length - 1] !== trimmed) {
115
+ this.history.push(trimmed);
116
+ if (this.history.length > this.historyLimit) {
117
+ this.history.shift();
118
+ }
119
+ }
104
120
  const parts = this.tokenize(commandString);
105
121
  if (parts.length === 0) {
106
122
  return false;
@@ -118,6 +134,26 @@ var CommandRegistry = class {
118
134
  executeCommand(cmd) {
119
135
  this.execute(cmd);
120
136
  }
137
+ getHistory() {
138
+ return [...this.history];
139
+ }
140
+ getSuggestions(prefix) {
141
+ const suggestions = /* @__PURE__ */ new Set();
142
+ for (const name of this.commands.keys()) {
143
+ if (name.startsWith(prefix)) {
144
+ suggestions.add(name);
145
+ }
146
+ }
147
+ for (const provider of this.autocompleteProviders) {
148
+ const providerSuggestions = provider();
149
+ for (const suggestion of providerSuggestions) {
150
+ if (suggestion.startsWith(prefix)) {
151
+ suggestions.add(suggestion);
152
+ }
153
+ }
154
+ }
155
+ return Array.from(suggestions).sort();
156
+ }
121
157
  tokenize(text) {
122
158
  const args = [];
123
159
  let currentArg = "";
@@ -1415,6 +1451,9 @@ var EngineHost = class {
1415
1451
  },
1416
1452
  { ...options.loop, startTimeMs: this.startTimeMs }
1417
1453
  );
1454
+ this.commands.registerAutocompleteProvider(() => {
1455
+ return this.cvars.list().map((cvar) => cvar.name);
1456
+ });
1418
1457
  }
1419
1458
  start() {
1420
1459
  if (this.started) return;
@@ -12622,6 +12661,18 @@ var NetworkMessageParser = class _NetworkMessageParser {
12622
12661
  }
12623
12662
  };
12624
12663
 
12664
+ // src/demo/analysis.ts
12665
+ var DemoEventType = /* @__PURE__ */ ((DemoEventType2) => {
12666
+ DemoEventType2[DemoEventType2["WeaponFire"] = 0] = "WeaponFire";
12667
+ DemoEventType2[DemoEventType2["DamageDealt"] = 1] = "DamageDealt";
12668
+ DemoEventType2[DemoEventType2["DamageReceived"] = 2] = "DamageReceived";
12669
+ DemoEventType2[DemoEventType2["Pickup"] = 3] = "Pickup";
12670
+ DemoEventType2[DemoEventType2["Death"] = 4] = "Death";
12671
+ DemoEventType2[DemoEventType2["Spawn"] = 5] = "Spawn";
12672
+ DemoEventType2[DemoEventType2["PlayerInfo"] = 6] = "PlayerInfo";
12673
+ return DemoEventType2;
12674
+ })(DemoEventType || {});
12675
+
12625
12676
  // src/demo/analyzer.ts
12626
12677
  var DemoAnalyzer = class {
12627
12678
  constructor(buffer) {
@@ -12640,6 +12691,8 @@ var DemoAnalyzer = class {
12640
12691
  this.playerStats = /* @__PURE__ */ new Map();
12641
12692
  // By playerNum
12642
12693
  this.weaponStats = /* @__PURE__ */ new Map();
12694
+ // By entity ID
12695
+ this.activeEntities = /* @__PURE__ */ new Set();
12643
12696
  this.buffer = buffer;
12644
12697
  }
12645
12698
  analyze() {
@@ -12675,9 +12728,28 @@ var DemoAnalyzer = class {
12675
12728
  onSpawnBaseline: (entity) => {
12676
12729
  },
12677
12730
  onFrame: (frame) => {
12731
+ const currentFrameEntities = /* @__PURE__ */ new Set();
12732
+ if (frame.packetEntities && frame.packetEntities.entities) {
12733
+ for (const ent of frame.packetEntities.entities) {
12734
+ currentFrameEntities.add(ent.number);
12735
+ if (!this.activeEntities.has(ent.number)) {
12736
+ this.recordEvent({
12737
+ type: 5 /* Spawn */,
12738
+ frame: currentFrameIndex,
12739
+ time: currentTime,
12740
+ entityId: ent.number,
12741
+ position: { x: ent.origin.x, y: ent.origin.y, z: ent.origin.z },
12742
+ description: `Entity ${ent.number} spawned`
12743
+ });
12744
+ }
12745
+ }
12746
+ }
12747
+ this.activeEntities = currentFrameEntities;
12748
+ if (frame.playerState && this.header) {
12749
+ }
12678
12750
  },
12679
12751
  onPrint: (level, msg) => {
12680
- if (msg.includes("died") || msg.includes("killed")) {
12752
+ if (msg.includes("died") || msg.includes("killed") || msg.includes("suicide")) {
12681
12753
  this.summary.totalDeaths++;
12682
12754
  this.recordEvent({
12683
12755
  type: 4 /* Death */,
@@ -12686,6 +12758,14 @@ var DemoAnalyzer = class {
12686
12758
  description: msg.trim()
12687
12759
  });
12688
12760
  }
12761
+ if (msg.startsWith("You got the ")) {
12762
+ this.recordEvent({
12763
+ type: 3 /* Pickup */,
12764
+ frame: currentFrameIndex,
12765
+ time: currentTime,
12766
+ description: msg.trim()
12767
+ });
12768
+ }
12689
12769
  },
12690
12770
  onCenterPrint: () => {
12691
12771
  },
@@ -12726,6 +12806,10 @@ var DemoAnalyzer = class {
12726
12806
  description: `Took ${ind.damage} damage`
12727
12807
  });
12728
12808
  this.summary.damageReceived += ind.damage;
12809
+ if (this.header) {
12810
+ const pStats = this.getOrCreatePlayerStats(this.header.playerNum);
12811
+ pStats.damageReceived += ind.damage;
12812
+ }
12729
12813
  }
12730
12814
  }
12731
12815
  };
@@ -12753,7 +12837,9 @@ var DemoAnalyzer = class {
12753
12837
  header: this.header,
12754
12838
  configStrings: this.configStrings,
12755
12839
  serverInfo: this.serverInfo,
12756
- statistics: this.statistics
12840
+ statistics: this.statistics,
12841
+ playerStats: this.playerStats,
12842
+ weaponStats: this.weaponStats
12757
12843
  };
12758
12844
  }
12759
12845
  handleWeaponFire(ent, weapon, frame, time) {
@@ -12767,6 +12853,8 @@ var DemoAnalyzer = class {
12767
12853
  });
12768
12854
  const count = this.summary.weaponUsage.get(weapon) || 0;
12769
12855
  this.summary.weaponUsage.set(weapon, count + 1);
12856
+ const wStats = this.getOrCreateWeaponStat(ent, weapon);
12857
+ wStats.shotsFired++;
12770
12858
  }
12771
12859
  recordEvent(event) {
12772
12860
  this.events.push(event);
@@ -12779,8 +12867,44 @@ var DemoAnalyzer = class {
12779
12867
  }
12780
12868
  }
12781
12869
  }
12870
+ getOrCreatePlayerStats(playerNum) {
12871
+ let stats = this.playerStats.get(playerNum);
12872
+ if (!stats) {
12873
+ stats = {
12874
+ kills: 0,
12875
+ deaths: 0,
12876
+ damageDealt: 0,
12877
+ damageReceived: 0,
12878
+ suicides: 0
12879
+ };
12880
+ this.playerStats.set(playerNum, stats);
12881
+ }
12882
+ return stats;
12883
+ }
12884
+ getOrCreateWeaponStat(entityId, weaponId) {
12885
+ let statsList = this.weaponStats.get(entityId);
12886
+ if (!statsList) {
12887
+ statsList = [];
12888
+ this.weaponStats.set(entityId, statsList);
12889
+ }
12890
+ let stat = statsList.find((s) => s.weaponId === weaponId);
12891
+ if (!stat) {
12892
+ stat = { weaponId, shotsFired: 0, hits: 0, kills: 0 };
12893
+ statsList.push(stat);
12894
+ }
12895
+ return stat;
12896
+ }
12782
12897
  };
12783
12898
 
12899
+ // src/demo/camera.ts
12900
+ var DemoCameraMode = /* @__PURE__ */ ((DemoCameraMode2) => {
12901
+ DemoCameraMode2[DemoCameraMode2["FirstPerson"] = 0] = "FirstPerson";
12902
+ DemoCameraMode2[DemoCameraMode2["ThirdPerson"] = 1] = "ThirdPerson";
12903
+ DemoCameraMode2[DemoCameraMode2["Free"] = 2] = "Free";
12904
+ DemoCameraMode2[DemoCameraMode2["Follow"] = 3] = "Follow";
12905
+ return DemoCameraMode2;
12906
+ })(DemoCameraMode || {});
12907
+
12784
12908
  // src/demo/playback.ts
12785
12909
  var PlaybackState = /* @__PURE__ */ ((PlaybackState2) => {
12786
12910
  PlaybackState2[PlaybackState2["Stopped"] = 0] = "Stopped";
@@ -12816,6 +12940,12 @@ var DemoPlaybackController = class {
12816
12940
  this.cachedConfigStrings = null;
12817
12941
  this.cachedServerInfo = null;
12818
12942
  this.cachedStatistics = null;
12943
+ this.cachedPlayerStats = null;
12944
+ this.cachedWeaponStats = null;
12945
+ // Camera State
12946
+ this.cameraMode = 0 /* FirstPerson */;
12947
+ this.thirdPersonDistance = 80;
12948
+ this.thirdPersonOffset = { x: 0, y: 0, z: 0 };
12819
12949
  }
12820
12950
  setHandler(handler) {
12821
12951
  this.handler = handler;
@@ -12838,6 +12968,8 @@ var DemoPlaybackController = class {
12838
12968
  this.cachedConfigStrings = null;
12839
12969
  this.cachedServerInfo = null;
12840
12970
  this.cachedStatistics = null;
12971
+ this.cachedPlayerStats = null;
12972
+ this.cachedWeaponStats = null;
12841
12973
  }
12842
12974
  play() {
12843
12975
  if (this.reader && this.state !== 1 /* Playing */) {
@@ -13189,6 +13321,14 @@ var DemoPlaybackController = class {
13189
13321
  this.ensureAnalysis();
13190
13322
  return this.cachedStatistics;
13191
13323
  }
13324
+ getPlayerStatistics(playerIndex) {
13325
+ this.ensureAnalysis();
13326
+ return this.cachedPlayerStats?.get(playerIndex) || null;
13327
+ }
13328
+ getWeaponStatistics(entityId) {
13329
+ this.ensureAnalysis();
13330
+ return this.cachedWeaponStats?.get(entityId) || null;
13331
+ }
13192
13332
  ensureAnalysis() {
13193
13333
  if (!this.cachedEvents && this.buffer) {
13194
13334
  const analyzer = new DemoAnalyzer(this.buffer);
@@ -13199,8 +13339,22 @@ var DemoPlaybackController = class {
13199
13339
  this.cachedConfigStrings = result.configStrings;
13200
13340
  this.cachedServerInfo = result.serverInfo;
13201
13341
  this.cachedStatistics = result.statistics;
13342
+ this.cachedPlayerStats = result.playerStats;
13343
+ this.cachedWeaponStats = result.weaponStats;
13202
13344
  }
13203
13345
  }
13346
+ setCameraMode(mode) {
13347
+ this.cameraMode = mode;
13348
+ }
13349
+ getCameraMode() {
13350
+ return this.cameraMode;
13351
+ }
13352
+ setThirdPersonDistance(distance) {
13353
+ this.thirdPersonDistance = distance;
13354
+ }
13355
+ setThirdPersonOffset(offset) {
13356
+ this.thirdPersonOffset = offset;
13357
+ }
13204
13358
  };
13205
13359
 
13206
13360
  // src/demo/recorder.ts
@@ -13650,6 +13804,9 @@ export {
13650
13804
  ConfigStringRegistry,
13651
13805
  Cvar,
13652
13806
  CvarRegistry,
13807
+ DemoAnalyzer,
13808
+ DemoCameraMode,
13809
+ DemoEventType,
13653
13810
  DemoPlaybackController,
13654
13811
  DemoReader,
13655
13812
  DemoRecorder,