1
0
Fork 0
mirror of https://github.com/demostf/demo.js synced 2026-06-03 16:44:12 +02:00

encoder for classInfo

This commit is contained in:
Robin Appelman 2017-08-12 16:17:38 +02:00
commit a979cf6b83
5 changed files with 60 additions and 13 deletions

View file

@ -35,11 +35,11 @@ export interface ClassInfoPacket {
packetType: 'classInfo';
number: number;
create: boolean;
entries: Array<{
entries: {
classId: number;
className: string;
dataTableName: string;
}>;
}[];
}
export interface EntityMessagePacket {

View file

@ -1,7 +1,7 @@
import {make} from '../Packet/ParserGenerator';
import {ParseBSPDecal} from '../Packet/BSPDecal';
import {ParseClassInfo} from '../Packet/ClassInfo';
import {EncodeClassInfo, ParseClassInfo} from '../Packet/ClassInfo';
import {ParseCmdKeyValues} from '../Packet/CmdKeyValues';
import {ParseCreateStringTable} from '../Packet/CreateStringTable';
import {ParseEntityMessage} from '../Packet/EntityMessage';
@ -39,7 +39,7 @@ export class Packet extends Parser {
'version{16}serverCount{32}stv{b}dedicated{b}maxCrc{32}maxClasses{16}' +
'mapHash{128}playerCount{8}maxPlayerCount{8}intervalPerTick{f32}platform{s1}' +
'game{s}map{s}skybox{s}serverName{s}replay{b}'),
10: {parser: ParseClassInfo, encoder: voidEncoder},
10: {parser: ParseClassInfo, encoder: EncodeClassInfo},
11: make('setPause', 'paused{b}'),
12: {parser: ParseCreateStringTable, encoder: voidEncoder},
13: {parser: ParseUpdateStringTable, encoder: voidEncoder},

View file

@ -2,16 +2,21 @@ import {BitStream} from 'bit-buffer';
import {ClassInfoPacket} from '../../Data/Packet';
import {logBase2} from '../../Math';
export function ParseClassInfo(stream: BitStream): ClassInfoPacket { // 10: classInfo
const count = stream.readBits(16);
const create = stream.readBoolean();
const entries: any[] = [];
const count = stream.readUint16();
const create = stream.readBoolean();
const entries: {
classId: number;
className: string;
dataTableName: string;
}[] = [];
if (!create) {
const bits = logBase2(count) + 1;
for (let i = 0; i < count; i++) {
const entry = {
classId: stream.readBits(bits),
className: stream.readASCIIString(),
classId: stream.readBits(bits),
className: stream.readASCIIString(),
dataTableName: stream.readASCIIString(),
};
entries.push(entry);
@ -24,3 +29,16 @@ export function ParseClassInfo(stream: BitStream): ClassInfoPacket { // 10: clas
entries,
};
}
export function EncodeClassInfo(packet: ClassInfoPacket, stream: BitStream) {
stream.writeUint16(packet.number);
stream.writeBoolean(packet.create ? 1 : 0);
if (!packet.create) {
const bits = logBase2(packet.number) + 1;
for (const entry of packet.entries) {
stream.writeBits(entry.classId, bits);
stream.writeASCIIString(entry.className);
stream.writeASCIIString(entry.dataTableName);
}
}
}

View file

@ -0,0 +1,23 @@
import {BitStream} from 'bit-buffer';
import {assertEncoder, assertParser, getStream} from './PacketTest';
import {EncodeClassInfo, ParseClassInfo} from '../../../../Parser/Packet/ClassInfo';
suite('ClassInfo', () => {
test('Parse classInfo', () => {
assertParser(ParseClassInfo, getStream([92, 1, 29]), {
packetType: 'classInfo',
number: 348,
create: true,
entries: []
}, 17);
});
test('Encode classInfo', () => {
assertEncoder(ParseClassInfo, EncodeClassInfo, {
packetType: 'classInfo',
number: 348,
create: true,
entries: []
}, 17);
});
});

View file

@ -2,10 +2,16 @@ import * as assert from 'assert';
import {BitStream} from 'bit-buffer';
import {Packet} from '../../../../Data/Packet';
import {Encoder, Parser} from '../../../../Parser/Packet/Parser';
import {isArray} from 'util';
export function getStream(data: string) {
const buffer = new Buffer(data + '\0remaining dummy data');
return new BitStream(buffer);
export function getStream(data: string | number[]) {
if (isArray(data)) {
const array = new Uint8Array(data as number[]);
return new BitStream(array.buffer);
} else {
const buffer = new Buffer(data + '\0remaining dummy data');
return new BitStream(buffer);
}
}
export function assertEncoder(parser: Parser, encoder: Encoder, data: any, length: number = 0) {