Overhauled classic stats and added quakecraftr

This commit is contained in:
2025-09-22 13:01:32 +02:00
parent c04d8aae18
commit acf5f3b36d
10 changed files with 72 additions and 64 deletions

View File

@@ -17,7 +17,11 @@ import ArcadeStats from "./_stats/arcade/arcade"
import BedwarsStats from "./_stats/bedwars/bedwars" import BedwarsStats from "./_stats/bedwars/bedwars"
import BlitzStats from "./_stats/blitz/blitz" import BlitzStats from "./_stats/blitz/blitz"
import BuildBattleStats from "./_stats/build-battle/build-battle" import BuildBattleStats from "./_stats/build-battle/build-battle"
import ClassicStats from "./_stats/classic/classic" import ArenaBrawlStats from "./_stats/classic/arenabrawl"
import PaintballStats from "./_stats/classic/paintball"
import QuakecraftStats from "./_stats/classic/quakecraft"
import VampireZStats from "./_stats/classic/vampirez"
import WallsStats from "./_stats/classic/walls"
import CopsAndCrimsStats from "./_stats/copsandcrims/copsandcrims" import CopsAndCrimsStats from "./_stats/copsandcrims/copsandcrims"
import DuelsStats from "./_stats/duels/duels" import DuelsStats from "./_stats/duels/duels"
import MegaWallsStats from "./_stats/megawalls/megawalls" import MegaWallsStats from "./_stats/megawalls/megawalls"
@@ -101,16 +105,11 @@ export function PlayerStats(
"speeduhc": <SpeedUHCStats stats={stats.SpeedUHC} uhcCoins={stats.UHC?.coins} />, "speeduhc": <SpeedUHCStats stats={stats.SpeedUHC} uhcCoins={stats.UHC?.coins} />,
"smashheros": <SmashHerosStats stats={stats.SmashHeros} />, "smashheros": <SmashHerosStats stats={stats.SmashHeros} />,
"warlords": <WarlordsStats stats={stats.Warlords} />, "warlords": <WarlordsStats stats={stats.Warlords} />,
"classic": ( "arenabrawl": <ArenaBrawlStats stats={stats.ArenaBrawl} />,
<ClassicStats "paintball": <PaintballStats stats={stats.Paintball} />,
stats={{ "walls": <WallsStats stats={stats.Walls} />,
arena: stats.ArenaBrawl, "vampirez": <VampireZStats stats={stats.VampireZ} />,
paintball: stats.Paintball, "quakecraft": <QuakecraftStats stats={stats.Quakecraft} />
walls: stats.Walls,
vampirez: stats.VampireZ
}}
/>
)
} as const } as const
const defaultOrder = Object.keys(statsComponents) const defaultOrder = Object.keys(statsComponents)

View File

