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

datatables wip

This commit is contained in:
Robin Appelman 2015-01-25 19:11:32 +01:00
commit 9cb24b9a74
5 changed files with 101 additions and 65 deletions

15
datatable.js Normal file
View file

@ -0,0 +1,15 @@
var DataTable = function (type, tick, stream, length) {
this.type = type;
this.tick = tick;
this.stream = stream;
this.length = length;//length in bytes
};
DataTable.prototype.parse = function () {
//while (this.stream.byteIndex < this.length) {
//console.log(this.stream.readASCIIString());
//}
return [];
};
module.exports = DataTable;

View file

@ -1,5 +1,6 @@
var ParserGenerator = require('./parsergenerator'); var ParserGenerator = require('./parsergenerator');
var StringTable = require('./stringtable'); var StringTable = require('./stringtable');
var PacketStringTable = require('./packetstringtable');
function logBase2 (num) { function logBase2 (num) {
var result = 0; var result = 0;
@ -44,7 +45,6 @@ Packet.parseGameEvent = function (eventId, stream) {
return 'unknown'; return 'unknown';
} }
var eventDescription = this.gameEventMap[eventId]; var eventDescription = this.gameEventMap[eventId];
//console.log(eventDescription);
var values = {}; var values = {};
for (var i = 0; i < eventDescription.entries.length; i++) { for (var i = 0; i < eventDescription.entries.length; i++) {
var entry = eventDescription.entries[i]; var entry = eventDescription.entries[i];
@ -72,7 +72,9 @@ Packet.getGameEventValue = function (stream, entry) {
case 6: case 6:
return !!stream.readBits(1); return !!stream.readBits(1);
case 7: case 7:
return 'local value' return 'local value';
default:
throw 'invalid game event type';
} }
}; };
@ -127,7 +129,7 @@ Packet.parsers = {
// https://coldemoplayer.googlecode.com/svn/branches/2.0/code/plugins/CDP.Source/Messages/SvcCreateStringTable.cs // https://coldemoplayer.googlecode.com/svn/branches/2.0/code/plugins/CDP.Source/Messages/SvcCreateStringTable.cs
var name = stream.readASCIIString(); var name = stream.readASCIIString();
var maxEntries = stream.readBits(16); var maxEntries = stream.readBits(16);
var bits = Math.log(maxEntries) / Math.LN2; var bits = logBase2(maxEntries);
var numEntries = stream.readBits(bits + 1); var numEntries = stream.readBits(bits + 1);
var length = stream.readBits(20); var length = stream.readBits(20);
var userDataFixedSize = !!stream.readBits(1); var userDataFixedSize = !!stream.readBits(1);
@ -140,12 +142,32 @@ Packet.parsers = {
var stringTable = new PacketStringTable(name, maxEntries, bits, userDataFixedSize, userSize || -1, userDataBits || -1, numEntries); var stringTable = new PacketStringTable(name, maxEntries, bits, userDataFixedSize, userSize || -1, userDataBits || -1, numEntries);
stringTable.parse(stream); stringTable.parse(stream);
//console.log(stringTable); //console.log(stringTable);
//console.log(stream.readBits(6));
//console.log(stream.readASCIIString());
//maxEntries = stream.readBits(16);
//console.log(maxEntries);
//bits = logBase2(maxEntries);
//numEntries = stream.readBits(bits + 1);
//console.log('entries: ' + numEntries);
//console.log(stream.readBits(175));
//for (var i = 0; i < numEntries; i++) {
// console.log(stream.readBits(6));
// console.log(stream.readASCIIString());
//}
//console.log(stream.readASCIIString());
//console.log(stream.readASCIIString());
//console.log(); //console.log();
//console.log(length); //console.log(length);
//console.log(end - stream._index); //console.log(end - stream._index);
//console.log(); //console.log();
//throw false; //throw false;
//if((end/8)> 50515){
// console.log(stringTable);
// throw 'found';
//}
//throw false;
stream._index = end; stream._index = end;
return { return {
packetType: 'createStringTable', packetType: 'createStringTable',
@ -195,8 +217,8 @@ Packet.parsers = {
strings: strings strings: strings
} }
}, },
14: ParserGenerator.make('voiceInit', 'coded{s}quality{8}'), 14: ParserGenerator.make('voiceInit', 'codec{s}quality{8}'),
15: ParserGenerator.make('voiceData', 'client{8}proximity{8}length{16}data{$length}'), 15: ParserGenerator.make('voiceData', 'client{8}proximity{8}length{16}_{$length}'),
17: function (stream) { 17: function (stream) {
var reliable = !!stream.readBits(1); var reliable = !!stream.readBits(1);
var num = (reliable) ? 1 : stream.readBits(8); var num = (reliable) ? 1 : stream.readBits(8);
@ -269,6 +291,8 @@ Packet.parsers = {
type: type type: type
} }
} }
console.log(result);
console.log(((pos + length) - stream._index) + ' bits left');
stream._index = pos + length; stream._index = pos + length;
return result; return result;
}, },
@ -285,6 +309,7 @@ Packet.parsers = {
} }
}, },
26: function (stream) { 26: function (stream) {
// todo
var maxEntries = stream.readBits(11); var maxEntries = stream.readBits(11);
var isDelta = !!stream.readBits(1); var isDelta = !!stream.readBits(1);
if (isDelta) { if (isDelta) {
@ -412,54 +437,4 @@ var UserMessageType = {
HapMeleeContact: 57 HapMeleeContact: 57
}; };
var PacketStringTable = function (name, maxEntries, entryBits, userDataFixedSize, userDataSize, userDataSizeBits, numEntries) {
this.name = name;
this.maxEntries = maxEntries;
this.entryBits = entryBits;
this.userDataFixedSize = userDataFixedSize;
this.userDataSize = userDataSize;
this.userDataSizeBits = userDataSizeBits;
this.numEntries = numEntries;
this.id = PacketStringTable.tables.length;
this.strings = [];
PacketStringTable.tables.push(this);
};
PacketStringTable.prototype.parse = function (stream) {
var entryIndex, lastEntry = -1;
for (var i = 0; i < this.numEntries; i++) {
entryIndex = lastEntry + 1;
this.strings.push(stream.readASCIIString());
//if (!stream.readBits(1)) {
// entryIndex = stream.readBits(this.entryBits);
//}
//lastEntry = entryIndex;
//if (entryIndex < 0 || entryIndex >= this.maxEntries) {
// throw 'invalid index';
//}
//var string = '';
//if (stream.readBits(1)) {
// if (stream.readBits(1)) {
// throw 'substr not implented';
// } else {
// string = stream.readASCIIString();
// }
//}
if (stream.readBits(1)) { //user data
if (this.userDataFixedSize) {
var userData = stream.readBits(this.userDataSizeBits)
} else {
var bits = stream.readBits(14);
userData = stream.readBits(bits);
}
console.log('userdata: ' + userData);
}
//this.strings.push(string);
}
};
PacketStringTable.tables = [];
module.exports = Packet; module.exports = Packet;

51
packetstringtable.js Normal file
View file

@ -0,0 +1,51 @@
var PacketStringTable = function (name, maxEntries, entryBits, userDataFixedSize, userDataSize, userDataSizeBits, numEntries) {
this.name = name;
this.maxEntries = maxEntries;
this.entryBits = entryBits;
this.userDataFixedSize = userDataFixedSize;
this.userDataSize = userDataSize;
this.userDataSizeBits = userDataSizeBits;
this.numEntries = numEntries;
this.id = PacketStringTable.tables.length;
this.strings = [];
PacketStringTable.tables.push(this);
};
PacketStringTable.prototype.parse = function (stream) {
var entryIndex, lastEntry = -1;
for (var i = 0; i < this.numEntries; i++) {
entryIndex = lastEntry + 1;
this.strings.push(stream.readASCIIString());
//if (!stream.readBits(1)) {
// entryIndex = stream.readBits(this.entryBits);
//}
//lastEntry = entryIndex;
//if (entryIndex < 0 || entryIndex >= this.maxEntries) {
// throw 'invalid index';
//}
//var string = '';
//if (stream.readBits(1)) {
// if (stream.readBits(1)) {
// throw 'substr not implented';
// } else {
// string = stream.readASCIIString();
// }
//}
if (stream.readBits(1)) { //user data
if (this.userDataFixedSize) {
var userData = stream.readBits(this.userDataSizeBits)
} else {
var bits = stream.readBits(14);
userData = stream.readBits(bits);
}
console.log('userdata: ' + userData);
}
//this.strings.push(string);
}
};
PacketStringTable.tables = [];
module.exports = PacketStringTable;

View file

@ -1,6 +1,7 @@
var Packet = require('./packet'); var Packet = require('./packet');
var ConsoleCmd = require('./consolecmd'); var ConsoleCmd = require('./consolecmd');
var StringTable = require('./stringtable'); var StringTable = require('./stringtable');
var DataTable = require('./datatable');
var BitStream = require('bit-buffer').BitStream; var BitStream = require('bit-buffer').BitStream;
var Parser = function (steam) { var Parser = function (steam) {
@ -136,10 +137,10 @@ Parser.prototype.readMessage = function () {
case Parser.MessageType.ConsoleCmd: case Parser.MessageType.ConsoleCmd:
return new ConsoleCmd(type, tick, data, length); return new ConsoleCmd(type, tick, data, length);
case Parser.MessageType.UserCmd: case Parser.MessageType.UserCmd:
console.log('usercmd');
return true; return true;
case Parser.MessageType.DataTables: case Parser.MessageType.DataTables:
//console.log('datatable'); return new DataTable(type, tick, data, length);
return true;
case Parser.MessageType.StringTables: case Parser.MessageType.StringTables:
return new StringTable(type, tick, data, length); return new StringTable(type, tick, data, length);
default: default:

10
test.js
View file

@ -7,12 +7,6 @@ fs.readFile("gully.dem", function (err, data) {
var parser = demo.getParser(); var parser = demo.getParser();
var head = parser.readHeader(); var head = parser.readHeader();
//console.log(parser.readHeader()); //console.log(parser.readHeader());
//var message; parser.parseBody()
//parser.parseBody() //console.log(parser.parseBody());
console.log(parser.parseBody());
//while (message = parser.readMessage()) {
// if (message.parse) {
// message.parse();
// }
//}
}); });