import {Class, MedigunType, PlayerState, SpyState} from "../Data/Parser"; export interface PlayerSpecProps { player: PlayerState; onHover: (userId: number) => void; highlighted: boolean; } const healthMap = { 0: 100, //fallback 1: 125, //scout 2: 150, //sniper 3: 200, //soldier, 4: 175, //demoman, 5: 150, //medic, 6: 300, //heavy, 7: 175, //pyro 8: 125, //spy 9: 125, //engineer }; const classMap = { 1: "scout", 2: "sniper", 3: "soldier", 4: "demoman", 5: "medic", 6: "heavy", 7: "pyro", 8: "spy", 9: "engineer" }; const classSort = { 1: 1, //scout 3: 2, //soldier 7: 3, //pyro 4: 4, //demoman 6: 5, //heavy 9: 6, //engineer 5: 7, //medic 2: 8, //sniper 8: 9, //spy }; const teamMap = { 0: "other", 1: "spectator", 2: "red", 3: "blue", } export interface PlayersSpecProps { players: PlayerState[]; onHover: (userId: number) => void; highlighted: number; } function sortPlayer(a, b) { return classSort[a.playerClass] - classSort[b.playerClass]; } function filterPlayers(players: PlayerState[], team: number): PlayerState[] { const filtered = players.filter((player) => player.team === team); filtered.sort(sortPlayer); return filtered; } export function medics(players: PlayerState[]): PlayerState[] { return players.filter(player => player.playerClass === Class.Medic); } export function PlayersSpec(props: PlayersSpecProps) { const redPlayers = () => filterPlayers(props.players, 2); const bluePlayers = () => filterPlayers(props.players, 3); const redMedics = () => medics(redPlayers()); const blueMedics = () => medics(bluePlayers()); return (
{(player: PlayerState) => } {(player) => }
{(player) => } {(player) => }
); } export function PlayerSpec(props: PlayerSpecProps) { const healthPercent = () => Math.min(100, props.player.health / healthMap[props.player.playerClass] * 100); const healthStatusClass = () => (props.player.health > healthMap[props.player.playerClass]) ? 'overhealed' : (props.player.health <= 0 ? 'dead' : ''); return (
props.onHover(props.player.info.userId)} onmouseout={() => props.onHover(0)} classList={{ "playerspec": true, [teamMap[props.player.team]]: true, "webp": true, [healthStatusClass()]: true, highlighted: props.highlighted, }}> {getPlayerIcon(props.player)}
{props.player.info.name} {props.player.health}
); } function getPlayerIcon(player: PlayerState) { if (classMap[player.playerClass]) { const className = classMap[player.playerClass]; if (player.playerClass === Class.Spy && classMap[(player.class_data as SpyState).disguise_class]) { const disguiseClassName = classMap[(player.class_data as SpyState).disguise_class]; return (
) } else { return
} } else { return
} } export interface UberSpecProps { chargeLevel: number; medigun: MedigunType; team: string; isDeath: boolean; } export function UberSpec(props: UberSpecProps) { const healthStatusClass = (props.isDeath) ? 'dead' : ''; const medigunName = () => { switch (props.medigun) { case MedigunType.Kritzkrieg: return "Kritzkrieg"; case MedigunType.Quickfix: return "Quickfix"; case MedigunType.Vaccinator: return "Vaccinator"; default: return "Ubercharge"; } } return (
{medigunName()} {Math.round(props.chargeLevel)}
); }