mirror of
https://github.com/demostf/demo.js
synced 2026-06-04 09:04:13 +02:00
include /build
This commit is contained in:
parent
6e50384883
commit
132ab1b47a
220 changed files with 9059 additions and 1 deletions
4
build/PacketHandler/BaseEntityHandler.d.ts
vendored
Normal file
4
build/PacketHandler/BaseEntityHandler.d.ts
vendored
Normal 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;
|
||||
29
build/PacketHandler/BaseEntityHandler.js
Normal file
29
build/PacketHandler/BaseEntityHandler.js
Normal 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
|
||||
1
build/PacketHandler/BaseEntityHandler.js.map
Normal file
1
build/PacketHandler/BaseEntityHandler.js.map
Normal 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
3
build/PacketHandler/GameEvent.d.ts
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
import { Match } from '../Data/Match';
|
||||
import { GameEventPacket } from '../Data/Packet';
|
||||
export declare function handleGameEvent(packet: GameEventPacket, match: Match): void;
|
||||
77
build/PacketHandler/GameEvent.js
Normal file
77
build/PacketHandler/GameEvent.js
Normal 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
|
||||
1
build/PacketHandler/GameEvent.js.map
Normal file
1
build/PacketHandler/GameEvent.js.map
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"GameEvent.js","sourceRoot":"","sources":["../../src/PacketHandler/GameEvent.ts"],"names":[],"mappings":"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"}
|
||||
3
build/PacketHandler/GameEventList.d.ts
vendored
Normal file
3
build/PacketHandler/GameEventList.d.ts
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
import { GameEventListPacket } from '../Data/Packet';
|
||||
import { ParserState } from '../Data/ParserState';
|
||||
export declare function handleGameEventList(packet: GameEventListPacket, state: ParserState): void;
|
||||
10
build/PacketHandler/GameEventList.js
Normal file
10
build/PacketHandler/GameEventList.js
Normal 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
|
||||
1
build/PacketHandler/GameEventList.js.map
Normal file
1
build/PacketHandler/GameEventList.js.map
Normal 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"}
|
||||
4
build/PacketHandler/HL2DMEntityHandler.d.ts
vendored
Normal file
4
build/PacketHandler/HL2DMEntityHandler.d.ts
vendored
Normal 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;
|
||||
215
build/PacketHandler/HL2DMEntityHandler.js
Normal file
215
build/PacketHandler/HL2DMEntityHandler.js
Normal 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
|
||||
1
build/PacketHandler/HL2DMEntityHandler.js.map
Normal file
1
build/PacketHandler/HL2DMEntityHandler.js.map
Normal file
File diff suppressed because one or more lines are too long
6
build/PacketHandler/PacketEntities.d.ts
vendored
Normal file
6
build/PacketHandler/PacketEntities.d.ts
vendored
Normal 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;
|
||||
36
build/PacketHandler/PacketEntities.js
Normal file
36
build/PacketHandler/PacketEntities.js
Normal 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
|
||||
1
build/PacketHandler/PacketEntities.js.map
Normal file
1
build/PacketHandler/PacketEntities.js.map
Normal 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
3
build/PacketHandler/SayText2.d.ts
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
import { Match } from '../Data/Match';
|
||||
import { SayText2Packet } from '../Data/UserMessage';
|
||||
export declare function handleSayText2(packet: SayText2Packet, match: Match): void;
|
||||
20
build/PacketHandler/SayText2.js
Normal file
20
build/PacketHandler/SayText2.js
Normal 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
|
||||
1
build/PacketHandler/SayText2.js.map
Normal file
1
build/PacketHandler/SayText2.js.map
Normal 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
7
build/PacketHandler/StringTable.d.ts
vendored
Normal 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;
|
||||
76
build/PacketHandler/StringTable.js
Normal file
76
build/PacketHandler/StringTable.js
Normal 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
|
||||
1
build/PacketHandler/StringTable.js.map
Normal file
1
build/PacketHandler/StringTable.js.map
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"StringTable.js","sourceRoot":"","sources":["../../src/PacketHandler/StringTable.ts"],"names":[],"mappings":"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"}
|
||||
4
build/PacketHandler/TFEntityHandler.d.ts
vendored
Normal file
4
build/PacketHandler/TFEntityHandler.d.ts
vendored
Normal 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;
|
||||
447
build/PacketHandler/TFEntityHandler.js
Normal file
447
build/PacketHandler/TFEntityHandler.js
Normal 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
|
||||
1
build/PacketHandler/TFEntityHandler.js.map
Normal file
1
build/PacketHandler/TFEntityHandler.js.map
Normal file
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue