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.
- package/package.json +1 -1
- package/packages/cgame/dist/index.cjs +1 -1
- package/packages/cgame/dist/index.cjs.map +1 -1
- package/packages/cgame/dist/index.js +1 -1
- package/packages/cgame/dist/index.js.map +1 -1
- package/packages/client/dist/browser/index.global.js +12 -12
- package/packages/client/dist/browser/index.global.js.map +1 -1
- package/packages/client/dist/cjs/index.cjs +133 -2
- package/packages/client/dist/cjs/index.cjs.map +1 -1
- package/packages/client/dist/esm/index.js +133 -2
- package/packages/client/dist/esm/index.js.map +1 -1
- package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/browser/index.global.js +9 -9
- package/packages/engine/dist/browser/index.global.js.map +1 -1
- package/packages/engine/dist/cjs/index.cjs +162 -2
- package/packages/engine/dist/cjs/index.cjs.map +1 -1
- package/packages/engine/dist/esm/index.js +159 -2
- package/packages/engine/dist/esm/index.js.map +1 -1
- package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/types/commands.d.ts +7 -0
- package/packages/engine/dist/types/commands.d.ts.map +1 -1
- package/packages/engine/dist/types/demo/analyzer.d.ts +6 -1
- package/packages/engine/dist/types/demo/analyzer.d.ts.map +1 -1
- package/packages/engine/dist/types/demo/camera.d.ts +17 -0
- package/packages/engine/dist/types/demo/camera.d.ts.map +1 -0
- package/packages/engine/dist/types/demo/playback.d.ts +13 -1
- package/packages/engine/dist/types/demo/playback.d.ts.map +1 -1
- package/packages/engine/dist/types/host.d.ts.map +1 -1
- package/packages/engine/dist/types/index.d.ts +5 -0
- package/packages/engine/dist/types/index.d.ts.map +1 -1
- 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,
|