add ubers and building destruction in event filter

This commit is contained in:
Robin Appelman 2024-12-08 15:38:29 +01:00
commit 29d569b93b
6 changed files with 110 additions and 12 deletions

8
package-lock.json generated
View file

@ -6,7 +6,7 @@
"": {
"dependencies": {
"@demostf/edit": "0.2.0",
"@demostf/tf-demos-viewer": "^0.2.0",
"@demostf/tf-demos-viewer": "^0.2.1",
"@lutaok/solid-modal": "^0.1.1",
"@solid-primitives/autofocus": "^0.0.111",
"@solid-primitives/keyboard": "^1.2.8",
@ -23,9 +23,9 @@
"integrity": "sha512-s9wk3QVm+aTpMhIyfdGIHRm5qHp7FQ1dq/Jn0fms+lXsB1xY3wgjfWH+5gwRjjo/Dd3UMNM0o3atjO2uh+CxOQ=="
},
"node_modules/@demostf/tf-demos-viewer": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/@demostf/tf-demos-viewer/-/tf-demos-viewer-0.2.0.tgz",
"integrity": "sha512-Ef/hlTGWPknog1mXnJJ2Uz158Ud6vyLaUBlQ7j1rI/772zKmVeQEfnKY5ut5ZlfoELwNH5Aj3+QBSqSU/DV19A=="
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/@demostf/tf-demos-viewer/-/tf-demos-viewer-0.2.1.tgz",
"integrity": "sha512-YDDi+hBMWYpVimQ4Y2YAnm7yAuFpRpmf8ZSgKBAdpSfUUSKVnlYuVeri4yZIYOHS2fLRYUAg2OH5J/ejumiOlg=="
},
"node_modules/@lutaok/solid-modal": {
"version": "0.1.1",

View file

@ -1,7 +1,7 @@
{
"dependencies": {
"@demostf/edit": "0.2.0",
"@demostf/tf-demos-viewer": "^0.2.0",
"@demostf/tf-demos-viewer": "^0.2.1",
"@lutaok/solid-modal": "^0.1.1",
"@solid-primitives/autofocus": "^0.0.111",
"@solid-primitives/keyboard": "^1.2.8",

View file

@ -1,6 +1,6 @@
import {
get_assister_ids,
get_attacker_ids, get_data,
get_attacker_ids, get_data, get_event_count, get_event,
get_kill_ticks,
get_map, get_player_entity_id,
get_player_name, get_player_steam_id, get_player_user_id, get_victim_ids, get_weapon,
@ -52,7 +52,6 @@ export async function parseDemo(bytes: Uint8Array, progressCallback: (progress:
}
let map = get_map(state);
let data = get_data(state);
let events = kills.map((kill: Kill) => {
return {
@ -61,6 +60,17 @@ export async function parseDemo(bytes: Uint8Array, progressCallback: (progress:
kill
} as Event
});
let event_count = get_event_count(state);
for (let i = 0; i < event_count; i++) {
let event = get_event(state, i);
event = JSON.parse(event);
if (event) {
events.push(event);
}
}
events.sort((a, b) => a.tick - b.tick);
let data = get_data(state);
return new ParsedDemo(
playerCount,
@ -338,4 +348,23 @@ export type KillEvent = {
kill: Kill,
}
export type Event = KillEvent;
export type UberEvent = {
type: "uber";
tick: number,
user_id: number,
target_id: number,
}
export type RawBuildingType = "dispenser" | "teleporter" | "sentrygun";
export type BuildingDestroyedEvent = {
type: "building_destroyed";
tick: number,
attacker_id: number,
assister_id: number,
victim_id: number,
weapon: string,
building_type: RawBuildingType,
}
export type Event = KillEvent | UberEvent | BuildingDestroyedEvent;

View file

@ -1,6 +1,6 @@
import {Class, Event, Kill, PlayerState} from "./Data/Parser";
import {BuildingDestroyedEvent, Class, Event, Kill, PlayerState, UberEvent} from "./Data/Parser";
import {createEffect, createSignal, For, Show, untrack} from "solid-js";
import {getPlayer, KillIcon, PlayerName, PlayerNames} from "./Render/KillFeed";
import {getPlayer, KillIcon, PlayerName, PlayerNames, teamMap} from "./Render/KillFeed";
import {autofocus} from "@solid-primitives/autofocus";
import {useKeyDownEvent} from "@solid-primitives/keyboard";
@ -76,6 +76,12 @@ function EventView(props: EventViewProps) {
<Show when={props.event.type == "kill"}>
<KillView kill={props.event.kill} players={props.players}/>
</Show>
<Show when={props.event.type == "building_destroyed"}>
<BuildingDestroyedView event={props.event} players={props.players}/>
</Show>
<Show when={props.event.type == "uber"}>
<UberView event={props.event} players={props.players}/>
</Show>
</tr>
);
}
@ -106,6 +112,58 @@ function KillView(props: KillViewProps) {
</>
}
interface BuildingDestroyedViewProps {
event: BuildingDestroyedEvent;
f
players: PlayerState[];
}
function BuildingDestroyedView(props: BuildingDestroyedViewProps) {
const attacker = getPlayer(props.players, props.event.attacker_id);
const assister = getPlayer(props.players, props.event.assister_id);
let victim = getPlayer(props.players, props.event.victim_id);
return <>
<td class="kill-source">
<PlayerNames players={[attacker, assister]}/>
</td>
<td class="kill-icon">
<KillIcon kill={props.event}/>
</td>
<td className="kill-target">
<PlayerName player={victim}/><span class={teamMap[victim.team]}>({props.event.building_type})</span>
</td>
<td className="tick">
#{props.event.tick}
</td>
</>
}
interface UberViewProps {
event: UberEvent;
players: PlayerState[];
}
function UberView(props: UberViewProps) {
const medic = getPlayer(props.players, props.event.user_id);
const target = getPlayer(props.players, props.event.target_id);
return <>
<td class="kill-source">
<PlayerName player={medic}/>
</td>
<td class="kill-icon">
ubered
</td>
<td className="kill-target">
<PlayerName player={target}/>
</td>
<td className="tick">
#{props.event.tick}
</td>
</>
}
function filterEvents(events: Event[], players: PlayerState[], query: string): Event[] {
if (query === '') {
return events;
@ -152,6 +210,17 @@ function eventMatches(event: Event, matchedPlayers: number[], queryPart: string)
return matchedPlayers.includes(kill.attacker) ||
matchedPlayers.includes(kill.assister) ||
matchedPlayers.includes(kill.victim);
} else if (event.type === "building_destroyed") {
return queryPart === "destroyed" ||
matchedPlayers.includes(event.attacker_id) ||
matchedPlayers.includes(event.assister_id) ||
matchedPlayers.includes(event.victim_id) ||
event.weapon.includes(queryPart) ||
event.building_type.includes(queryPart);
} else if (event.type === "uber") {
return queryPart === "uber" ||
matchedPlayers.includes(event.user_id) ||
matchedPlayers.includes(event.target_id);
} else {
return false;
}

View file

@ -19,7 +19,7 @@ export function KillFeed(props: KillFeedProps) {
</ul>
}
const teamMap = {
export const teamMap = {
0: 'unknown',
2: 'red',
3: 'blue'

View file

@ -23,7 +23,7 @@ table.event-list {
padding: 0 3px;
}
.kill {
tr {
& .red {
color: #a75d50;
}