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

include /build

This commit is contained in:
Bryan C 2020-07-02 18:42:25 +08:00
commit 132ab1b47a
220 changed files with 9059 additions and 1 deletions

View file

@ -0,0 +1,4 @@
import { Match } from '../Data/Match';
import { PacketMessage } from '../Data/Message';
import { PacketEntity } from '../Data/PacketEntity';
export declare function handleBaseEntity(entity: PacketEntity, match: Match, message: PacketMessage): void;

View file

@ -0,0 +1,29 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function handleBaseEntity(entity, match, message) {
for (const prop of entity.props) {
if (prop.definition.ownerTableName === 'DT_AttributeContainer' && prop.definition.name === 'm_hOuter') {
if (!match.outerMap.has(prop.value)) {
match.outerMap.set(prop.value, entity.entityIndex);
}
}
}
for (const prop of entity.props) {
if (prop.definition.ownerTableName === 'DT_BaseCombatWeapon' && prop.definition.name === 'm_hOwner') {
if (!match.weaponMap.has(entity.entityIndex)) {
match.weaponMap.set(entity.entityIndex, {
className: entity.serverClass.name,
owner: prop.value
});
}
}
}
switch (entity.serverClass.name) {
case 'CWorld':
match.world.boundaryMin = entity.getProperty('DT_WORLD', 'm_WorldMins').value;
match.world.boundaryMax = entity.getProperty('DT_WORLD', 'm_WorldMaxs').value;
break;
}
}
exports.handleBaseEntity = handleBaseEntity;
//# sourceMappingURL=BaseEntityHandler.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"BaseEntityHandler.js","sourceRoot":"","sources":["../../src/PacketHandler/BaseEntityHandler.ts"],"names":[],"mappings":";;AAKA,SAAgB,gBAAgB,CAAC,MAAoB,EAAE,KAAY,EAAE,OAAsB;IAC1F,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE;QAChC,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,KAAK,uBAAuB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE;YACtG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAe,CAAC,EAAE;gBAC9C,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAe,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;aAC7D;SACD;KACD;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE;QAChC,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,KAAK,qBAAqB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE;YACpG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;gBAC7C,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE;oBACvC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI;oBAClC,KAAK,EAAE,IAAI,CAAC,KAAe;iBAC3B,CAAC,CAAC;aACH;SACD;KACD;IAED,QAAQ,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE;QAChC,KAAK,QAAQ;YACZ,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,KAAe,CAAC;YACxF,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,KAAe,CAAC;YACxF,MAAM;KACP;AACF,CAAC;AA1BD,4CA0BC"}

3
build/PacketHandler/GameEvent.d.ts vendored Normal file
View file

@ -0,0 +1,3 @@
import { Match } from '../Data/Match';
import { GameEventPacket } from '../Data/Packet';
export declare function handleGameEvent(packet: GameEventPacket, match: Match): void;

View file

