mirror of
https://github.com/demostf/demo.js
synced 2026-06-03 16:44:12 +02:00
Summary
This commit is contained in:
parent
011625257d
commit
27ebb577df
5 changed files with 112 additions and 15 deletions
32
.gitignore
vendored
Normal file
32
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
# Created by .ignore support plugin (hsz.mobi)
|
||||||
|
|
||||||
|
### Node template
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directory
|
||||||
|
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
|
||||||
|
node_modules
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -29,7 +29,7 @@ Packet.prototype.parse = function () {
|
||||||
var type = this.stream.readBits(6);
|
var type = this.stream.readBits(6);
|
||||||
if (Packet.parsers[type]) {
|
if (Packet.parsers[type]) {
|
||||||
var packet = Packet.parsers[type](this.stream);
|
var packet = Packet.parsers[type](this.stream);
|
||||||
console.log(packet);
|
//console.log(packet);
|
||||||
packets.push(packet);
|
packets.push(packet);
|
||||||
} else {
|
} else {
|
||||||
throw 'Unknown packet type ' + type;
|
throw 'Unknown packet type ' + type;
|
||||||
|
|
|
||||||
75
parser.js
75
parser.js
|
|
@ -5,6 +5,12 @@ var BitStream = require('bit-buffer').BitStream;
|
||||||
|
|
||||||
var Parser = function (steam) {
|
var Parser = function (steam) {
|
||||||
this.stream = steam;
|
this.stream = steam;
|
||||||
|
this.state = {
|
||||||
|
chat : [],
|
||||||
|
users : {},
|
||||||
|
deaths: [],
|
||||||
|
rounds: []
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
Parser.MessageType = {
|
Parser.MessageType = {
|
||||||
|
|
@ -34,12 +40,67 @@ Parser.prototype.readHeader = function () {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Parser.prototype.parseBody = function () {
|
||||||
|
var message, i;
|
||||||
|
while (message = this.readMessage()) {
|
||||||
|
if (message.parse) {
|
||||||
|
var packets = message.parse();
|
||||||
|
for (i = 0; i < packets.length; i++) {
|
||||||
|
var packet = packets[i];
|
||||||
|
if (!packet) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
switch (packet.packetType) {
|
||||||
|
case 'sayText2':
|
||||||
|
this.state.chat.push({
|
||||||
|
kind: packet.kind,
|
||||||
|
from: packet.from,
|
||||||
|
text: packet.text
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'stringTable':
|
||||||
|
if (packet.tables.userinfo) {
|
||||||
|
for (var j = 0; j < packet.tables.userinfo.length; j++) {
|
||||||
|
if (packet.tables.userinfo[j].extraData) {
|
||||||
|
this.state.users[packet.tables.userinfo[j].text] = packet.tables.userinfo[j].extraData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'gameEvent':
|
||||||
|
switch (packet.event.name) {
|
||||||
|
case 'player_death':
|
||||||
|
// todo get player names, not same id as the name string table
|
||||||
|
var assister = packet.event.values.assister < 32 ? packet.event.values.assister : null;
|
||||||
|
this.state.deaths.push({
|
||||||
|
killer : packet.event.values.attacker,
|
||||||
|
assister: assister,
|
||||||
|
victim : packet.event.values.userid,
|
||||||
|
weapon : packet.event.values.weapon
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'teamplay_round_win':
|
||||||
|
if (packet.event.values.winreason !== 6) {// 6 = timelimit
|
||||||
|
this.state.rounds.push({
|
||||||
|
winner: packet.event.values.team === 2 ? 'red' : 'blue',
|
||||||
|
length: packet.event.values.round_time
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.state;
|
||||||
|
};
|
||||||
|
|
||||||
Parser.prototype.readMessage = function () {
|
Parser.prototype.readMessage = function () {
|
||||||
console.log();
|
//console.log();
|
||||||
console.log('start message');
|
//console.log('start message');
|
||||||
console.log(this.stream.byteIndex);
|
//console.log(this.stream.byteIndex);
|
||||||
var type = this.stream.readBits(8);
|
var type = this.stream.readBits(8);
|
||||||
console.log(type);
|
//console.log(type);
|
||||||
if (type === Parser.MessageType.Stop) {
|
if (type === Parser.MessageType.Stop) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
@ -61,7 +122,7 @@ Parser.prototype.readMessage = function () {
|
||||||
}
|
}
|
||||||
|
|
||||||
length = this.stream.readInt32();
|
length = this.stream.readInt32();
|
||||||
console.log('message length: ' + length + ' byte');
|
//console.log('message length: ' + length + ' byte');
|
||||||
start = this.stream.byteIndex;
|
start = this.stream.byteIndex;
|
||||||
buffer = this.stream.buffer.slice(start, start + length);
|
buffer = this.stream.buffer.slice(start, start + length);
|
||||||
this.stream.byteIndex += length;
|
this.stream.byteIndex += length;
|
||||||
|
|
@ -77,13 +138,13 @@ Parser.prototype.readMessage = function () {
|
||||||
case Parser.MessageType.UserCmd:
|
case Parser.MessageType.UserCmd:
|
||||||
return true;
|
return true;
|
||||||
case Parser.MessageType.DataTables:
|
case Parser.MessageType.DataTables:
|
||||||
console.log('datatable');
|
//console.log('datatable');
|
||||||
return true;
|
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:
|
||||||
return true;
|
return true;
|
||||||
//throw 'Unknown message type: ' + type;
|
//throw 'Unknown message type: ' + type;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,10 @@ StringTable.prototype.parse = function () {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//console.log(tables);
|
//console.log(tables);
|
||||||
return tables;
|
return [{
|
||||||
|
packetType: 'stringTable',
|
||||||
|
tables : tables
|
||||||
|
}];
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = StringTable;
|
module.exports = StringTable;
|
||||||
|
|
|
||||||
13
test.js
13
test.js
|
|
@ -7,10 +7,11 @@ fs.readFile("snakewater.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;
|
//var message;
|
||||||
while (message = parser.readMessage()) {
|
console.log(parser.parseBody());
|
||||||
if (message.parse) {
|
//while (message = parser.readMessage()) {
|
||||||
message.parse();
|
// if (message.parse) {
|
||||||
}
|
// message.parse();
|
||||||
}
|
// }
|
||||||
|
//}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue