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

dont mutate the match state when parsing datatables

This commit is contained in:
Robin Appelman 2017-02-14 22:26:21 +01:00
commit fc6d758a31
5 changed files with 55 additions and 26 deletions

View file

@ -14,6 +14,7 @@ import {handleSayText2} from "../PacketHandler/SayText2";
import {handleGameEvent} from "../PacketHandler/GameEvent"; import {handleGameEvent} from "../PacketHandler/GameEvent";
import {handlePacketEntities} from "../PacketHandler/PacketEntities"; import {handlePacketEntities} from "../PacketHandler/PacketEntities";
import {handleGameEventList} from "../PacketHandler/GameEventList"; import {handleGameEventList} from "../PacketHandler/GameEventList";
import {handleDataTable} from "../PacketHandler/DataTable";
export class Match { export class Match {
tick: number; tick: number;
@ -125,6 +126,9 @@ export class Match {
case 'sayText2': case 'sayText2':
handleSayText2(packet, this); handleSayText2(packet, this);
break; break;
case 'dataTable':
handleDataTable(packet, this);
break;
case 'stringTable': case 'stringTable':
handleStringTable(packet, this); handleStringTable(packet, this);
break; break;

View file

@ -2,12 +2,20 @@ import {StringTable} from "./StringTable";
import {Vector} from "./Vector"; import {Vector} from "./Vector";
import {GameEvent, GameEventDefinitionMap} from "./GameEvent"; import {GameEvent, GameEventDefinitionMap} from "./GameEvent";
import {PacketEntity} from "./PacketEntity"; import {PacketEntity} from "./PacketEntity";
import {SendTable} from "./SendTable";
import {ServerClass} from "./ServerClass";
export interface StringTablePacket { export interface StringTablePacket {
packetType: 'stringTable'; packetType: 'stringTable';
tables: StringTable[]; tables: StringTable[];
} }
export interface DataTablePacket {
packetType: 'dataTable';
tables: SendTable[];
serverClasses: ServerClass[];
}
export interface BSPDecalPacket { export interface BSPDecalPacket {
packetType: 'bspDecal'; packetType: 'bspDecal';
position: Vector; position: Vector;
@ -92,6 +100,7 @@ export type UserMessagePacket = SayText2Packet | TextMessagePacket | UnknownUser
export type Packet = BSPDecalPacket | export type Packet = BSPDecalPacket |
StringTablePacket | StringTablePacket |
DataTablePacket |
ClassInfoPacket | ClassInfoPacket |
EntityMessagePacket | EntityMessagePacket |
GameEventPacket | GameEventPacket |

View file

@ -0,0 +1,7 @@
import {DataTablePacket} from "../Data/Packet";
import {Match} from "../Data/Match";
export function handleDataTable(packet: DataTablePacket, match: Match) {
match.sendTables = packet.tables;
match.serverClasses = packet.serverClasses;
}

View file

@ -2,15 +2,16 @@ import {SendTable} from '../../Data/SendTable';
import {SendPropDefinition, SendPropFlag, SendPropType} from '../../Data/SendPropDefinition'; import {SendPropDefinition, SendPropFlag, SendPropType} from '../../Data/SendPropDefinition';
import {ServerClass} from '../../Data/ServerClass'; import {ServerClass} from '../../Data/ServerClass';
import {Parser} from './Parser'; import {Parser} from './Parser';
import {BitStream} from "bit-buffer"; import {DataTablePacket} from "../../Data/Packet";
export class DataTable extends Parser { export class DataTable extends Parser {
parse() { parse(): DataTablePacket[] {
// https://github.com/LestaD/SourceEngine2007/blob/43a5c90a5ada1e69ca044595383be67f40b33c61/src_main/engine/dt_common_eng.cpp#L356 // https://github.com/LestaD/SourceEngine2007/blob/43a5c90a5ada1e69ca044595383be67f40b33c61/src_main/engine/dt_common_eng.cpp#L356
// https://github.com/LestaD/SourceEngine2007/blob/43a5c90a5ada1e69ca044595383be67f40b33c61/src_main/engine/dt_recv_eng.cpp#L310 // https://github.com/LestaD/SourceEngine2007/blob/43a5c90a5ada1e69ca044595383be67f40b33c61/src_main/engine/dt_recv_eng.cpp#L310
// https://github.com/PazerOP/DemoLib/blob/master/DemoLib/Commands/DemoDataTablesCommand.cs // https://github.com/PazerOP/DemoLib/blob/master/DemoLib/Commands/DemoDataTablesCommand.cs
let tables:SendTable[] = []; let tables: SendTable[] = [];
let i, j; let i, j;
const tableMap: {[key: string]: SendTable} = {};
while (this.stream.readBoolean()) { while (this.stream.readBoolean()) {
const needsDecoder = this.stream.readBoolean(); const needsDecoder = this.stream.readBoolean();
const tableName = this.stream.readASCIIString(); const tableName = this.stream.readASCIIString();
@ -70,32 +71,35 @@ export class DataTable extends Parser {
} }
} }
tables.push(table); tables.push(table);
tableMap[table.name] = table;
} }
this.match.sendTables = tables;
// link referenced tables // link referenced tables
for (i = 0; i < tables.length; i++) { for (const table of tables) {
for (j = 0; j < tables[i].props.length; j++) { for (const prop of table.props) {
if (tables[i].props[j].type === SendPropType.DPT_DataTable) { if (prop.type === SendPropType.DPT_DataTable) {
tables[i].props[j].table = this.match.getSendTable(tables[i].props[j].excludeDTName); if (prop.excludeDTName) {
tables[i].props[j].excludeDTName = null; prop.table = tableMap[prop.excludeDTName];
prop.excludeDTName = null;
}
} }
} }
} }
const serverClasses = this.stream.readUint16(); // short const numServerClasses = this.stream.readUint16(); // short
if (serverClasses <= 0) { const serverClasses: ServerClass[] = [];
if (numServerClasses <= 0) {
throw "expected one or more serverclasses"; throw "expected one or more serverclasses";
} }
for (i = 0; i < serverClasses; i++) { for (i = 0; i < numServerClasses; i++) {
const classId = this.stream.readUint16(); const classId = this.stream.readUint16();
if (classId > serverClasses) { if (classId > numServerClasses) {
throw "invalid class id"; throw "invalid class id";
} }
const className = this.stream.readASCIIString(); const className = this.stream.readASCIIString();
const dataTable = this.stream.readASCIIString(); const dataTable = this.stream.readASCIIString();
this.match.serverClasses.push(new ServerClass(classId, className, dataTable)); serverClasses.push(new ServerClass(classId, className, dataTable));
} }
const bitsLeft = (this.length * 8) - this.stream.index; const bitsLeft = (this.length * 8) - this.stream.index;
@ -103,6 +107,11 @@ export class DataTable extends Parser {
throw "unexpected remaining data in datatable (" + bitsLeft + " bits)"; throw "unexpected remaining data in datatable (" + bitsLeft + " bits)";
} }
return tables;
return [{
packetType: 'dataTable',
tables: tables,
serverClasses: serverClasses
}];
} }
} }

View file

@ -18,5 +18,5 @@ export abstract class Parser {
this.match = match; this.match = match;
} }
abstract parse():Packet[]|string|SendTable[]; abstract parse():Packet[]|string;
} }