From 0f9e7d4848e6d0a0f093fd714bcc9f2c5f6c7446 Mon Sep 17 00:00:00 2001 From: Taken Date: Sat, 13 Sep 2025 21:02:51 +0200 Subject: [PATCH] Added duels kits stats table --- .../player/[ign]/_stats/blitz/blitz.tsx | 3 +- .../player/[ign]/_stats/blitz/table.tsx | 57 ++++++++++++++++++- src/lib/hypixel/blitz/general.ts | 49 +++++++++++++++- src/lib/schema/stats.ts | 17 ++++-- 4 files changed, 119 insertions(+), 7 deletions(-) diff --git a/src/app/(stats)/player/[ign]/_stats/blitz/blitz.tsx b/src/app/(stats)/player/[ign]/_stats/blitz/blitz.tsx index d58857b..e314f0d 100644 --- a/src/app/(stats)/player/[ign]/_stats/blitz/blitz.tsx +++ b/src/app/(stats)/player/[ign]/_stats/blitz/blitz.tsx @@ -6,7 +6,7 @@ import { NonNullStats } from "@/lib/schema/player" import { cn } from "@/lib/utils" import GeneralStats from "../GeneralStats" import BlitzGeneralStats from "./stats" -import { BlitzModeStatsTable } from "./table" +import { BlitzKitStatsTable, BlitzModeStatsTable } from "./table" export default function BlitzStats({ stats }: { stats: NonNullStats["Blitz"] }) { if (!stats) return null @@ -47,6 +47,7 @@ export default function BlitzStats({ stats }: { stats: NonNullStats["Blitz"] }) + ) } diff --git a/src/app/(stats)/player/[ign]/_stats/blitz/table.tsx b/src/app/(stats)/player/[ign]/_stats/blitz/table.tsx index 0a3d973..9225806 100644 --- a/src/app/(stats)/player/[ign]/_stats/blitz/table.tsx +++ b/src/app/(stats)/player/[ign]/_stats/blitz/table.tsx @@ -1,6 +1,9 @@ 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 { cn } from "@/lib/utils" export function BlitzModeStatsTable({ stats }: { stats: NonNullable }) { return ( @@ -27,3 +30,55 @@ export function BlitzModeStatsTable({ stats }: { stats: NonNullable ) } + +export function BlitzKitStatsTableHeader() { + const headerElements = [ + "Kit", + "Exp", + "Prestige", + "Kills", + "Wins", + "Losses", + "WL", + "Time Played" + ] + + return ( + + + {headerElements.map((v, i) => {v})} + + + ) +} + +export function BlitzKitStatsTable({ stats }: { stats: NonNullable }) { + const kitStats = getAllBlitzKitStats(stats) + return ( + + + + {kitStats.map((r, i) => { + const { id, nums } = r + const kitName = getBlitzKitName(id) + const kitLevel = getBlitzKitLevel(id, stats) + const mostPlayed = getBlitzMostPlayedKit(stats)?.id + return ( + + {`${kitName} ${romanize(kitLevel)}`} + {nums.map((v, j) => { + if (j === nums.length - 1) { + return {formatSecondsToTime(v)} + } + if (j === 1) { + return {v === 0 ? "-" : romanize(v)} + } + return {formatNumber(v)} + })} + + ) + })} + +
+ ) +} diff --git a/src/lib/hypixel/blitz/general.ts b/src/lib/hypixel/blitz/general.ts index 780343a..93dbb63 100644 --- a/src/lib/hypixel/blitz/general.ts +++ b/src/lib/hypixel/blitz/general.ts @@ -1,5 +1,21 @@ -import { KITS } from "@/data/hypixel/blitz" +import { KITEXP, KITS } from "@/data/hypixel/blitz" import { NonNullStats } from "@/lib/schema/player" +import { devide } from "../general" + +export function getBlitzKitLevel(kitId: typeof KITS[number]["id"], stats: NonNullable) { + 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) { let mostPlayedKit: typeof KITS[number] | null = null @@ -15,3 +31,34 @@ export function getBlitzMostPlayedKit(stats: NonNullable) return mostPlayedKit } + +export function getBlitzKitName(kitId: typeof KITS[number]["id"]) { + return KITS.find(k => k.id === kitId)!.name +} + +export function getAllBlitzKitStats(stats: NonNullable) { + 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) { + 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}`] + ] +} diff --git a/src/lib/schema/stats.ts b/src/lib/schema/stats.ts index a72900f..9736fc2 100644 --- a/src/lib/schema/stats.ts +++ b/src/lib/schema/stats.ts @@ -837,22 +837,30 @@ function blitzKitPlayedStats() { ] as const const stats = [ - "time_played" + "wins", + "wins_teams", + "time_played", + "exp", + "kills", + "games_played" ] as const const entries = new Map>() const kits = new Map>() + const prestiges = new Map>() for (const id of ids) { for (const stat of stats) { 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 { stats: Object.fromEntries(entries) as Record<`${typeof stats[number]}_${typeof ids[number]}`, z.ZodDefault>, - kits: Object.fromEntries(entries) as Record<`${typeof ids[number]}`, z.ZodDefault> + kits: Object.fromEntries(kits) as Record<`${typeof ids[number]}`, z.ZodDefault>, + prestiges: Object.fromEntries(prestiges) as Record<`p${typeof ids[number]}`, z.ZodDefault> } } @@ -867,5 +875,6 @@ export const blitzStatsSchema = z.object({ damage: z.number().default(0), damage_taken: z.number().default(0), ...blitzKitPlayedStats().stats, - ...blitzKitPlayedStats().kits + ...blitzKitPlayedStats().kits, + ...blitzKitPlayedStats().prestiges })