Added duels kits stats table

This commit is contained in:
2025-09-13 21:02:51 +02:00
parent 42a49fb085
commit 0f9e7d4848
4 changed files with 119 additions and 7 deletions

View File

@@ -6,7 +6,7 @@ import { NonNullStats } from "@/lib/schema/player"
import { cn } from "@/lib/utils" import { cn } from "@/lib/utils"
import GeneralStats from "../GeneralStats" import GeneralStats from "../GeneralStats"
import BlitzGeneralStats from "./stats" import BlitzGeneralStats from "./stats"
import { BlitzModeStatsTable } from "./table" import { BlitzKitStatsTable, BlitzModeStatsTable } from "./table"
export default function BlitzStats({ stats }: { stats: NonNullStats["Blitz"] }) { export default function BlitzStats({ stats }: { stats: NonNullStats["Blitz"] }) {
if (!stats) return null if (!stats) return null
@@ -47,6 +47,7 @@ export default function BlitzStats({ stats }: { stats: NonNullStats["Blitz"] })
<Separator className="my-4" /> <Separator className="my-4" />
<BlitzModeStatsTable stats={stats} /> <BlitzModeStatsTable stats={stats} />
<Separator className="my-4" /> <Separator className="my-4" />
<BlitzKitStatsTable stats={stats} />
</GeneralStats> </GeneralStats>
) )
} }

View File