@ -0,0 +1,77 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function handleGameEvent(packet, match) {
switch (packet.event.name) {
case 'player_death':
handlePlayerDeath(packet.event, match);
break;
case 'teamplay_round_win':
handleRoundWin(packet.event, match);
break;
case 'player_spawn':
handlePlayerSpawn(packet.event, match);
break;
case 'object_destroyed':
handleObjectDestroyed(packet.event, match);
break;
case 'teamplay_round_start':
handleRoundStart(packet.event, match);
break;
}
}
exports.handleGameEvent = handleGameEvent;
function handlePlayerDeath(event, match) {
const values = event.values;
while (values.assister > 256 && values.assister < (1024 * 16)) {
values.assister -= 256;
}
const assister = values.assister < 256 ? values.assister : null;
// todo get player names, not same id as the name string table (entity id?)
while (values.attacker > 256) {
values.attacker -= 256;
}
while (values.userid > 256) {
values.userid -= 256;
}
match.deaths.push({
killer: values.attacker,
assister,
victim: values.userid,
weapon: values.weapon,
tick: match.tick
});
}
function handleRoundWin(event, match) {
const values = event.values;
if (values.winreason !== 6) { // 6 = timelimit
match.rounds.push({
winner: values.team === 2 ? 'red' : 'blue',
length: values.round_time,
end_tick: match.tick
});
}
}
function handlePlayerSpawn(event, match) {
const values = event.values;
const userId = values.userid;
const userState = match.getUserInfo(userId);
const player = match.playerEntityMap.get(userState.entityId);
userState.team = values.team === 2 ? 'red' : 'blue';
const classId = values.class;
if (player) {
player.classId = classId;
player.team = values.team;
}
if (!userState.classes[classId]) {
userState.classes[classId] = 0;
}
userState.classes[classId]++;
}
function handleObjectDestroyed(event, match) {
const values = event.values;
match.buildings.delete(values.index);
}
function handleRoundStart(event, match) {
match.buildings.clear();
}
//# sourceMappingURL=GameEvent.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"GameEvent.js","sourceRoot":"","sources":["../../src/PacketHandler/GameEvent.ts"],"names":[],"mappings":";;AAMA,SAAgB,eAAe,CAAC,MAAuB,EAAE,KAAY;IACpE,QAAQ,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;QAC1B,KAAK,cAAc;YAClB,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACvC,MAAM;QACP,KAAK,oBAAoB;YACxB,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACpC,MAAM;QACP,KAAK,cAAc;YAClB,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACvC,MAAM;QACP,KAAK,kBAAkB;YACtB,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3C,MAAM;QACP,KAAK,sBAAsB;YAC1B,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACtC,MAAM;KACP;AACF,CAAC;AAlBD,0CAkBC;AAED,SAAS,iBAAiB,CAAC,KAAuB,EAAE,KAAY;IAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,OAAO,MAAM,CAAC,QAAQ,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;QAC9D,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC;KACvB;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,2EAA2E;IAC3E,OAAO,MAAM,CAAC,QAAQ,GAAG,GAAG,EAAE;QAC7B,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC;KACvB;IACD,OAAO,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE;QAC3B,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;KACrB;IACD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC,QAAQ;QACvB,QAAQ;QACR,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,KAAK,CAAC,IAAI;KAChB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAA4B,EAAE,KAAY;IACjE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC,EAAE,EAAC,gBAAgB;QAC5C,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;YACjB,MAAM,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;YAC1C,MAAM,EAAE,MAAM,CAAC,UAAU;YACzB,QAAQ,EAAE,KAAK,CAAC,IAAI;SACpB,CAAC,CAAC;KACH;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAuB,EAAE,KAAY;IAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC7D,SAAS,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACpD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;IAC7B,IAAI,MAAM,EAAE;QACX,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;QACzB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;KAC1B;IACD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAChC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;KAC/B;IACD,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,qBAAqB,CAAC,KAA2B,EAAE,KAAY;IACvE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA8B,EAAE,KAAY;IACrE,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC"}

View file

@ -0,0 +1,3 @@
import { GameEventListPacket } from '../Data/Packet';
import { ParserState } from '../Data/ParserState';
export declare function handleGameEventList(packet: GameEventListPacket, state: ParserState): void;

View file

@ -0,0 +1,10 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function handleGameEventList(packet, state) {
state.eventDefinitions = packet.eventList;
const entries = Array.from(packet.eventList.entries());
const reversedEntries = entries.map(([type, definition]) => [definition.name, type]);
state.eventDefinitionTypes = new Map(reversedEntries);
}
exports.handleGameEventList = handleGameEventList;
//# sourceMappingURL=GameEventList.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"GameEventList.js","sourceRoot":"","sources":["../../src/PacketHandler/GameEventList.ts"],"names":[],"mappings":";;AAKA,SAAgB,mBAAmB,CAAC,MAA2B,EAAE,KAAkB;IAClF,KAAK,CAAC,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC;IAE1C,MAAM,OAAO,GAAwD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5G,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAmC,CAAC;IACvH,KAAK,CAAC,oBAAoB,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;AACvD,CAAC;AAND,kDAMC"}

View file

@ -0,0 +1,4 @@
import { Match } from '../Data/Match';
import { PacketMessage } from '../Data/Message';
import { PacketEntity } from '../Data/PacketEntity';
export declare function handleHL2DMEntity(entity: PacketEntity, match: Match, message: PacketMessage): void;

View file

