Added arena brawl stats card

This commit is contained in:
2025-09-20 19:57:05 +02:00
parent a874f586fb
commit eaf0e02d28
10 changed files with 249 additions and 4 deletions

View File

@@ -16,6 +16,7 @@ import ArcadeStats from "./_stats/arcade/arcade"
import BedwarsStats from "./_stats/bedwars/bedwars"
import BlitzStats from "./_stats/blitz/blitz"
import BuildBattleStats from "./_stats/build-battle/build-battle"
import ClassicStats from "./_stats/classic/classic"
import CopsAndCrimsStats from "./_stats/copsandcrims/copsandcrims"
import DuelsStats from "./_stats/duels/duels"
import MegaWallsStats from "./_stats/megawalls/megawalls"
@@ -98,7 +99,8 @@ export function PlayerStats(
"arcade": <ArcadeStats stats={stats.Arcade} />,
"speeduhc": <SpeedUHCStats stats={stats.SpeedUHC} uhcCoins={stats.UHC?.coins} />,
"smashheros": <SmashHerosStats stats={stats.SmashHeros} />,
"warlords": <WarlordsStats stats={stats.Warlords} />
"warlords": <WarlordsStats stats={stats.Warlords} />,
"classic": <ClassicStats arenaBrawlStats={stats.ArenaBrawl} />
} as const
const defaultOrder = Object.keys(statsComponents)

View File

@@ -0,0 +1,46 @@
import { Separator } from "@/components/ui/separator"
import { formatNumber } from "@/lib/formatters"
import { devide } from "@/lib/hypixel/general"
import { NonNullStats } from "@/lib/schema/player"
import GeneralStats from "../GeneralStats"
import { ArenaBrawlGeneralStats } from "./stats"
import { ArenaBrawlModeStatsTable } from "./table"
export default function ArenaBrawlStats({ stats }: { stats: NonNullStats["ArenaBrawl"] }) {
if (!stats) return null
const kills = stats.kills_1v1 + stats.kills_2v2 + stats.kills_4v4
const deaths = stats.deaths_1v1 + stats.deaths_2v2 + stats.deaths_4v4
const wins = stats.wins_1v1 + stats.wins_2v2 + stats.wins_4v4
const losses = stats.losses_1v1 + stats.losses_2v2 + stats.losses_4v4
const ws = stats.win_streaks_1v1 + stats.win_streaks_2v2 + stats.win_streaks_4v4
const kd = formatNumber(devide(kills, deaths))
const wl = formatNumber(devide(wins, losses))
return (
<GeneralStats
id="classic-arena"
title="Arena Brawl"
collapsedStats={[
{
title: <p>KD</p>,
stat: <p className="text-muted-foreground">{kd}</p>
},
{
title: <p>Wins</p>,
stat: <p className="text-muted-foreground">{formatNumber(wins)}</p>
},
{
title: <p>WL</p>,
stat: <p className="text-muted-foreground">{wl}</p>
}
]}
>
<Separator className="my-4" />
<ArenaBrawlGeneralStats coins={stats.coins} keys={stats.keys} ws={ws} />
<Separator className="my-4" />
<ArenaBrawlModeStatsTable stats={stats} />
<Separator className="my-4" />
</GeneralStats>
)
}

View File