@@ -19,7 +19,7 @@ export default function ArenaBrawlStats({ stats }: { stats: NonNullStats["ArenaB
return ( return (
<GeneralStats <GeneralStats
id="classic-arena" id="arenabrawl"
title="Arena Brawl" title="Arena Brawl"
collapsedStats={[ collapsedStats={[
{ {

View File

@@ -1,46 +0,0 @@
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"
import PaintballStats from "./paintball"
import VampireZStats from "./vampirez"
import WallsStats from "./walls"
export default function ClassicStats(
{ stats }: {
stats: {
arena: NonNullStats["ArenaBrawl"]
paintball: NonNullStats["Paintball"]
walls: NonNullStats["Walls"]
vampirez: NonNullStats["VampireZ"]
}
}
) {
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 space-y-4 mx-auto w-[95%]">
<ArenaBrawlStats stats={stats.arena} />
<PaintballStats stats={stats.paintball} />
<WallsStats stats={stats.walls} />
<VampireZStats stats={stats.vampirez} />
</AccordionContent>
</AccordionItem>
)
}

View File

@@ -12,7 +12,7 @@ export default function PaintballStats({ stats }: { stats: NonNullStats["Paintba
return ( return (
<GeneralStats <GeneralStats
id="classic-paintball" id="paintball"
title="Paintball" title="Paintball"
collapsedStats={[ collapsedStats={[
{ {

View File

@@ -0,0 +1,34 @@
import { Separator } from "@/components/ui/separator"
import { formatNumber } from "@/lib/formatters"
import { devide } from "@/lib/hypixel/general"
import { NonNullStats } from "@/lib/schema/player"
import { EmptyStats, GeneralStats } from "../stats-components"
export default function QuakecraftStats({ stats }: { stats: NonNullStats["Quakecraft"] }) {
if (!stats) return <EmptyStats title="Quakecraft" />
const kd = formatNumber(devide(stats.kills + stats.kills_teams, stats.deaths + stats.deaths_teams))
return (
<GeneralStats
id="quakecraft"
title="Quakecraft"
collapsedStats={[
{
title: <p>Kills</p>,
stat: <p className="text-muted-foreground">{formatNumber(stats.kills + stats.kills_teams)}</p>
},
{
title: <p>KD</p>,
stat: <p className="text-muted-foreground">{kd}</p>
},
{
title: <p>Wins</p>,
stat: <p className="text-muted-foreground">{formatNumber(stats.wins + stats.wins_teams)}</p>
}
]}
>
<Separator className="my-4" />
</GeneralStats>
)
}

View File

@@ -13,7 +13,7 @@ export default function VampireZStats({ stats }: { stats: NonNullStats["VampireZ
return ( return (
<GeneralStats <GeneralStats
id="classic-vampirez" id="vampirez"
title="VampireZ" title="VampireZ"
collapsedStats={[ collapsedStats={[
{ {

View File

@@ -13,7 +13,7 @@ export default function WallsStats({ stats }: { stats: NonNullStats["Walls"] })
return ( return (
<GeneralStats <GeneralStats
id="classic-walls" id="walls"
title="Walls" title="Walls"
collapsedStats={[ collapsedStats={[
{ {

View File

@@ -3,3 +3,7 @@ export const ARENABRAWLMODES = [
{ id: "2v2", name: "2v2" }, { id: "2v2", name: "2v2" },
{ id: "4v4", name: "4v4" } { id: "4v4", name: "4v4" }
] as const ] as const
export const QUAKECRAFTMODES = [
{ id: "", name: "Solo" },
{ id: "teams", name: "Teams" }
] as const

View File

@@ -3,7 +3,7 @@ import { arcadeStatsSchema } from "./stats/arcade"
import { bedwarsStatsSchema } from "./stats/bedwars" import { bedwarsStatsSchema } from "./stats/bedwars"
import { blitzStatsSchema } from "./stats/blitz" import { blitzStatsSchema } from "./stats/blitz"
import { buildBattleStatsSchema } from "./stats/build-battle" import { buildBattleStatsSchema } from "./stats/build-battle"
import { arenaBrawlStatsSchema, paintBallStatsSchema, vampireZStatsSchema, wallsStatsSchema } from "./stats/classic" import { arenaBrawlStatsSchema, paintBallStatsSchema, quakecraftStatsSchema, vampireZStatsSchema, wallsStatsSchema } from "./stats/classic"
import { copsAndCrimsStatsSchema } from "./stats/copsandcrims" import { copsAndCrimsStatsSchema } from "./stats/copsandcrims"
import { duelsStatsSchema } from "./stats/duels" import { duelsStatsSchema } from "./stats/duels"
import { megawallsStats } from "./stats/megawalls" import { megawallsStats } from "./stats/megawalls"
@@ -49,8 +49,9 @@ export const playerSchema = z.looseObject({
Arena: arenaBrawlStatsSchema.optional(), Arena: arenaBrawlStatsSchema.optional(),
Paintball: paintBallStatsSchema.optional(), Paintball: paintBallStatsSchema.optional(),
Walls: wallsStatsSchema.optional(), Walls: wallsStatsSchema.optional(),
VampireZ: vampireZStatsSchema.optional() VampireZ: vampireZStatsSchema.optional(),
}).transform(({ Walls3, MCGO, HungerGames, SuperSmash, Battleground, Arena, ...rest }) => { Quake: quakecraftStatsSchema.optional()
}).transform(({ Walls3, MCGO, HungerGames, SuperSmash, Battleground, Arena, Quake, ...rest }) => {
return { return {
MegaWalls: Walls3, MegaWalls: Walls3,
CopsAndCrims: MCGO, CopsAndCrims: MCGO,
@@ -58,6 +59,7 @@ export const playerSchema = z.looseObject({
SmashHeros: SuperSmash, SmashHeros: SuperSmash,
Warlords: Battleground, Warlords: Battleground,
ArenaBrawl: Arena, ArenaBrawl: Arena,
Quakecraft: Quake,
...rest ...rest
} }
}).optional(), }).optional(),

View File

@@ -48,3 +48,18 @@ export const vampireZStatsSchema = z.object({
human_wins: z.number().default(0), human_wins: z.number().default(0),
zombie_kills: z.number().default(0) zombie_kills: z.number().default(0)
}) })
export const quakecraftStatsSchema = z.object({
kills: z.number().default(0),
deaths: z.number().default(0),
wins: z.number().default(0),
headshots: z.number().default(0),
kills_since_update_feb_2017: z.number().default(0),
shots_fired: z.number().default(0),
kills_teams: z.number().default(0),
deaths_teams: z.number().default(0),
wins_teams: z.number().default(0),
headshots_teams: z.number().default(0),
kills_since_update_feb_2017_teams: z.number().default(0),
shots_fired_teams: z.number().default(0)
})