@ -0,0 +1,215 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Player_1 = require("../Data/Player");
function handleHL2DMEntity(entity, match, message) {
switch (entity.serverClass.name) {
case 'CHL2MP_Player':
const userInfo = match.getUserInfoForEntity(entity);
if (!userInfo) {
throw new Error(`No user info for entity ${entity.entityIndex}`);
}
if (userInfo.entityId !== entity.entityIndex) {
throw new Error(`Invalid user info for entity ${entity.entityIndex} vs ${userInfo.entityId}`);
}
const player = (match.playerEntityMap.has(entity.entityIndex)) ?
match.playerEntityMap.get(entity.entityIndex) :
new Player_1.Player(match, userInfo);
if (!match.playerEntityMap.has(entity.entityIndex)) {
match.playerEntityMap.set(entity.entityIndex, player);
}
for (const prop of entity.props) {
if (prop.definition.ownerTableName === 'm_hMyWeapons') {
if (prop.value !== 2097151) {
player.weaponIds[parseInt(prop.definition.name, 10)] = prop.value;
}
}
if (prop.definition.ownerTableName === 'm_iAmmo') {
if (prop.value !== null && prop.value > 0) {
player.ammo[parseInt(prop.definition.name, 10)] = prop.value;
}
}
const propName = prop.definition.ownerTableName + '.' + prop.definition.name;
switch (propName) {
case 'DT_BaseEntity.m_iTeamNum':
if (!player.user.team && (prop.value === 2 || prop.value === 3)) {
player.user.team = prop.value === 2 ? 'red' : 'blue';
}
player.team = prop.value;
break;
case 'DT_BasePlayer.m_iHealth':
player.health = prop.value;
break;
case 'DT_BasePlayer.m_iMaxHealth':
player.maxHealth = prop.value;
break;
case 'DT_BaseEntity.m_vecOrigin':
player.position.x = prop.value.x;
player.position.y = prop.value.y;
player.position.z = prop.value.z;
break;
case 'DT_HL2MP_Player.m_angEyeAngles[0]':
player.viewAngle = prop.value;
break;
case 'DT_HL2MP_Player.m_angEyeAngles[1]':
player.viewAngle = prop.value;
break;
case 'DT_BasePlayer.m_lifeState':
player.lifeState = prop.value;
break;
case 'DT_BaseCombatCharacter.m_hActiveWeapon':
for (let i = 0; i < player.weapons.length; i++) {
if (player.weaponIds[i] === prop.value) {
player.activeWeapon = i;
}
}
}
}
break;
case 'CTeam':
if (entity.hasProperty('DT_Team', 'm_iTeamNum')) {
const teamId = entity.getProperty('DT_Team', 'm_iTeamNum').value;
if (!match.teams.has(teamId)) {
const team = {
name: entity.getProperty('DT_Team', 'm_szTeamname').value,
score: entity.getProperty('DT_Team', 'm_iScore').value,
roundsWon: entity.getProperty('DT_Team', 'm_iRoundsWon').value,
players: entity.getProperty('DT_Team', '"player_array"').value,
teamNumber: teamId
};
match.teams.set(teamId, team);
match.teamEntityMap.set(entity.entityIndex, team);
}
}
else {
const team = match.teamEntityMap.get(entity.entityIndex);
if (!team) {
throw new Error(`No team with entity id: ${entity.entityIndex}`);
}
for (const prop of entity.props) {
const propName = prop.definition.ownerTableName + '.' + prop.definition.name;
switch (propName) {
case 'DT_Team.m_iScore':
team.score = prop.value;
break;
case 'DT_Team.m_szTeamname':
team.name = prop.value;
break;
case 'DT_Team.m_iRoundsWon':
team.roundsWon = prop.value;
break;
case 'DT_Team."player_array"':
team.players = prop.value;
break;
}
}
}
break;
case 'CPlayerResource':
for (const prop of entity.props) {
const playerId = parseInt(prop.definition.name, 10);
const value = prop.value;
if (!match.playerResources[playerId]) {
match.playerResources[playerId] = {
alive: false,
arenaSpectator: false,
bonusPoints: 0,
chargeLevel: 0,
connected: false,
damageAssists: 0,
damageBlocked: 0,
deaths: 0,
dominations: 0,
healing: 0,
healingAssist: 0,
health: 0,
killStreak: 0,
maxBuffedHealth: 0,
maxHealth: 0,
nextRespawn: 0,
ping: 0,
playerClass: 0,
playerLevel: 0,
score: 0,
team: 0,
totalScore: 0,
damage: 0
};
}
const playerResource = match.playerResources[playerId];
switch (prop.definition.ownerTableName) {
case 'm_iPing':
playerResource.ping = value;
break;
case 'm_iScore':
playerResource.score = value;
break;
case 'm_iDeaths':
playerResource.deaths = value;
break;
case 'm_bConnected':
playerResource.connected = value > 0;
break;
case 'm_iTeam':
playerResource.team = value;
break;
case 'm_bAlive':
playerResource.alive = value > 0;
break;
case 'm_iHealth':
playerResource.health = value;
break;
case 'm_iTotalScore':
playerResource.totalScore = value;
break;
case 'm_iMaxHealth':
playerResource.maxHealth = value;
break;
case 'm_iMaxBuffedHealth':
playerResource.maxBuffedHealth = value;
break;
case 'm_iPlayerClass':
playerResource.playerClass = value;
break;
case 'm_bArenaSpectator':
playerResource.arenaSpectator = value > 0;
break;
case 'm_iActiveDominations':
playerResource.dominations = value;
break;
case 'm_flNextRespawnTime':
playerResource.nextRespawn = value;
break;
case 'm_iChargeLevel':
playerResource.chargeLevel = value;
break;
case 'm_iDamage':
playerResource.damage = value;
break;
case 'm_iDamageAssist':
playerResource.damageAssists = value;
break;
case 'm_iHealing':
playerResource.healing = value;
break;
case 'm_iHealingAssist':
playerResource.healingAssist = value;
break;
case 'm_iDamageBlocked':
playerResource.damageBlocked = value;
break;
case 'm_iBonusPoints':
playerResource.bonusPoints = value;
break;
case 'm_iPlayerLevel':
playerResource.playerLevel = value;
break;
case 'm_iKillstreak':
playerResource.killStreak = value;
break;
}
}
break;
}
}
exports.handleHL2DMEntity = handleHL2DMEntity;
//# sourceMappingURL=HL2DMEntityHandler.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,6 @@
import { Match } from '../Data/Match';
import { PacketMessage } from '../Data/Message';
import { PacketEntitiesPacket } from '../Data/Packet';
import { ParserState } from '../Data/ParserState';
export declare function handlePacketEntities(packet: PacketEntitiesPacket, match: Match, message: PacketMessage): void;
export declare function handlePacketEntitiesForState(packet: PacketEntitiesPacket, state: ParserState): void;