@@ -1,6 +1,9 @@
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { formatNumber } from "@/lib/formatters" import { formatNumber, formatSecondsToTime } from "@/lib/formatters"
import { getAllBlitzKitStats, getBlitzKitLevel, getBlitzKitName, getBlitzMostPlayedKit } from "@/lib/hypixel/blitz/general"
import { romanize } from "@/lib/hypixel/general"
import { NonNullStats } from "@/lib/schema/player" import { NonNullStats } from "@/lib/schema/player"
import { cn } from "@/lib/utils"
export function BlitzModeStatsTable({ stats }: { stats: NonNullable<NonNullStats["Blitz"]> }) { export function BlitzModeStatsTable({ stats }: { stats: NonNullable<NonNullStats["Blitz"]> }) {
return ( return (
@@ -27,3 +30,55 @@ export function BlitzModeStatsTable({ stats }: { stats: NonNullable<NonNullStats
</Table> </Table>
) )
} }
export function BlitzKitStatsTableHeader() {
const headerElements = [
"Kit",
"Exp",
"Prestige",
"Kills",
"Wins",
"Losses",
"WL",
"Time Played"
]
return (
<TableHeader>
<TableRow>
{headerElements.map((v, i) => <TableHead key={i} className="font-bold">{v}</TableHead>)}
</TableRow>
</TableHeader>
)
}
export function BlitzKitStatsTable({ stats }: { stats: NonNullable<NonNullStats["Blitz"]> }) {
const kitStats = getAllBlitzKitStats(stats)
return (
<Table>
<BlitzKitStatsTableHeader />
<TableBody>
{kitStats.map((r, i) => {
const { id, nums } = r
const kitName = getBlitzKitName(id)
const kitLevel = getBlitzKitLevel(id, stats)
const mostPlayed = getBlitzMostPlayedKit(stats)?.id
return (
<TableRow className={cn(mostPlayed === id && "text-mc-light-purple font-bold")} key={i}>
<TableCell className={cn(kitLevel === 10 && "text-mc-dark-red")}>{`${kitName} ${romanize(kitLevel)}`}</TableCell>
{nums.map((v, j) => {
if (j === nums.length - 1) {
return <TableCell key={j}>{formatSecondsToTime(v)}</TableCell>
}
if (j === 1) {
return <TableCell key={j}>{v === 0 ? "-" : romanize(v)}</TableCell>
}
return <TableCell key={j}>{formatNumber(v)}</TableCell>
})}
</TableRow>
)
})}
</TableBody>
</Table>
)
}

View File

@@ -1,5 +1,21 @@
import { KITS } from "@/data/hypixel/blitz" import { KITEXP, KITS } from "@/data/hypixel/blitz"
import { NonNullStats } from "@/lib/schema/player" import { NonNullStats } from "@/lib/schema/player"
import { devide } from "../general"
export function getBlitzKitLevel(kitId: typeof KITS[number]["id"], stats: NonNullable<NonNullStats["Blitz"]>) {
let level = stats[kitId]
if (level === -1) {
const exp = stats[`exp_${kitId}`]
for (const kitexp of KITEXP.slice()) {
if (exp >= kitexp) {
level++
} else {
break
}
}
}
return level + 1
}
export function getBlitzMostPlayedKit(stats: NonNullable<NonNullStats["Blitz"]>) { export function getBlitzMostPlayedKit(stats: NonNullable<NonNullStats["Blitz"]>) {
let mostPlayedKit: typeof KITS[number] | null = null let mostPlayedKit: typeof KITS[number] | null = null
@@ -15,3 +31,34 @@ export function getBlitzMostPlayedKit(stats: NonNullable<NonNullStats["Blitz"]>)
return mostPlayedKit return mostPlayedKit
} }
export function getBlitzKitName(kitId: typeof KITS[number]["id"]) {
return KITS.find(k => k.id === kitId)!.name
}
export function getAllBlitzKitStats(stats: NonNullable<NonNullStats["Blitz"]>) {
const nums: { id: typeof KITS[number]["id"], nums: number[] }[] = []
for (const kit of KITS) {
nums.push({ id: kit.id, nums: getBlitzKitStats(kit.id, stats) })
}
console.log(nums)
return nums
}
export function getBlitzKitStats(kitId: typeof KITS[number]["id"], stats: NonNullable<NonNullStats["Blitz"]>) {
const wins = stats[`wins_${kitId}`] + stats[`wins_teams_${kitId}`]
const losses = stats[`games_played_${kitId}`] - wins
return [
stats[`exp_${kitId}`],
stats[`p${kitId}`],
stats[`kills_${kitId}`],
wins,
losses,
devide(wins, losses),
stats[`time_played_${kitId}`]
]
}

View File

@@ -837,22 +837,30 @@ function blitzKitPlayedStats() {
] as const ] as const
const stats = [ const stats = [
"time_played" "wins",
"wins_teams",
"time_played",
"exp",
"kills",
"games_played"
] as const ] as const
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>() const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
const kits = new Map<string, z.ZodDefault<z.ZodNumber>>() const kits = new Map<string, z.ZodDefault<z.ZodNumber>>()
const prestiges = new Map<string, z.ZodDefault<z.ZodNumber>>()
for (const id of ids) { for (const id of ids) {
for (const stat of stats) { for (const stat of stats) {
entries.set(`${stat}_${id}`, z.number().default(0)) entries.set(`${stat}_${id}`, z.number().default(0))
kits.set(`${id}`, z.number().default(0)) kits.set(`${id}`, z.number().default(-1))
prestiges.set(`p${id}`, z.number().default(0))
} }
} }
return { return {
stats: Object.fromEntries(entries) as Record<`${typeof stats[number]}_${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>, stats: Object.fromEntries(entries) as Record<`${typeof stats[number]}_${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>,
kits: Object.fromEntries(entries) as Record<`${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>> kits: Object.fromEntries(kits) as Record<`${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>,
prestiges: Object.fromEntries(prestiges) as Record<`p${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>
} }
} }
@@ -867,5 +875,6 @@ export const blitzStatsSchema = z.object({
damage: z.number().default(0), damage: z.number().default(0),
damage_taken: z.number().default(0), damage_taken: z.number().default(0),
...blitzKitPlayedStats().stats, ...blitzKitPlayedStats().stats,
...blitzKitPlayedStats().kits ...blitzKitPlayedStats().kits,
...blitzKitPlayedStats().prestiges
}) })