@@ -0,0 +1,31 @@
import { AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion"
import { Card, CardContent } from "@/components/ui/card"
import { NonNullStats } from "@/lib/schema/player"
import { cn } from "@/lib/utils"
import CollapsedStats from "../../_components/CollapsedStats"
import ArenaBrawlStats from "./arenabrawl"
export default function ClassicStats({ arenaBrawlStats }: { arenaBrawlStats: NonNullStats["ArenaBrawl"] }) {
return (
<AccordionItem value="classic">
<Card className="py-0">
<CardContent>
<AccordionTrigger className={cn("items-center py-2 hover:no-underline hover:cursor-pointer overflow-y-auto")}>
<h1 className="text-xl font-bold">Classic</h1>
<div className="flex gap-4">
<CollapsedStats
stats={[{
title: <p>Modes</p>,
stat: <p className="text-muted-foreground">Arena Brawl | Paintball | Quakecraft | TKR | VampireZ | Walls</p>
}]}
/>
</div>
</AccordionTrigger>
</CardContent>
</Card>
<AccordionContent className="pt-4 mx-auto w-[95%]">
<ArenaBrawlStats stats={arenaBrawlStats} />
</AccordionContent>
</AccordionItem>
)
}

View File

@@ -0,0 +1,12 @@
import { formatNumber } from "@/lib/formatters"
import { BasicStat } from "../../_components/Stats"
export function ArenaBrawlGeneralStats({ coins, keys, ws }: { coins: number, keys: number, ws: number }) {
return (
<div>
<BasicStat title="Coins: " value={formatNumber(coins)} className="text-mc-gold" />
<BasicStat title="Keys: " value={formatNumber(keys)} className="text-mc-aqua" />
<BasicStat title="Win Streaks: " value={formatNumber(ws)} className="text-mc-yellow" />
</div>
)
}

View File

@@ -0,0 +1,69 @@
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { formatNumber } from "@/lib/formatters"
import { getArenaBrawlModeName, getArenaBrawlModeStats, getArenaBrawlMostPlayedMode, getArenaBrawlOverallStats } from "@/lib/hypixel/classic/general"
import { NonNullStats } from "@/lib/schema/player"
import { cn } from "@/lib/utils"
export function ArenaBrawlModeStatsTable({ stats }: { stats: NonNullable<NonNullStats["ArenaBrawl"]> }) {
return (
<Table>
<ArenaBrawlModeStatsTableHeader />
<TableBody>
<ArenaBrawlModeStat modeId="1v1" stats={stats} />
<ArenaBrawlModeStat modeId="2v2" stats={stats} />
<ArenaBrawlModeStat modeId="4v4" stats={stats} />
<ArenaBrawlModeStat modeId="all" stats={stats} />
</TableBody>
</Table>
)
}
function ArenaBrawlModeStat(
{ modeId, stats }: { modeId: Parameters<typeof getArenaBrawlModeStats>[0] | "all", stats: NonNullable<NonNullStats["ArenaBrawl"]> }
) {
if (modeId === "all") {
const modeStats = getArenaBrawlOverallStats(stats)
return (
<TableRow className="font-bold">
<TableCell>Overall</TableCell>
{modeStats.map((v, i) => {
return <TableCell key={i}>{formatNumber(v)}</TableCell>
})}
</TableRow>
)
}
const modeStats = getArenaBrawlModeStats(modeId, stats)
const modeName = getArenaBrawlModeName(modeId)
const mostPlayed = getArenaBrawlMostPlayedMode(stats) === modeId
return (
<TableRow className={cn(mostPlayed && "text-mc-light-purple")}>
<TableCell>{modeName}</TableCell>
{modeStats.map((v, i) => {
return <TableCell key={i}>{formatNumber(v)}</TableCell>
})}
</TableRow>
)
}
function ArenaBrawlModeStatsTableHeader() {
const headerElements = [
"Mode",
"Kills",
"Deaths",
"KD",
"Wins",
"Losses",
"WL",
"Win Streaks"
]
return (
<TableHeader>
<TableRow>
{headerElements.map((v, i) => <TableHead key={i} className="font-bold">{v}</TableHead>)}
</TableRow>
</TableHeader>
)
}

View File

@@ -35,7 +35,7 @@ function WarlordsClassStatsTableStat(
const mostPlayed = getWarlordsMostPlayedClass(stats)?.id === classId
return (
<TableRow className={cn(mostPlayed && "text-mc-light-purple")}>
<TableRow className={cn(mostPlayed && "text-mc-light-purple", classId === "all" && "font-bold")}>
{classId === "all" ?
(
<TableCell>