mirror of
https://codeberg.org/demostf/frontend.git
synced 2026-06-03 18:24:12 +02:00
add ubers and building destruction in event filter
This commit is contained in:
parent
79a8390fc4
commit
29d569b93b
6 changed files with 110 additions and 12 deletions
8
package-lock.json
generated
8
package-lock.json
generated
|
|
@ -6,7 +6,7 @@
|
||||||
"": {
|
"": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@demostf/edit": "0.2.0",
|
"@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",
|
"@lutaok/solid-modal": "^0.1.1",
|
||||||
"@solid-primitives/autofocus": "^0.0.111",
|
"@solid-primitives/autofocus": "^0.0.111",
|
||||||
"@solid-primitives/keyboard": "^1.2.8",
|
"@solid-primitives/keyboard": "^1.2.8",
|
||||||
|
|
@ -23,9 +23,9 @@
|
||||||
"integrity": "sha512-s9wk3QVm+aTpMhIyfdGIHRm5qHp7FQ1dq/Jn0fms+lXsB1xY3wgjfWH+5gwRjjo/Dd3UMNM0o3atjO2uh+CxOQ=="
|
"integrity": "sha512-s9wk3QVm+aTpMhIyfdGIHRm5qHp7FQ1dq/Jn0fms+lXsB1xY3wgjfWH+5gwRjjo/Dd3UMNM0o3atjO2uh+CxOQ=="
|
||||||
},
|
},
|
||||||
"node_modules/@demostf/tf-demos-viewer": {
|
"node_modules/@demostf/tf-demos-viewer": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/@demostf/tf-demos-viewer/-/tf-demos-viewer-0.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@demostf/tf-demos-viewer/-/tf-demos-viewer-0.2.1.tgz",
|
||||||
"integrity": "sha512-Ef/hlTGWPknog1mXnJJ2Uz158Ud6vyLaUBlQ7j1rI/772zKmVeQEfnKY5ut5ZlfoELwNH5Aj3+QBSqSU/DV19A=="
|
"integrity": "sha512-YDDi+hBMWYpVimQ4Y2YAnm7yAuFpRpmf8ZSgKBAdpSfUUSKVnlYuVeri4yZIYOHS2fLRYUAg2OH5J/ejumiOlg=="
|
||||||
},
|
},
|
||||||
"node_modules/@lutaok/solid-modal": {
|
"node_modules/@lutaok/solid-modal": {
|
||||||
"version": "0.1.1",
|
"version": "0.1.1",
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@demostf/edit": "0.2.0",
|
"@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",
|
"@lutaok/solid-modal": "^0.1.1",
|
||||||
"@solid-primitives/autofocus": "^0.0.111",
|
"@solid-primitives/autofocus": "^0.0.111",
|
||||||
"@solid-primitives/keyboard": "^1.2.8",
|
"@solid-primitives/keyboard": "^1.2.8",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import {
|
import {
|
||||||
get_assister_ids,
|
get_assister_ids,
|
||||||
get_attacker_ids, get_data,
|
get_attacker_ids, get_data, get_event_count, get_event,
|
||||||
get_kill_ticks,
|
get_kill_ticks,
|
||||||
get_map, get_player_entity_id,
|
get_map, get_player_entity_id,
|
||||||
get_player_name, get_player_steam_id, get_player_user_id, get_victim_ids, get_weapon,
|
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 map = get_map(state);
|
||||||
let data = get_data(state);
|
|
||||||
|
|
||||||
let events = kills.map((kill: Kill) => {
|
let events = kills.map((kill: Kill) => {
|
||||||
return {
|
return {
|
||||||
|
|
@ -61,6 +60,17 @@ export async function parseDemo(bytes: Uint8Array, progressCallback: (progress:
|
||||||
kill
|
kill
|
||||||
} as Event
|
} 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(
|
return new ParsedDemo(
|
||||||
playerCount,
|
playerCount,
|
||||||
|
|
@ -338,4 +348,23 @@ export type KillEvent = {
|
||||||
kill: Kill,
|
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;
|
||||||
|
|
@ -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 {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 {autofocus} from "@solid-primitives/autofocus";
|
||||||
import {useKeyDownEvent} from "@solid-primitives/keyboard";
|
import {useKeyDownEvent} from "@solid-primitives/keyboard";
|
||||||
|
|
||||||
|
|
@ -76,6 +76,12 @@ function EventView(props: EventViewProps) {
|
||||||
<Show when={props.event.type == "kill"}>
|
<Show when={props.event.type == "kill"}>
|
||||||
<KillView kill={props.event.kill} players={props.players}/>
|
<KillView kill={props.event.kill} players={props.players}/>
|
||||||
</Show>
|
</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>
|
</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[] {
|
function filterEvents(events: Event[], players: PlayerState[], query: string): Event[] {
|
||||||
if (query === '') {
|
if (query === '') {
|
||||||
return events;
|
return events;
|
||||||
|
|
@ -152,6 +210,17 @@ function eventMatches(event: Event, matchedPlayers: number[], queryPart: string)
|
||||||
return matchedPlayers.includes(kill.attacker) ||
|
return matchedPlayers.includes(kill.attacker) ||
|
||||||
matchedPlayers.includes(kill.assister) ||
|
matchedPlayers.includes(kill.assister) ||
|
||||||
matchedPlayers.includes(kill.victim);
|
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 {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ export function KillFeed(props: KillFeedProps) {
|
||||||
</ul>
|
</ul>
|
||||||
}
|
}
|
||||||
|
|
||||||
const teamMap = {
|
export const teamMap = {
|
||||||
0: 'unknown',
|
0: 'unknown',
|
||||||
2: 'red',
|
2: 'red',
|
||||||
3: 'blue'
|
3: 'blue'
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ table.event-list {
|
||||||
padding: 0 3px;
|
padding: 0 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.kill {
|
tr {
|
||||||
& .red {
|
& .red {
|
||||||
color: #a75d50;
|
color: #a75d50;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue