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

first step for location information of pov demos

This commit is contained in:
Robin Appelman 2016-04-11 18:57:02 +02:00
commit 2d26dfdfb5
4 changed files with 69 additions and 8 deletions

View file

@ -1,6 +1,6 @@
var ParserGenerator = require('../../parsergenerator'); var ParserGenerator = require('../../parsergenerator');
var baseParser = ParserGenerator.make('entityMessage', 'index{11}id{9}length{11}data{$length}'); var baseParser = ParserGenerator.make('entityMessage', 'index{11}classId{9}length{11}data{$length}');
module.exports = function (stream) { // 24: entityMessage module.exports = function (stream) { // 24: entityMessage
return baseParser(stream); //todo parse data further? return baseParser(stream); //todo parse data further?

View file

@ -5,11 +5,12 @@ var ParserGenerator = require('./parsergenerator');
// https://github.com/stgn/netdecode/blob/master/Packet.cs // https://github.com/stgn/netdecode/blob/master/Packet.cs
// https://github.com/LestaD/SourceEngine2007/blob/master/src_main/common/netmessages.cpp // https://github.com/LestaD/SourceEngine2007/blob/master/src_main/common/netmessages.cpp
var Packet = function (type, tick, stream, length) { var Packet = function (type, tick, stream, length, viewOrigin) {
this.type = type; this.type = type;
this.tick = tick; this.tick = tick;
this.stream = stream; this.stream = stream;
this.length = length;//length in bytes this.length = length;//length in bytes
this.viewOrigin = viewOrigin;
}; };
Packet.gameEventMap = {}; Packet.gameEventMap = {};
@ -31,6 +32,9 @@ 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].call(this, this.stream, Packet.gameEventMap, entities); var packet = Packet.parsers[type].call(this, this.stream, Packet.gameEventMap, entities);
if (packet) {
packet.viewOrigin = this.viewOrigin;
}
//console.log(packet); //console.log(packet);
packets.push(packet); packets.push(packet);
} else { } else {

View file

@ -4,6 +4,7 @@ var State = require('./state');
var ConsoleCmd = require('./consolecmd'); var ConsoleCmd = require('./consolecmd');
var StringTable = require('./stringtable'); var StringTable = require('./stringtable');
var DataTable = require('./datatable'); var DataTable = require('./datatable');
var UserCmd = require('./usercmd');
var BitStream = require('bit-buffer').BitStream; var BitStream = require('bit-buffer').BitStream;
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
@ -61,18 +62,17 @@ Parser.prototype.parseBody = function () {
return this.state.get(); return this.state.get();
}; };
Parser.prototype.parseMessage = function (buffer, type, tick, length) { Parser.prototype.parseMessage = function (buffer, type, tick, length, viewOrigin) {
var data = new BitStream(buffer); var data = new BitStream(buffer);
switch (type) { switch (type) {
case Parser.MessageType.Sigon: case Parser.MessageType.Sigon:
case Parser.MessageType.Packet: case Parser.MessageType.Packet:
return new Packet(type, tick, data, length); return new Packet(type, tick, data, length, viewOrigin);
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 new UserCmd(type, tick, data, length, this.viewOrigin, this.viewAngles);
return true;
case Parser.MessageType.DataTables: case Parser.MessageType.DataTables:
return new DataTable(type, tick, data, length); return new DataTable(type, tick, data, length);
case Parser.MessageType.StringTables: case Parser.MessageType.StringTables:
@ -102,10 +102,28 @@ Parser.prototype.readMessage = function (stream) {
var tick = stream.readInt32(); var tick = stream.readInt32();
var start, length, buffer; var start, length, buffer;
var viewOrigin = [];
var viewAngles = [];
switch (type) { switch (type) {
case Parser.MessageType.Sigon: case Parser.MessageType.Sigon:
case Parser.MessageType.Packet: case Parser.MessageType.Packet:
stream.byteIndex += 0x54; // command/sequence info this.stream.readInt32(); // flags
for (var j = 0; j < 2; j++) {
viewOrigin[j] = [];
viewAngles[j] = [];
for (var i = 0; i < 3; i++) {
viewOrigin[j][i] = this.stream.readInt32();
}
for (i = 0; i < 3; i++) {
viewAngles[j][i] = this.stream.readInt32();
}
for (i = 0; i < 3; i++) {
this.stream.readInt32(); // local viewAngles
}
}
this.stream.readInt32(); // sequence in
this.stream.readInt32(); // sequence out
break; break;
case Parser.MessageType.UserCmd: case Parser.MessageType.UserCmd:
stream.byteIndex += 0x04; // unknown / outgoing sequence stream.byteIndex += 0x04; // unknown / outgoing sequence
@ -120,7 +138,7 @@ Parser.prototype.readMessage = function (stream) {
start = stream.byteIndex; start = stream.byteIndex;
buffer = stream.buffer.slice(start, start + length); buffer = stream.buffer.slice(start, start + length);
stream.byteIndex += length; stream.byteIndex += length;
return this.parseMessage(buffer, type, tick, length); return this.parseMessage(buffer, type, tick, length, viewOrigin);
}; };
module.exports = Parser; module.exports = Parser;

39
usercmd.js Normal file
View file

@ -0,0 +1,39 @@
var UserCMD = function (type, tick, stream, length, viewOrigin, viewAngles) {
this.type = type;
this.tick = tick;
this.stream = stream;
this.length = length;//length in bytes
this.viewOrigin = viewOrigin;
this.viewAngles = viewAngles;
};
UserCMD.prototype.parse = function () {
return [];
var divSize = Math.floor((this.length + 2) / 4);
var byteShift = new Array(3);
var lastByte = this.stream.readBits(8);
var TempUCMD = 0;
for (var i = 1; i < divSize; i++) {
var byte = this.stream.readBits(8);
if (i <= 4) {
byteShift[0] = lastByte >> i;
byteShift[1] = byte << 32 - i;
} else {
byteShift[0] = lastByte >> 9;
byteShift[1] = byte << 32 - i;
}
byteShift[2] = byteShift[0] | byteShift[0];
if (i == divSize - 1) {
if (byteShift[2] > 0 && byteShift[2] < 1321100) {
TempUCMD = byteShift[2];
} else {
TempUCMD = null;
}
}
lastByte = byte;
}
// console.log('move', this.tick, this.viewOrigin[0][0], this.viewOrigin[0][1], this.viewAngles[0][0], this.viewAngles[0][1], TempUCMD);
return [];
};
module.exports = UserCMD;