Added cc table

This commit is contained in:
2025-09-08 20:51:17 +02:00
parent a926b74d65
commit f5a5a989d3
4 changed files with 95 additions and 1 deletions

View File

@@ -7,6 +7,7 @@ import { devide } from "@/lib/hypixel/general"
import { NonNullStats } from "@/lib/schema/player" import { NonNullStats } from "@/lib/schema/player"
import CollapsedStats from "../../_components/CollapsedStats" import CollapsedStats from "../../_components/CollapsedStats"
import CopsAndCrimsGeneralStats from "./stats" import CopsAndCrimsGeneralStats from "./stats"
import CopsAndCrimsStatTable from "./table"
export default function CopsAndCrimsStats({ stats }: { stats: NonNullStats["CopsAndCrims"] }) { export default function CopsAndCrimsStats({ stats }: { stats: NonNullStats["CopsAndCrims"] }) {
if (!stats) return null if (!stats) return null
@@ -52,6 +53,8 @@ export default function CopsAndCrimsStats({ stats }: { stats: NonNullStats["Cops
<Separator className="my-4" /> <Separator className="my-4" />
<CopsAndCrimsGeneralStats stats={stats} wins={wins} kills={kills} assits={assists} deaths={deaths} /> <CopsAndCrimsGeneralStats stats={stats} wins={wins} kills={kills} assits={assists} deaths={deaths} />
<Separator className="my-4" /> <Separator className="my-4" />
<CopsAndCrimsStatTable stats={stats} />
<Separator className="my-4" />
</AccordionContent> </AccordionContent>
</CardContent> </CardContent>
</Card> </Card>

View File

@@ -0,0 +1,57 @@
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { formatNumber } from "@/lib/formatters"
import { getCopsAndCrimsModeName, getCopsAndCrimsModeStats } from "@/lib/hypixel/copsandcrims/general"
import { NonNullStats } from "@/lib/schema/player"
export default function CopsAndCrimsStatTable({ stats }: { stats: NonNullable<NonNullStats["CopsAndCrims"]> }) {
return (
<Table>
<CopsAndCrimsTableHeader />
<TableBody>
<CopsAndCrimsTableStat modeId="regular" stats={stats} />
<CopsAndCrimsTableStat modeId="deathmatch" stats={stats} />
<CopsAndCrimsTableStat modeId="gungame" stats={stats} />
</TableBody>
</Table>
)
}
function CopsAndCrimsTableHeader() {
const headerElements = [
"Mode",
"Kills",
"Deaths",
"KD",
"Cop Kills",
"Criminal Kills",
"Wins"
]
return (
<TableHeader>
<TableRow>
{headerElements.map((v, i) => {
return <TableHead key={i} className="font-bold">{v}</TableHead>
})}
</TableRow>
</TableHeader>
)
}
function CopsAndCrimsTableStat(
{ modeId, stats }: {
modeId: Exclude<Parameters<typeof getCopsAndCrimsModeStats>[0], ""> | "regular"
stats: NonNullable<NonNullStats["CopsAndCrims"]>
}
) {
const modeStats = getCopsAndCrimsModeStats(modeId === "regular" ? "" : modeId, stats)
const name = getCopsAndCrimsModeName(modeId === "regular" ? "" : modeId)
return (
<TableRow>
<TableCell>{name}</TableCell>
{modeStats.map((v, i) => {
return <TableCell key={i}>{formatNumber(v)}</TableCell>
})}
</TableRow>
)
}

View File

@@ -1,4 +1,10 @@
import { SCORE } from "@/data/hypixel/copsandcrims" import { MODES, SCORE } from "@/data/hypixel/copsandcrims"
import { NonNullStats } from "@/lib/schema/player"
import { devide } from "../general"
export function getCopsAndCrimsModeName(modeId: typeof MODES[number]["id"]) {
return MODES.find(m => m.id === modeId)!.name
}
export function getScoreColor(score: number) { export function getScoreColor(score: number) {
for (const scoreThreshold of SCORE.slice().reverse()) { for (const scoreThreshold of SCORE.slice().reverse()) {
@@ -7,3 +13,25 @@ export function getScoreColor(score: number) {
return SCORE.at(0)!.color return SCORE.at(0)!.color
} }
export function getCopsAndCrimsModeStats(modeId: typeof MODES[number]["id"], stats: NonNullable<NonNullStats["CopsAndCrims"]>) {
if (modeId === "") {
return [
stats["kills"],
stats["deaths"],
devide(stats["kills"], stats["deaths"]),
stats["cop_kills"],
stats["criminal_kills"],
stats["game_wins"]
]
}
return [
stats[`kills_${modeId}`],
stats[`deaths_${modeId}`],
devide(stats[`kills_${modeId}`], stats[`deaths_${modeId}`]),
stats[`cop_kills_${modeId}`],
stats[`criminal_kills_${modeId}`],
stats[`game_wins_${modeId}`]
]
}

View File

@@ -665,14 +665,20 @@ export const copsAndCrimsStatsSchema = z.looseObject({
assists: z.number().default(0), assists: z.number().default(0),
deaths: z.number().default(0), deaths: z.number().default(0),
game_wins: z.number().default(0), game_wins: z.number().default(0),
cop_kills: z.number().default(0),
criminal_kills: z.number().default(0),
kills_deathmatch: z.number().default(0), kills_deathmatch: z.number().default(0),
assists_deathmatch: z.number().default(0), assists_deathmatch: z.number().default(0),
deaths_deathmatch: z.number().default(0), deaths_deathmatch: z.number().default(0),
game_wins_deathmatch: z.number().default(0), game_wins_deathmatch: z.number().default(0),
cop_kills_deathmatch: z.number().default(0),
criminal_kills_deathmatch: z.number().default(0),
kills_gungame: z.number().default(0), kills_gungame: z.number().default(0),
assists_gungame: z.number().default(0), assists_gungame: z.number().default(0),
deaths_gungame: z.number().default(0), deaths_gungame: z.number().default(0),
game_wins_gungame: z.number().default(0), game_wins_gungame: z.number().default(0),
cop_kills_gungame: z.number().default(0),
criminal_kills_gungame: z.number().default(0),
bombs_planted: z.number().default(0), bombs_planted: z.number().default(0),
bombs_defused: z.number().default(0), bombs_defused: z.number().default(0),
shots_fired: z.number().default(0), shots_fired: z.number().default(0),