Added paintball stats

This commit is contained in:
2025-09-21 19:02:54 +02:00
parent da65ced9fa
commit ae3f0124b5
6 changed files with 88 additions and 7 deletions

View File

@@ -100,7 +100,14 @@ 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": <ClassicStats arenaBrawlStats={stats.ArenaBrawl} /> "classic": (
<ClassicStats
stats={{
arena: stats.ArenaBrawl,
paintball: stats.Paintball
}}
/>
)
} as const } as const
const defaultOrder = Object.keys(statsComponents) const defaultOrder = Object.keys(statsComponents)

View File

@@ -4,8 +4,9 @@ import { NonNullStats } from "@/lib/schema/player"
import { cn } from "@/lib/utils" import { cn } from "@/lib/utils"
import CollapsedStats from "../../_components/CollapsedStats" import CollapsedStats from "../../_components/CollapsedStats"
import ArenaBrawlStats from "./arenabrawl" import ArenaBrawlStats from "./arenabrawl"
import PaintballStats from "./paintball"
export default function ClassicStats({ arenaBrawlStats }: { arenaBrawlStats: NonNullStats["ArenaBrawl"] }) { export default function ClassicStats({ stats }: { stats: { arena: NonNullStats["ArenaBrawl"], paintball: NonNullStats["Paintball"] } }) {
return ( return (
<AccordionItem value="classic"> <AccordionItem value="classic">
<Card className="py-0"> <Card className="py-0">
@@ -23,8 +24,9 @@ export default function ClassicStats({ arenaBrawlStats }: { arenaBrawlStats: Non
</AccordionTrigger> </AccordionTrigger>
</CardContent> </CardContent>
</Card> </Card>
<AccordionContent className="pt-4 mx-auto w-[95%]"> <AccordionContent className="pt-4 space-y-4 mx-auto w-[95%]">
<ArenaBrawlStats stats={arenaBrawlStats} /> <ArenaBrawlStats stats={stats.arena} />
<PaintballStats stats={stats.paintball} />
</AccordionContent> </AccordionContent>
</AccordionItem> </AccordionItem>
) )

View File

@@ -0,0 +1,37 @@
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 { PaintballGeneralStats } from "./stats"
export default function PaintballStats({ stats }: { stats: NonNullStats["Paintball"] }) {
if (!stats) return null
const kd = formatNumber(devide(stats.kills, stats.deaths))
return (
<GeneralStats
id="classic-paintball"
title="Paintball"
collapsedStats={[
{
title: <p>Kills</p>,
stat: <p className="text-muted-foreground">{formatNumber(stats.kills)}</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)}</p>
}
]}
>
<Separator className="my-4" />
<PaintballGeneralStats stats={stats} />
<Separator className="my-4" />
</GeneralStats>
)
}

View File

@@ -1,4 +1,6 @@
import { formatNumber } from "@/lib/formatters" import { formatNumber, formatSecondsToTime } from "@/lib/formatters"
import { devide } from "@/lib/hypixel/general"
import { NonNullStats } from "@/lib/schema/player"
import { BasicStat } from "../../_components/Stats" import { BasicStat } from "../../_components/Stats"
export function ArenaBrawlGeneralStats({ coins, keys, ws }: { coins: number, keys: number, ws: number }) { export function ArenaBrawlGeneralStats({ coins, keys, ws }: { coins: number, keys: number, ws: number }) {
@@ -10,3 +12,25 @@ export function ArenaBrawlGeneralStats({ coins, keys, ws }: { coins: number, key
</div> </div>
) )
} }
export function PaintballGeneralStats({ stats }: { stats: NonNullable<NonNullStats["Paintball"]> }) {
return (
<div className="flex">
<div className="flex-1">
<BasicStat title="Coins: " value={formatNumber(stats.coins)} className="text-mc-gold" />
<BasicStat title="Wins: " value={formatNumber(stats.wins)} />
<BasicStat title="Force Field Time: " value={`${formatSecondsToTime(stats.forcefieldTime)}s`} />
</div>
<div className="flex-1">
<BasicStat title="Kills: " value={formatNumber(stats.kills)} />
<BasicStat title="Deaths: " value={formatNumber(stats.deaths)} />
<BasicStat title="Kill/Death Ratio: " value={formatNumber(devide(stats.kills, stats.deaths))} />
</div>
<div className="flex-1">
<BasicStat title="Killstreaks: " value={formatNumber(stats.killstreaks)} />
<BasicStat title="Shots Fired: " value={formatNumber(stats.shots_fired)} />
<BasicStat title="Shot/Kill Ratio: " value={formatNumber(devide(stats.shots_fired, stats.kills))} />
</div>
</div>
)
}

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 } from "./stats/classic" import { arenaBrawlStatsSchema, paintBallStatsSchema } 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"
@@ -46,7 +46,8 @@ export const playerSchema = z.looseObject({
SpeedUHC: speedUhcStatsSchema.optional(), SpeedUHC: speedUhcStatsSchema.optional(),
SuperSmash: smashHerosStats.optional(), SuperSmash: smashHerosStats.optional(),
Battleground: warlordsStatsSchema.optional(), Battleground: warlordsStatsSchema.optional(),
Arena: arenaBrawlStatsSchema.optional() Arena: arenaBrawlStatsSchema.optional(),
Paintball: paintBallStatsSchema
}).transform(({ Walls3, MCGO, HungerGames, SuperSmash, Battleground, Arena, ...rest }) => { }).transform(({ Walls3, MCGO, HungerGames, SuperSmash, Battleground, Arena, ...rest }) => {
return { return {
MegaWalls: Walls3, MegaWalls: Walls3,

View File

@@ -19,3 +19,13 @@ export const arenaBrawlStatsSchema = z.object({
win_streaks_2v2: z.number().default(0), win_streaks_2v2: z.number().default(0),
win_streaks_4v4: z.number().default(0) win_streaks_4v4: z.number().default(0)
}) })
export const paintBallStatsSchema = z.object({
kills: z.number().default(0),
deaths: z.number().default(0),
wins: z.number().default(0),
coins: z.number().default(0),
forcefieldTime: z.number().default(0),
killstreaks: z.number().default(0),
shots_fired: z.number().default(0)
})