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
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ export function KillFeed(props: KillFeedProps) {
|
|||
</ul>
|
||||
}
|
||||
|
||||
const teamMap = {
|
||||
export const teamMap = {
|
||||
0: 'unknown',
|
||||
2: 'red',
|
||||
3: 'blue'
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue