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 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
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/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.tick = tick;
this.stream = stream;
this.length = length;//length in bytes
this.viewOrigin = viewOrigin;
};
Packet.gameEventMap = {};
@ -31,6 +32,9 @@ Packet.prototype.parse = function () {
var type = this.stream.readBits(6);
if (Packet.parsers[type]) {
var packet = Packet.parsers[type].call(this, this.stream, Packet.gameEventMap, entities);
if (packet) {
packet.viewOrigin = this.viewOrigin;
}
//console.log(packet);
packets.push(packet);
} else {

View file

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