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

Fix getting game event type

This commit is contained in:
Robin Appelman 2017-09-30 12:05:50 +02:00
commit 2b0075736b
3 changed files with 12 additions and 3 deletions

View file

@ -20,6 +20,7 @@ export class ParserState {
public staticBaseLines: Map<ServerClassId, BitStream> = new Map(); public staticBaseLines: Map<ServerClassId, BitStream> = new Map();
public staticBaselineCache: Map<ServerClassId, SendProp[]> = new Map(); public staticBaselineCache: Map<ServerClassId, SendProp[]> = new Map();
public eventDefinitions: Map<number, GameEventDefinition<GameEventType>> = new Map(); public eventDefinitions: Map<number, GameEventDefinition<GameEventType>> = new Map();
public eventDefinitionTypes: Map<GameEventType, number> = new Map();
public entityClasses: Map<EntityId, ServerClass> = new Map(); public entityClasses: Map<EntityId, ServerClass> = new Map();
public sendTables: Map<SendTableName, SendTable> = new Map(); public sendTables: Map<SendTableName, SendTable> = new Map();
public stringTables: StringTable[] = []; public stringTables: StringTable[] = [];

View file

@ -1,6 +1,12 @@
import {GameEventListPacket} from '../Data/Packet'; import {GameEventListPacket} from '../Data/Packet';
import {ParserState} from '../Data/ParserState'; import {ParserState} from '../Data/ParserState';
import {GameEventType} from '../Data/GameEventTypes';
import {GameEventDefinition} from '../Data/GameEvent';
export function handleGameEventList(packet: GameEventListPacket, state: ParserState) { export function handleGameEventList(packet: GameEventListPacket, state: ParserState) {
state.eventDefinitions = packet.eventList; state.eventDefinitions = packet.eventList;
const entries: ([number, GameEventDefinition<GameEventType>])[] = Array.from(packet.eventList.entries());
const reversedEntries = entries.map(([type, definition]) => [definition.name, type]) as [GameEventType, number][];
state.eventDefinitionTypes = new Map(reversedEntries);
} }

View file

@ -11,7 +11,7 @@ function parseGameEvent<T extends GameEventType>(definition: GameEventDefinition
const values: GameEventTypeMap[T]['values'] = {}; const values: GameEventTypeMap[T]['values'] = {};
for (const entry of definition.entries) { for (const entry of definition.entries) {
const value = getGameEventValue(stream, entry); const value = getGameEventValue(stream, entry);
if (value) { if (value !== null) {
values[entry.name] = value; values[entry.name] = value;
} }
} }
@ -26,7 +26,9 @@ function parseGameEvent<T extends GameEventType>(definition: GameEventDefinition
function encodeGameEvent<T extends GameEventType>(event: GameEventTypeMap[T], definition: GameEventDefinition<T>, stream: BitStream) { function encodeGameEvent<T extends GameEventType>(event: GameEventTypeMap[T], definition: GameEventDefinition<T>, stream: BitStream) {
for (const entry of definition.entries) { for (const entry of definition.entries) {
const value = event.values[entry.name]; const value = event.values[entry.name];
if (value !== null && typeof value !== 'undefined') { if (typeof value === 'undefined') {
throw new Error('empty event value');
} else {
encodeGameEventValue(value, stream, entry); encodeGameEventValue(value, stream, entry);
} }
} }
@ -105,7 +107,7 @@ export function ParseGameEvent(stream: BitStream, state: ParserState): GameEvent
export function EncodeGameEvent(packet: GameEventPacket, stream: BitStream, state: ParserState) { export function EncodeGameEvent(packet: GameEventPacket, stream: BitStream, state: ParserState) {
const lengthStart = stream.index; const lengthStart = stream.index;
stream.index += 11; stream.index += 11;
const eventId = GameEventTypeIdMap.get(packet.event.name); const eventId = state.eventDefinitionTypes.get(packet.event.name);
if (typeof eventId === 'undefined') { if (typeof eventId === 'undefined') {
throw new Error(`Unknown game event type ${packet.event.name}`); throw new Error(`Unknown game event type ${packet.event.name}`);
} }