View file

@ -0,0 +1,36 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const PacketEntity_1 = require("../Data/PacketEntity");
const BaseEntityHandler_1 = require("./BaseEntityHandler");
const HL2DMEntityHandler_1 = require("./HL2DMEntityHandler");
const TFEntityHandler_1 = require("./TFEntityHandler");
function handlePacketEntities(packet, match, message) {
for (const entity of packet.entities) {
BaseEntityHandler_1.handleBaseEntity(entity, match, message);
switch (match.parserState.game) {
case 'tf':
TFEntityHandler_1.handleTFEntity(entity, match, message);
break;
case 'hl2mp':
HL2DMEntityHandler_1.handleHL2DMEntity(entity, match, message);
break;
}
}
}
exports.handlePacketEntities = handlePacketEntities;
function handlePacketEntitiesForState(packet, state) {
for (const removedEntityId of packet.removedEntities) {
state.entityClasses.delete(removedEntityId);
}
for (const entity of packet.entities) {
saveEntity(entity, state);
}
}
exports.handlePacketEntitiesForState = handlePacketEntitiesForState;
function saveEntity(packetEntity, state) {
if (packetEntity.pvs === PacketEntity_1.PVS.DELETE) {
state.entityClasses.delete(packetEntity.entityIndex);
}
state.entityClasses.set(packetEntity.entityIndex, packetEntity.serverClass);
}
//# sourceMappingURL=PacketEntities.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"PacketEntities.js","sourceRoot":"","sources":["../../src/PacketHandler/PacketEntities.ts"],"names":[],"mappings":";;AAIA,uDAAuD;AAOvD,2DAAqD;AACrD,6DAAuD;AACvD,uDAAiD;AAEjD,SAAgB,oBAAoB,CAAC,MAA4B,EAAE,KAAY,EAAE,OAAsB;IACtG,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE;QACrC,oCAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACzC,QAAQ,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE;YAC/B,KAAK,IAAI;gBACR,gCAAc,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBACvC,MAAM;YACP,KAAK,OAAO;gBACX,sCAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC1C,MAAM;SACP;KACD;AACF,CAAC;AAZD,oDAYC;AAED,SAAgB,4BAA4B,CAAC,MAA4B,EAAE,KAAkB;IAC5F,KAAK,MAAM,eAAe,IAAI,MAAM,CAAC,eAAe,EAAE;QACrD,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;KAC5C;IAED,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE;QACrC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;KAC1B;AACF,CAAC;AARD,oEAQC;AAED,SAAS,UAAU,CAAC,YAA0B,EAAE,KAAkB;IACjE,IAAI,YAAY,CAAC,GAAG,KAAK,kBAAG,CAAC,MAAM,EAAE;QACpC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;KACrD;IAED,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;AAC7E,CAAC"}

3
build/PacketHandler/SayText2.d.ts vendored Normal file
View file

@ -0,0 +1,3 @@
import { Match } from '../Data/Match';
import { SayText2Packet } from '../Data/UserMessage';
export declare function handleSayText2(packet: SayText2Packet, match: Match): void;

View file

@ -0,0 +1,20 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function handleSayText2(packet, match) {
if (packet.kind === '#TF_Name_Change') {
for (const user of match.users.values()) {
if (user.name === packet.from) {
user.name = packet.text;
}
}
return;
}
match.chat.push({
kind: packet.kind,
from: packet.from,
text: packet.text,
tick: match.tick
});
}
exports.handleSayText2 = handleSayText2;
//# sourceMappingURL=SayText2.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"SayText2.js","sourceRoot":"","sources":["../../src/PacketHandler/SayText2.ts"],"names":[],"mappings":";;AAGA,SAAgB,cAAc,CAAC,MAAsB,EAAE,KAAY;IAClE,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB,EAAE;QACtC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;YACxC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE;gBAC9B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;aACxB;SACD;QACD,OAAO;KACP;IAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,KAAK,CAAC,IAAI;KAChB,CAAC,CAAC;AACJ,CAAC;AAhBD,wCAgBC"}

