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

set local player viewangles from message metadata

This commit is contained in:
Robin Appelman 2017-12-12 22:19:27 +01:00
commit f92070d7ca
4 changed files with 20 additions and 10 deletions

View file

@ -3,7 +3,7 @@ const fs = require('fs');
const argv = require('minimist')(process.argv.slice(2), {boolean: true}); const argv = require('minimist')(process.argv.slice(2), {boolean: true});
if (argv._.length !== 1) { if (argv._.length !== 1) {
console.log('Usage: "node analyse [--strings] [--dump] [--head] [--event-list] [--create-event-definitions] FILE"'); console.log('Usage: "node analyse [--strings] [--slow] [--dump] [--head] [--event-list] [--create-event-definitions] FILE"');
process.exit(1); process.exit(1);
} }
@ -15,7 +15,7 @@ const echo = function (data) {
fs.readFile(argv._[0], function (err, data) { fs.readFile(argv._[0], function (err, data) {
if (err) throw err; if (err) throw err;
const demo = Demo.fromNodeBuffer(data); const demo = Demo.fromNodeBuffer(data);
const analyser = demo.getAnalyser(true); const analyser = demo.getAnalyser(!argv.slow);
const head = analyser.getHeader(); const head = analyser.getHeader();
if (argv.head) { if (argv.head) {
echo(head); echo(head);

View file

@ -1,6 +1,7 @@
import {EventEmitter} from 'events'; import {EventEmitter} from 'events';
import {Header} from './Data/Header'; import {Header} from './Data/Header';
import {Match} from './Data/Match'; import {Match} from './Data/Match';
import {MessageType} from './Data/Message';
import {Packet} from './Data/Packet'; import {Packet} from './Data/Packet';
import {Parser} from './Parser'; import {Parser} from './Parser';
@ -31,9 +32,13 @@ export class Analyser extends EventEmitter {
} }
public * getPackets(): IterableIterator<Packet> { public * getPackets(): IterableIterator<Packet> {
for (const packet of this.parser.getPackets()) { for (const message of this.parser.getMessages()) {
this.match.handlePacket(packet); if (message.type === MessageType.Packet) {
for (const packet of message.packets) {
this.match.handlePacket(packet, message);
yield packet; yield packet;
} }
} }
}
}
} }

View file

@ -4,6 +4,7 @@ import {handleSayText2} from '../PacketHandler/SayText2';
import {Building} from './Building'; import {Building} from './Building';
import {Chat} from './Chat'; import {Chat} from './Chat';
import {Death} from './Death'; import {Death} from './Death';
import {PacketMessage} from './Message';
import {Packet} from './Packet'; import {Packet} from './Packet';
import {EntityId, PacketEntity} from './PacketEntity'; import {EntityId, PacketEntity} from './PacketEntity';
import {ParserState} from './ParserState'; import {ParserState} from './ParserState';
@ -67,10 +68,10 @@ export class Match {
}; };
} }
public handlePacket(packet: Packet) { public handlePacket(packet: Packet, message: PacketMessage) {
switch (packet.packetType) { switch (packet.packetType) {
case 'packetEntities': case 'packetEntities':
handlePacketEntities(packet, this); handlePacketEntities(packet, this, message);
break; break;
case 'netTick': case 'netTick':
if (this.startTick === 0) { if (this.startTick === 0) {

View file

@ -1,5 +1,6 @@
import {Building, Dispenser, Sentry, Teleporter} from '../Data/Building'; import {Building, Dispenser, Sentry, Teleporter} from '../Data/Building';
import {Match} from '../Data/Match'; import {Match} from '../Data/Match';
import {PacketMessage} from '../Data/Message';
import {PacketEntitiesPacket} from '../Data/Packet'; import {PacketEntitiesPacket} from '../Data/Packet';
import {PacketEntity, PVS} from '../Data/PacketEntity'; import {PacketEntity, PVS} from '../Data/PacketEntity';
import {ParserState} from '../Data/ParserState'; import {ParserState} from '../Data/ParserState';
@ -9,9 +10,9 @@ import {TeamNumber} from '../Data/Team';
import {Vector} from '../Data/Vector'; import {Vector} from '../Data/Vector';
import {CWeaponMedigun, Weapon} from '../Data/Weapon'; import {CWeaponMedigun, Weapon} from '../Data/Weapon';
export function handlePacketEntities(packet: PacketEntitiesPacket, match: Match) { export function handlePacketEntities(packet: PacketEntitiesPacket, match: Match, message: PacketMessage) {
for (const entity of packet.entities) { for (const entity of packet.entities) {
handleEntity(entity, match); handleEntity(entity, match, message);
} }
} }
@ -33,7 +34,7 @@ function saveEntity(packetEntity: PacketEntity, state: ParserState) {
state.entityClasses.set(packetEntity.entityIndex, packetEntity.serverClass); state.entityClasses.set(packetEntity.entityIndex, packetEntity.serverClass);
} }
function handleEntity(entity: PacketEntity, match: Match) { function handleEntity(entity: PacketEntity, match: Match, message: PacketMessage) {
for (const prop of entity.props) { for (const prop of entity.props) {
if (prop.definition.ownerTableName === 'DT_AttributeContainer' && prop.definition.name === 'm_hOuter') { if (prop.definition.ownerTableName === 'DT_AttributeContainer' && prop.definition.name === 'm_hOuter') {
if (!match.outerMap.has(prop.value as number)) { if (!match.outerMap.has(prop.value as number)) {
@ -119,6 +120,9 @@ function handleEntity(entity: PacketEntity, match: Match) {
case 'DT_TFLocalPlayerExclusive.m_vecOrigin': case 'DT_TFLocalPlayerExclusive.m_vecOrigin':
player.position.x = (prop.value as Vector).x; player.position.x = (prop.value as Vector).x;
player.position.y = (prop.value as Vector).y; player.position.y = (prop.value as Vector).y;
// set the view angles for the local player since that prop isn't send
player.viewAngle = message.localViewAngles[0].y;
break; break;
case 'DT_TFNonLocalPlayerExclusive.m_vecOrigin': case 'DT_TFNonLocalPlayerExclusive.m_vecOrigin':
player.position.x = (prop.value as Vector).x; player.position.x = (prop.value as Vector).x;