1
0
Fork 0
mirror of https://github.com/demostf/demo.js synced 2026-06-04 00:54:14 +02:00

add parsing of serverclasses from datatable

This commit is contained in:
Robin Appelman 2016-12-17 17:19:43 +01:00
commit a619cd1404
2 changed files with 50 additions and 1 deletions

View file

@ -11,6 +11,7 @@ DataTableParser.prototype.parse = function () {
// https://github.com/LestaD/SourceEngine2007/blob/43a5c90a5ada1e69ca044595383be67f40b33c61/src_main/engine/dt_recv_eng.cpp#L310 // https://github.com/LestaD/SourceEngine2007/blob/43a5c90a5ada1e69ca044595383be67f40b33c61/src_main/engine/dt_recv_eng.cpp#L310
// https://github.com/PazerOP/DemoLib/blob/master/DemoLib/Commands/DemoDataTablesCommand.cs // https://github.com/PazerOP/DemoLib/blob/master/DemoLib/Commands/DemoDataTablesCommand.cs
var tables = []; var tables = [];
var i, j;
while (this.stream.readBoolean()) { while (this.stream.readBoolean()) {
var needsDecoder = this.stream.readBoolean(); var needsDecoder = this.stream.readBoolean();
var tableName = this.stream.readASCIIString(); var tableName = this.stream.readASCIIString();
@ -19,7 +20,7 @@ DataTableParser.prototype.parse = function () {
// get props metadata // get props metadata
var arrayElementProp; var arrayElementProp;
for (var i = 0; i < numProps; i++) { for (i = 0; i < numProps; i++) {
var propType = this.stream.readBits(5); var propType = this.stream.readBits(5);
var propName = this.stream.readASCIIString(); var propName = this.stream.readASCIIString();
var nFlagsBits = 16; // might be 11 (old?), 13 (new?), 16(networked) or 17(??) var nFlagsBits = 16; // might be 11 (old?), 13 (new?), 16(networked) or 17(??)
@ -66,6 +67,37 @@ DataTableParser.prototype.parse = function () {
tables.push(table); tables.push(table);
} }
this.match.sendTables = tables; this.match.sendTables = tables;
// link referenced tables
for (i = 0; i < tables.length; i++) {
for (j = 0; j < tables[i].props.length; j++) {
if (tables[i].props[j].type === SendProp.types.DPT_DataTable) {
tables[i].props[j].table = this.match.getSendTable(tables[i].props[j].excludeDTName);
tables[i].props[j].excludeDTName = null;
}
}
}
var serverClasses = this.stream.readUint16(); // short
if (serverClasses <= 0) {
throw "expected one or more serverclasses";
}
for (i = 0; i < serverClasses; i++) {
var classId = this.stream.readUint16();
if (classId > serverClasses) {
throw "invalid class id";
}
var className = this.stream.readASCIIString();
var dataTable = this.stream.readASCIIString();
this.match.serverClasses.push(new ServerClass(classId, className, dataTable));
}
var bitsLeft = (this.length * 8) - this.stream._index;
if (bitsLeft > 7) {
throw "unexpected remaining data in datatable (" + bitsLeft + " bits)";
}
return tables; return tables;
}; };
@ -143,6 +175,12 @@ SendProp.formatFlags = function (flags) {
return names; return names;
}; };
var ServerClass = function (id, name, dataTable) {
this.id = id;
this.name = name;
this.dataTable = dataTable;
};
function recvClassInfos(stream, needsDecoder) { function recvClassInfos(stream, needsDecoder) {
} }

View file

@ -8,6 +8,17 @@ var Match = function () {
this.intervalPerTick = 0; this.intervalPerTick = 0;
this.entities = []; this.entities = [];
this.stringTables = []; this.stringTables = [];
this.sendTables = [];
this.serverClasses = [];
};
Match.prototype.getSendTable = function (name) {
for (var i = 0; i < this.sendTables.length; i++) {
if (this.sendTables[i].name === name) {
return this.sendTables[i];
}
}
return null;
}; };
Match.prototype.getState = function () { Match.prototype.getState = function () {