7
build/PacketHandler/StringTable.d.ts vendored Normal file
View file

@ -0,0 +1,7 @@
import { CreateStringTablePacket, StringTablePacket, UpdateStringTablePacket } from '../Data/Packet';
import { ParserState } from '../Data/ParserState';
import { StringTable } from '../Data/StringTable';
export declare function handleStringTable(packet: CreateStringTablePacket, state: ParserState): void;
export declare function handleStringTables(packet: StringTablePacket, state: ParserState): void;
export declare function handleStringTableUpdate(packet: UpdateStringTablePacket, state: ParserState): void;
export declare function handleTable(table: StringTable, state: ParserState): void;

View file

@ -0,0 +1,76 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function handleStringTable(packet, state) {
handleTable(packet.table, state);
}
exports.handleStringTable = handleStringTable;
function handleStringTables(packet, state) {
for (const table of packet.tables) {
handleTable(table, state);
}
}
exports.handleStringTables = handleStringTables;
function handleStringTableUpdate(packet, state) {
const updatedTable = state.stringTables[packet.tableId];
handleStringTableEntries(updatedTable.name, packet.entries, state);
}
exports.handleStringTableUpdate = handleStringTableUpdate;
function handleTable(table, state) {
if (!state.getStringTable(table.name)) {
state.stringTables.push(table);
}
handleStringTableEntries(table.name, table.entries, state);
}
exports.handleTable = handleTable;
function handleStringTableEntries(tableName, entries, state) {
if (tableName === 'userinfo') {
for (const entry of entries) {
if (entry && entry.extraData) {
calculateUserInfoFromEntry(entry.text, entry.extraData, state);
}
}
}
if (tableName === 'instancebaseline') {
for (const instanceBaseLine of entries) {
if (instanceBaseLine) {
saveInstanceBaseLine(instanceBaseLine, state);
}
}
}
}
function calculateUserInfoFromEntry(text, extraData, state) {
if (extraData.bitsLeft > (32 * 8)) {
const name = extraData.readUTF8String(32);
let userId = extraData.readUint32();
while (userId > 256) {
userId -= 256;
}
const steamId = extraData.readUTF8String();
if (steamId) {
const entityId = parseInt(text, 10) + 1;
let userState = state.userInfo.get(userId);
if (!userState) {
userState = {
name: '',
userId,
steamId: '',
entityId
};
state.userInfo.set(userState.userId, userState);
}
userState.name = name;
userState.steamId = steamId;
}
}
}
function saveInstanceBaseLine(entry, state) {
if (entry.extraData) {
const serverClassId = parseInt(entry.text, 10);
state.staticBaselineCache.delete(serverClassId);
state.staticBaseLines.set(serverClassId, entry.extraData);
}
else {
throw new Error('Missing baseline');
}
}
//# sourceMappingURL=StringTable.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"StringTable.js","sourceRoot":"","sources":["../../src/PacketHandler/StringTable.ts"],"names":[],"mappings":"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"}

View file

@ -0,0 +1,4 @@
import { Match } from '../Data/Match';
import { PacketMessage } from '../Data/Message';
import { PacketEntity } from '../Data/PacketEntity';
export declare function handleTFEntity(entity: PacketEntity, match: Match, message: PacketMessage): void;

View file

@ -0,0 +1,447 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const PacketEntity_1 = require("../Data/PacketEntity");
const Player_1 = require("../Data/Player");
const Vector_1 = require("../Data/Vector");
function handleTFEntity(entity, match, message) {
switch (entity.serverClass.name) {
case 'CTFPlayer':
/**
* "DT_TFPlayerScoringDataExclusive.m_iCaptures": 0,
* "DT_TFPlayerScoringDataExclusive.m_iDefenses": 0,
* "DT_TFPlayerScoringDataExclusive.m_iKills": 5,
* "DT_TFPlayerScoringDataExclusive.m_iDeaths": 17,
* "DT_TFPlayerScoringDataExclusive.m_iSuicides": 7,
* "DT_TFPlayerScoringDataExclusive.m_iDominations": 0,
* "DT_TFPlayerScoringDataExclusive.m_iRevenge": 0,
* "DT_TFPlayerScoringDataExclusive.m_iBuildingsBuilt": 0,
* "DT_TFPlayerScoringDataExclusive.m_iBuildingsDestroyed": 0,
* "DT_TFPlayerScoringDataExclusive.m_iHeadshots": 0,
* "DT_TFPlayerScoringDataExclusive.m_iBackstabs": 0,
* "DT_TFPlayerScoringDataExclusive.m_iHealPoints": 0,
* "DT_TFPlayerScoringDataExclusive.m_iInvulns": 0,
* "DT_TFPlayerScoringDataExclusive.m_iTeleports": 0,
* "DT_TFPlayerScoringDataExclusive.m_iDamageDone": 847,
* "DT_TFPlayerScoringDataExclusive.m_iCrits": 0,
* "DT_TFPlayerScoringDataExclusive.m_iResupplyPoints": 0,
* "DT_TFPlayerScoringDataExclusive.m_iKillAssists": 0,
* "DT_TFPlayerScoringDataExclusive.m_iBonusPoints": 0,
* "DT_TFPlayerScoringDataExclusive.m_iPoints": 6,
* "DT_TFPlayerSharedLocal.m_nDesiredDisguiseTeam": 0,
* "DT_TFPlayerSharedLocal.m_nDesiredDisguiseClass": 0,
* "DT_TFPlayerShared.m_iKillStreak": 0,
* "DT_TFPlayerShared.m_flCloakMeter": 100,
*/
const userInfo = match.getUserInfoForEntity(entity);
if (!userInfo) {
throw new Error(`No user info for entity ${entity.entityIndex}`);
}
const player = (match.playerEntityMap.has(entity.entityIndex)) ?
match.playerEntityMap.get(entity.entityIndex) :
new Player_1.Player(match, userInfo);
if (!match.playerEntityMap.has(entity.entityIndex)) {
match.playerEntityMap.set(entity.entityIndex, player);
}
for (const prop of entity.props) {
if (prop.definition.ownerTableName === 'm_hMyWeapons') {
if (prop.value !== 2097151) {
player.weaponIds[parseInt(prop.definition.name, 10)] = prop.value;
}
}
if (prop.definition.ownerTableName === 'm_iAmmo') {
if (prop.value !== null && prop.value > 0) {
player.ammo[parseInt(prop.definition.name, 10)] = prop.value;
}
}
const propName = prop.definition.ownerTableName + '.' + prop.definition.name;
switch (propName) {
case 'DT_BasePlayer.m_iHealth':
player.health = prop.value;
break;
case 'DT_BasePlayer.m_iMaxHealth':
player.maxHealth = prop.value;
break;
case 'DT_TFLocalPlayerExclusive.m_vecOrigin':
player.position.x = prop.value.x;
player.position.y = prop.value.y;
// set the view angles for the local player since that prop isn't send
player.viewAngle = message.localViewAngles[0].y;
break;
case 'DT_TFNonLocalPlayerExclusive.m_vecOrigin':
player.position.x = prop.value.x;
player.position.y = prop.value.y;
break;
case 'DT_TFLocalPlayerExclusive.m_vecOrigin[2]':
player.position.z = prop.value;
break;
case 'DT_TFNonLocalPlayerExclusive.m_vecOrigin[2]':
player.position.z = prop.value;
break;
case 'DT_TFNonLocalPlayerExclusive.m_angEyeAngles[1]':
player.viewAngle = prop.value;
break;
case 'DT_TFLocalPlayerExclusive.m_angEyeAngles[1]':
player.viewAngle = prop.value;
break;
case 'DT_BasePlayer.m_lifeState':
player.lifeState = prop.value;
break;
case 'DT_BaseCombatCharacter.m_hActiveWeapon':
for (let i = 0; i < player.weapons.length; i++) {
if (player.weaponIds[i] === prop.value) {
player.activeWeapon = i;
}
}
}
}
break;
case 'CWeaponMedigun':
const weapon = match.weaponMap.get(entity.entityIndex);
if (weapon && weapon.className === 'CWeaponMedigun') {
for (const prop of entity.props) {
const propName = prop.definition.ownerTableName + '.' + prop.definition.name;
switch (propName) {
case 'DT_WeaponMedigun.m_hHealingTarget':
weapon.healTarget = prop.value;
break;
case 'DT_TFWeaponMedigunDataNonLocal.m_flChargeLevel':
weapon.chargeLevel = prop.value;
break;
case 'DT_LocalTFWeaponMedigunData.m_flChargeLevel':
weapon.chargeLevel = prop.value;
break;
}
}
}
break;
case 'CTFTeam':
if (entity.hasProperty('DT_Team', 'm_iTeamNum')) {
const teamId = entity.getProperty('DT_Team', 'm_iTeamNum').value;
if (!match.teams.has(teamId)) {
const team = {
name: entity.getProperty('DT_Team', 'm_szTeamname').value,
score: entity.getProperty('DT_Team', 'm_iScore').value,
roundsWon: entity.getProperty('DT_Team', 'm_iRoundsWon').value,
players: entity.getProperty('DT_Team', '"player_array"').value,
teamNumber: teamId
};
match.teams.set(teamId, team);
match.teamEntityMap.set(entity.entityIndex, team);
}
}
else {
const team = match.teamEntityMap.get(entity.entityIndex);
if (!team) {
throw new Error(`No team with entity id: ${entity.entityIndex}`);
}
for (const prop of entity.props) {
const propName = prop.definition.ownerTableName + '.' + prop.definition.name;
switch (propName) {
case 'DT_Team.m_iScore':
team.score = prop.value;
break;
case 'DT_Team.m_szTeamname':
team.name = prop.value;
break;
case 'DT_Team.m_iRoundsWon':
team.roundsWon = prop.value;
break;
case 'DT_Team."player_array"':
team.players = prop.value;
break;
}
}
}
break;
case 'CObjectSentrygun':
if (!match.buildings.has(entity.entityIndex)) {
match.buildings.set(entity.entityIndex, {
type: 'sentry',
ammoRockets: 0,
ammoShells: 0,
autoAimTarget: 0,
builder: 0,
health: 0,
isBuilding: false,
isSapped: false,
level: 0,
maxHealth: 0,
playerControlled: false,
position: new Vector_1.Vector(0, 0, 0),
shieldLevel: 0,
isMini: false,
team: 0,
angle: 0
});
}
const sentry = match.buildings.get(entity.entityIndex);
for (const prop of entity.props) {
const propName = prop.definition.ownerTableName + '.' + prop.definition.name;
applyBuildingProp(sentry, prop, propName);
switch (propName) {
case 'DT_ObjectSentrygun.m_bPlayerControlled':
sentry.playerControlled = prop.value > 0;
break;
case 'DT_ObjectSentrygun.m_hAutoAimTarget':
sentry.autoAimTarget = prop.value;
break;
case 'DT_ObjectSentrygun.m_nShieldLevel':
sentry.shieldLevel = prop.value;
break;
case 'DT_ObjectSentrygun.m_iAmmoShells':
sentry.ammoShells = prop.value;
break;
case 'DT_ObjectSentrygun.m_iAmmoRockets':
sentry.ammoRockets = prop.value;
break;
case 'DT_BaseObject.m_bMiniBuilding':
sentry.isMini = prop.value > 1;
break;
case 'DT_TFNonLocalPlayerExclusive.m_angEyeAngles[1]':
sentry.angle = prop.value;
break;
}
}
if (entity.pvs & PacketEntity_1.PVS.LEAVE) {
match.buildings.delete(entity.entityIndex);
}
break;
case 'CObjectDispenser':
if (!match.buildings.has(entity.entityIndex)) {
match.buildings.set(entity.entityIndex, {
type: 'dispenser',
builder: 0,
health: 0,
isBuilding: false,
isSapped: false,
level: 0,
maxHealth: 0,
position: new Vector_1.Vector(0, 0, 0),
team: 0,
healing: [],
metal: 0,
angle: 0
});
}
const dispenser = match.buildings.get(entity.entityIndex);
for (const prop of entity.props) {
const propName = prop.definition.ownerTableName + '.' + prop.definition.name;
applyBuildingProp(dispenser, prop, propName);
switch (propName) {
case 'DT_ObjectDispenser.m_iAmmoMetal':
dispenser.metal = prop.value;
break;
case 'DT_ObjectDispenser."healing_array"':
dispenser.healing = prop.value;
break;
}
}
if (entity.pvs & PacketEntity_1.PVS.LEAVE) {
match.buildings.delete(entity.entityIndex);
}
break;
case 'CObjectTeleporter':
if (!match.buildings.has(entity.entityIndex)) {
match.buildings.set(entity.entityIndex, {
type: 'teleporter',
builder: 0,
health: 0,
isBuilding: false,
isSapped: false,
level: 0,
maxHealth: 0,
position: new Vector_1.Vector(0, 0, 0),
team: 0,
isEntrance: false,
otherEnd: 0,
rechargeTime: 0,
rechargeDuration: 0,
timesUsed: 0,
angle: 0,
yawToExit: 0
});
}
const teleporter = match.buildings.get(entity.entityIndex);
for (const prop of entity.props) {
const propName = prop.definition.ownerTableName + '.' + prop.definition.name;
applyBuildingProp(teleporter, prop, propName);
switch (propName) {
case 'DT_ObjectTeleporter.m_flRechargeTime':
teleporter.rechargeTime = prop.value;
break;
case 'DT_ObjectTeleporter.m_flCurrentRechargeDuration':
teleporter.rechargeDuration = prop.value;
break;
case 'DT_ObjectTeleporter.m_iTimesUsed':
teleporter.timesUsed = prop.value;
break;
case 'DT_ObjectTeleporter.m_bMatchBuilding':
teleporter.otherEnd = prop.value;
break;
case 'DT_ObjectTeleporter.m_flYawToExit':
teleporter.yawToExit = prop.value;
break;
case 'DT_BaseObject.m_iObjectMode':
teleporter.isEntrance = prop.value === 0;
break;
}
}
if (entity.pvs & PacketEntity_1.PVS.LEAVE) {
match.buildings.delete(entity.entityIndex);
}
break;
case 'CTFPlayerResource':
for (const prop of entity.props) {
const playerId = parseInt(prop.definition.name, 10);
const value = prop.value;
if (!match.playerResources[playerId]) {
match.playerResources[playerId] = {
alive: false,
arenaSpectator: false,
bonusPoints: 0,
chargeLevel: 0,
connected: false,
damageAssists: 0,
damageBlocked: 0,
deaths: 0,
dominations: 0,
healing: 0,
healingAssist: 0,
health: 0,
killStreak: 0,
maxBuffedHealth: 0,
maxHealth: 0,
nextRespawn: 0,
ping: 0,
playerClass: 0,
playerLevel: 0,
score: 0,
team: 0,
totalScore: 0,
damage: 0
};
}
const playerResource = match.playerResources[playerId];
switch (prop.definition.ownerTableName) {
case 'm_iPing':
playerResource.ping = value;
break;
case 'm_iScore':
playerResource.score = value;
break;
case 'm_iDeaths':
playerResource.deaths = value;
break;
case 'm_bConnected':
playerResource.connected = value > 0;
break;
case 'm_iTeam':
playerResource.team = value;
break;
case 'm_bAlive':
playerResource.alive = value > 0;
break;
case 'm_iHealth':
playerResource.health = value;
break;
case 'm_iTotalScore':
playerResource.totalScore = value;
break;
case 'm_iMaxHealth':
playerResource.maxHealth = value;
break;
case 'm_iMaxBuffedHealth':
playerResource.maxBuffedHealth = value;
break;
case 'm_iPlayerClass':
playerResource.playerClass = value;
break;
case 'm_bArenaSpectator':
playerResource.arenaSpectator = value > 0;
break;
case 'm_iActiveDominations':
playerResource.dominations = value;
break;
case 'm_flNextRespawnTime':
playerResource.nextRespawn = value;
break;
case 'm_iChargeLevel':
playerResource.chargeLevel = value;
break;
case 'm_iDamage':
playerResource.damage = value;
break;
case 'm_iDamageAssist':
playerResource.damageAssists = value;
break;
case 'm_iHealing':
playerResource.healing = value;
break;
case 'm_iHealingAssist':
playerResource.healingAssist = value;
break;
case 'm_iDamageBlocked':
playerResource.damageBlocked = value;
break;
case 'm_iBonusPoints':
playerResource.bonusPoints = value;
break;
case 'm_iPlayerLevel':
playerResource.playerLevel = value;
break;
case 'm_iKillstreak':
playerResource.killStreak = value;
break;
}
}
break;
case 'CTeamRoundTimer':
break;
case 'CLaserDot':
// for (const prop of entity.props) {
// const propName = prop.definition.ownerTableName + '.' + prop.definition.name;
// switch (propName) {
// case 'DT_BaseEntity.m_iParentAttachment':
// console.log(prop.value);
// process.exit();
// break;
//
// }
// }
// console.log(match.getSendTable(entity.serverClass.dataTable).flattenedProps);
break;
}
}
exports.handleTFEntity = handleTFEntity;
function applyBuildingProp(building, prop, propName) {
switch (propName) {
case 'DT_BaseObject.m_iUpgradeLevel':
building.level = prop.value;
break;
case 'DT_BaseObject.m_hBuilder':
building.builder = prop.value;
break;
case 'DT_BaseObject.m_iMaxHealth':
building.maxHealth = prop.value;
break;
case 'DT_BaseObject.m_iHealth':
building.health = prop.value;
break;
case 'DT_BaseObject.m_bBuilding':
building.isBuilding = prop.value > 0;
break;
case 'DT_BaseObject.m_bHasSapper':
building.isSapped = prop.value > 0;
break;
case 'DT_BaseEntity.m_vecOrigin':
building.position = prop.value;
break;
case 'DT_BaseEntity.m_iTeamNum':
building.team = prop.value;
break;
case 'DT_BaseEntity.m_angRotation':
building.angle = prop.value.y;
break;
}
}
//# sourceMappingURL=TFEntityHandler.js.map

File diff suppressed because one or more lines are too long